diff --git a/docs/backend_api/assets/hierarchy.js b/docs/backend_api/assets/hierarchy.js index b58e1f2fa..49262a7a7 100644 --- a/docs/backend_api/assets/hierarchy.js +++ b/docs/backend_api/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "eJylk0uOwyAMhu/iNe2UPNokV6mqCIiroBKowBlpVOXudTqzmGUiNiB+gz8b2y+IIVCC7lqUp5uAiHeHhmzwrL2AxXXzakLoYMC7mh2BgIf1A3SyaATM0bHJOJUSpi+NxqgePVmymHqlE0VlqP+n/xz//BxHmhw7+7xlH5SGw+r48CuwYbRuiOjX6NqLqORZ1EUp6laKc1OKS10IWciWl6YSsqxPt0UA38wKWSsiZcaJhY2BMpRDy4ZGq2fC7Uz+ijymdkHvwLUyExeVN+N2IJc4D4iknran8EC/ncpNlUf1YU8R1/7N44XnOq17iE2VR4xo+NDvTJTHMxf7bdOOVJflDVemoSg=" \ No newline at end of file +window.hierarchyData = "eJy1mF1v2jAUhv9Lrl2WOB9OegcVk7jZKrq7qUIhmOI1JMw2VdnEf99xUooTkeGAuSCRGnjPc16fc+z0r8PLUgrn/idxQxR4cYQCjCOEoyhEmIQJ8t3YQz7xCDyNYnjqu8iPA/VlD8ODOH5GDqfLnGaSlQVI/XWwH6tbka6pc++MvpWSOsh5ZcXCufdwjJwtz+FBlqdCUPFlnmavtFjMRMbZRs5oIfluU7JCDmZwobxI89mgUhms5DoHqeqXoCDF4k7J3tV/2CMH0tBCD+dC8jSTI5pl6biQTO6uBjmheQYLHqxYvuC0AJ/BG+RFIVxI6CIvDgnyEgKOe64PF4KfVRYE61m8s1I8yVSy7JMeh9GBvkJbpplxAke5TvBPTeVpQohG85hyQfnVNhblgs7W5WKbUzGbyd0Gbu/rHP8SgzrC+bX2sBdpYFOoZBv+KB0DY5qripNYLZxaWb30RzwtstX1xV/rGFgCRaXHH0rJ2Xxro/8+pQwooKpbFGm2WoOwFYwPLQMOaCydY0rfmIAhdT3FQek8g+prnWEs0w37UUKM6ymOWiYcjZky+r6RVpyodQziQ4do8R9WlHJWDh8nNlr2qGY20XAQBu0BOymEhCaj1kbsQbDvLCH1HqC24Dbj9ZuXUum1XYFTFQ2cBdo0Y87L6zeCo1QvrsStXYpjvay+lnz9BKWQ5uwP5XVtChsrelLYsNgAVa98VRM5Xdhxr6F2vgvVaa69jFP6e0uFfCiLJXuxVv0N1b4t4PvYU6ur7hru5CPEbbC71c3W2Q8asOM3CDNeMyktnJZ0sT5tAkc35IekamE/DPwOvildUvhBxoqXodgV2ZSKcsvtzMIGuklQQ7fDKOnIpqFmcQZ0ZnIqoGkWJDDJwm4BdYYxGCDwJniuyG1Z3HdoBB9DgzS2hPpNRxe2WBKd4r3hSeLW8In7X/gJfFJZ3jaJVhDDWo4D/cDyRNW/BEorZXHQ6uuqekOsXE0CvSSq9OY5PaRpZfdoaZp5FriNKQZvvula3OQA0yFtiOl5uLG0NwC8BK15JISjIFKGPlfEUdwxp260I1za+OEBONbfVe1O/z5DvkUX+BUdxp10Fv28cCM9bSj23XbP2+z1C8aRGkPP+/3+H2dhdLY=" \ No newline at end of file diff --git a/docs/backend_api/assets/highlight.css b/docs/backend_api/assets/highlight.css index e16c26876..5ddd97b2d 100644 --- a/docs/backend_api/assets/highlight.css +++ b/docs/backend_api/assets/highlight.css @@ -7,6 +7,18 @@ --dark-hl-2: #569CD6; --light-hl-3: #A31515; --dark-hl-3: #CE9178; + --light-hl-4: #AF00DB; + --dark-hl-4: #C586C0; + --light-hl-5: #001080; + --dark-hl-5: #9CDCFE; + --light-hl-6: #008000; + --dark-hl-6: #6A9955; + --light-hl-7: #0070C1; + --dark-hl-7: #4FC1FF; + --light-hl-8: #267F99; + --dark-hl-8: #4EC9B0; + --light-hl-9: #098658; + --dark-hl-9: #B5CEA8; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -16,6 +28,12 @@ --hl-1: var(--light-hl-1); --hl-2: var(--light-hl-2); --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); --code-background: var(--light-code-background); } } @@ -24,6 +42,12 @@ --hl-1: var(--dark-hl-1); --hl-2: var(--dark-hl-2); --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); --code-background: var(--dark-code-background); } } @@ -32,6 +56,12 @@ --hl-1: var(--light-hl-1); --hl-2: var(--light-hl-2); --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); --code-background: var(--light-code-background); } @@ -40,6 +70,12 @@ --hl-1: var(--dark-hl-1); --hl-2: var(--dark-hl-2); --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); --code-background: var(--dark-code-background); } @@ -47,4 +83,10 @@ .hl-1 { color: var(--hl-1); } .hl-2 { color: var(--hl-2); } .hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } pre, code { background: var(--code-background); } diff --git a/docs/backend_api/assets/navigation.js b/docs/backend_api/assets/navigation.js index 52ef90345..b36f95491 100644 --- a/docs/backend_api/assets/navigation.js +++ b/docs/backend_api/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJytlltLwzAYhv9Lr8XDxNPuJu5OnOhARCSkaaTBrqnJt6mI/9006yHdIf0qYVej7/vkSZZ+7OUnAv4F0TiKOWP0iOcgQHAdHUQsFVmieB6NX5oQjTUoyoDYNLHpb5MtKKTm8UImy4zrI+epYZGdrcMUFpmpvos8icaj3esl/I0uM2hXYBnVGrtC1e6udDK6/H39PWj3TQEoSxem07sRJxtU3+WipZWIl8BRzutocOUKizOOMxn3y5apsJ6WiFRUNGcpQtLmAmuumThRDrQQBOS7WazX1gmHVXbBOO9cYi5smQpraok4RVmAkIhTXefCalZMnKjizDQJ7kidcFhlF4z1XgmNOuI6Gdq4oqJ0lfzUvaZlCCU5acb8g/xssSIHrt4o20PutDbWOTt3ZCf1SB5Ib0o++LWZo0O4Vd6LtDNvELRu+LDTci7Ny7E0BN1p+fB3ctgBV3kfcmZf/CHQpuHDPtiXc6hvp+XHr9+kYfCmg7rJ8+/CGW9gvvXc4rKwQT6+ujg5G238glhwne1jTm5vZ0/TG3I3m0/J/Pl++tjSV1QJGu8bHNvN7lqnIzOR3JmkuVoJtvc/ekyZucQJ0UyJAoi51dsDrEaQ7fD/pm27RR9658i1+3N295F5fM3TYIIla7+R+fwBbqmgig==" \ No newline at end of file +window.navigationData = "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" \ No newline at end of file diff --git a/docs/backend_api/assets/search.js b/docs/backend_api/assets/search.js index a50336bf6..3773f4b38 100644 --- a/docs/backend_api/assets/search.js +++ b/docs/backend_api/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/backend_api/classes/backend_script_entrypoint._internal_.AbstractBeccaEntity.html b/docs/backend_api/classes/backend_script_entrypoint._internal_.AbstractBeccaEntity.html new file mode 100644 index 000000000..58aa36ed3 --- /dev/null +++ b/docs/backend_api/classes/backend_script_entrypoint._internal_.AbstractBeccaEntity.html @@ -0,0 +1,29 @@ +
AbstractOptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaProtected_getProtected_setProtectedbeforeOptionalopts: {}OptionalisDeleted: booleanAbstractgetProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}AbstractupdateThe class AsyncResource is designed to be extended by the embedder's async
+resources. Using this, users can easily trigger the lifetime events of their
+own resources.
The init hook will trigger when an AsyncResource is instantiated.
The following is an overview of the AsyncResource API.
import { AsyncResource, executionAsyncId } from 'node:async_hooks';
// AsyncResource() is meant to be extended. Instantiating a
// new AsyncResource() also triggers init. If triggerAsyncId is omitted then
// async_hook.executionAsyncId() is used.
const asyncResource = new AsyncResource(
type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false },
);
// Run a function in the execution context of the resource. This will
// * establish the context of the resource
// * trigger the AsyncHooks before callbacks
// * call the provided function `fn` with the supplied arguments
// * trigger the AsyncHooks after callbacks
// * restore the original execution context
asyncResource.runInAsyncScope(fn, thisArg, ...args);
// Call AsyncHooks destroy callbacks.
asyncResource.emitDestroy();
// Return the unique ID assigned to the AsyncResource instance.
asyncResource.asyncId();
// Return the trigger ID for the AsyncResource instance.
asyncResource.triggerAsyncId();
+
+
+AsyncResource() is meant to be extended. Instantiating a +new AsyncResource() also triggers init. If triggerAsyncId is omitted then +async_hook.executionAsyncId() is used.
+The type of async event.
+OptionaltriggerAsyncId: number | AsyncResourceOptionsThe ID of the execution context that created
+this async event (default: executionAsyncId()), or an
+AsyncResourceOptions object (since v9.3.0)
The unique asyncId assigned to the resource.
Call all destroy hooks. This should only ever be called once. An error will
+be thrown if it is called more than once. This must be manually called. If
+the resource is left to be collected by the GC then the destroy hooks will
+never be called.
A reference to asyncResource.
Call the provided function with the provided arguments in the execution context +of the async resource. This will establish the context, trigger the AsyncHooks +before callbacks, call the function, trigger the AsyncHooks after callbacks, and +then restore the original execution context.
+The same triggerAsyncId that is passed to the AsyncResource constructor.
StaticbindOptionalconfig: AxiosRequestConfig<any>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<any>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionalmessage: stringOptionalcode: stringOptionalconfig: InternalAxiosRequestConfig<D>Optionalrequest: anyOptionalresponse: AxiosResponse<T, D>OptionalcauseOptionalcodeOptionalconfigOptionalrequestOptionalresponseOptionalstackOptionalstatusStatic ReadonlyECONNABORTEDStatic ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyETIMEDOUTStatic OptionalprepareOptional override for formatting stack traces
+StaticstackStaticcaptureCreate .stack property on a target object
+OptionalconstructorOpt: FunctionStaticfromOptionalcode: stringOptionalconfig: InternalAxiosRequestConfig<D>Optionalrequest: anyOptionalresponse: AxiosResponse<T, D>OptionalcustomProps: objectOptionalheaders: string | AxiosHeaders | RawAxiosHeadersOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: true | AxiosHeaderParserOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalparser: RegExpOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalmatcher: AxiosHeaderMatcherOptionalheaderName: stringOptionalvalue: AxiosHeaderValueOptionalrewrite: boolean | AxiosHeaderMatcherOptionalheaders: string | AxiosHeaders | RawAxiosHeadersOptionalrewrite: booleanOptionalrewrite: boolean | AxiosHeaderMatcherOptionalrewrite: boolean | AxiosHeaderMatcherOptionalrewrite: boolean | AxiosHeaderMatcherOptionalrewrite: boolean | AxiosHeaderMatcherOptionalrewrite: boolean | AxiosHeaderMatcherOptionalrewrite: boolean | AxiosHeaderMatcherOptionalasStrings: booleanStaticaccessorStaticconcatStaticfromOptionalthing: string | AxiosHeaders | RawAxiosHeadersAttachment represent data related/attached to the note. Conceptually similar to attributes, but intended for +larger amounts of data and generally not accessible to the user.
+OptionalattachmentOptionalblobOptionalcontentoptionally added to the entity
+OptionaldateOptionaldateOptionalisOptionalisOptionalisOptionalnoteeither noteId or revisionId to which this attachment belongs
+OptionalpositionOptionaltypeOptionalutcOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleantrue if the note has string content (not binary)
+Mark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}Optionalopts: ContentOptsAttribute is an abstract concept which has two real uses - label (key - value pair) +and relation (representing named relationship between source and target note)
+Optionalrow: AttributeRowOptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisInheritable: booleanOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple +parents.
+Note that you should not rely on the branch's identity, since it can change easily with a note's move. +Always check noteId instead.
+OptionalblobOptionalbranchOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaBranch is weak when its existence should not hinder deletion of its note. +As a result, note with only weak branches should be immediately deleted. +An example is shared or bookmarked clones - they are created automatically and exist for technical reasons, +not as user-intended actions. From user perspective, they don't count as real clones and for the purpose +of deletion should not act as a clone.
+root branch will have undefined parent, all other branches have to have a parent note
+StaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalnotePosition: numberDelete a branch. If this is a last note's branch, delete the note as well.
+OptionaldeleteId: stringoptional delete identified
+OptionaltaskContext: TaskContexttrue if note has been deleted, false otherwise
+OptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications. +Used by:
+The format user is presented with is "
Optionalrow: EtapiTokenRowOptionalblobOptionaldateOptionaldateOptionaletapiOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}Trilium's main entity, which can represent text note, image, code note, file attachment etc.
+Optionalblobsize of the note content, attachment contents and revision contents in bytes
+size of the note content, attachment contents in bytes
+size of the content in bytes
+OptionaldateOptionaldateset during the deletion operation, before it is completed (removed from becca completely).
+OptionalisOptionalisnumber of note revisions for this note
+OptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryOptionaltype: null | stringOptionalname: null | stringProtected_getProtected_setAdds a new attribute to this note. The attribute is saved and returned. +See addLabel, addRelation for more specific methods.
+attribute type (label / relation)
+name of the attribute, not including the leading ~/#
+value of the attribute - text for labels, target note ID for relations; optional.
+Adds a new label to this note. The label attribute is saved and returned.
+name of the label, not including the leading #
+text value of the label; optional
+Adds a new relation to this note. The relation attribute is saved and +returned.
+name of the relation, not including the leading ~
+Some notes are eligible for conversion into an attachment of its parent, note must have these properties:
+Currently, works only for image notes.
+In the future, this functionality might get more generic and some of the requirements relaxed.
+null if note is not eligible for conversion
+(Soft) delete a note and all its descendants.
+optional delete identified
+OptionalisDeleted: booleanGives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)
+array of notePaths (each represented by array of noteIds constituting the particular note path)
+attribute type (label, relation, etc.)
+attribute name
+attribute of the given type and name. If there are more such attributes, first is returned. +Returns null if there's no such attribute belonging to this note.
+Optionalvalue: null | stringBeware that the method must not create a copy of the array, but actually returns its internal array +(for performance reasons)
+Optionaltype: string(optional) attribute type to filter
+Optionalname: string(optional) attribute name to filter
+all note's attributes, including inherited ones
+attribute type (label, relation, etc.)
+attribute name
+attribute value of given type and name or null if no such attribute exists.
+Returns a note path considered to be the "best"
+array of noteIds constituting the particular note path
+Returns a note path considered to be the "best"
+serialized note path (e.g. 'root/a1h315/js725h')
+Note content has quite special handling - it's not a separate entity, but a lazily loaded +part of Note entity with its own sync. Reasons behind this hybrid design has been:
+This is used for:
+returns only notes which are templated, does not include their subtrees +in effect returns notes which are influenced by note's non-inheritable attributes
+valid object or null if the content cannot be parsed as JSON
+Optionalname: stringlabel name to filter
+all note's labels (attributes with type label), including inherited ones
+label name
+label value if label exists, null otherwise
+label name to filter
+all note's label values, including inherited ones
+attribute belonging to this specific note (excludes inherited attributes)
+This method can be significantly faster than the getAttribute()
+Beware that the method must not create a copy of the array, but actually returns its internal array +(for performance reasons)
+(optional) attribute type to filter
+(optional) attribute name to filter
+(optional) attribute value to filter
+note's "owned" attributes - excluding inherited ones
+attribute type (label, relation, etc.)
+attribute name
+attribute value of given type and name or null if no such attribute exists.
+label name to filter
+all note's labels (attributes with type label), excluding inherited ones
+label name
+label value if label exists, null otherwise
+label name to filter
+all note's label values, excluding inherited ones
+relation name
+relation if it exists, null otherwise
+Optionalname: null | stringrelation name to filter
+all note's relations (attributes with type relation), excluding inherited ones
+relation name
+relation value if relation exists, null otherwise
+relation name
+relation if it exists, null otherwise
+Optionalname: stringrelation name to filter
+all note's relations (attributes with type relation), including inherited ones
+relation name
+relation value if relation exists, null otherwise
+JS script environment - either "frontend" or "backend"
+Returns strong (as opposed to weak) parent branches. See isWeak for details.
+includes the subtree root note as well
+label name
+Optionalvalue: stringlabel value
+true if label exists (including inherited)
+attribute name
+Optionalvalue: stringattribute value
+true if note has an attribute with given type and name (excluding inherited)
+label name
+Optionalvalue: stringlabel value
+true if label exists (excluding inherited)
+relation name
+Optionalvalue: stringrelation value
+true if relation exists (excluding inherited)
+relation name
+Optionalvalue: stringrelation value
+true if relation exists (including inherited)
+true if the note has string content (not binary)
+true if ancestorNoteId occurs in at least one of the note's paths
+boolean - true if there's no non-hidden path, note is not cloned to the visible tree
+true if this note is HTML
+true if this note is an image
+true if this note is JavaScript (code or attachment)
+true if this note is of application/json content type
+label name
+true if label exists (including inherited) and does not have "false" value.
+true if this note is the root of the note tree. Root note has "root" noteId
+Mark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputRemoves given attribute name-value pair if it exists.
+attribute type (label, relation, etc.)
+attribute name
+Optionalvalue: stringattribute value (optional)
+Remove label name-value pair, if it exists.
+label name
+Optionalvalue: stringlabel value
+Remove the relation name-value pair, if it exists.
+relation name
+Optionalvalue: stringrelation value (noteId)
+Saves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}choose by which property we detect if to update an existing attachment. +Supported values are either 'attachmentId' (default) or 'title'
+Update's given attribute's value or creates it if it doesn't exist
+attribute type (label, relation, etc.)
+attribute name
+Optionalvalue: stringattribute value (optional)
+Update's given label's value or creates it if it doesn't exist
+label name
+Optionalvalue: stringlabel value
+Update's given relation's value or creates it if it doesn't exist
+relation name
+Optionalvalue: stringrelation value (noteId)
+Based on enabled, the attribute is either set or removed.
+attribute type ('relation', 'label' etc.)
+toggle On or Off
+attribute name
+Optionalvalue: stringattribute value (optional)
+Based on enabled, label is either set or removed.
+toggle On or Off
+label name
+Optionalvalue: stringlabel value (optional)
+Based on enabled, relation is either set or removed.
+toggle On or Off
+relation name
+Optionalvalue: stringrelation value (noteId)
+Option represents a name-value pair, either directly configurable by the user or some system property.
+OptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}Revision represents a snapshot of note's title and content at some point in the past. +It's used for seamless note versioning.
+OptionalblobOptionalcontentOptionalcontentOptionaldateOptionaldateOptionaldateOptionalisOptionalisOptionalrevisionOptionalutcOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setRevisions are not soft-deletable, they are immediately hard-deleted (erased).
+OptionalisDeleted: booleanvalid object or null if the content cannot be parsed as JSON
+true if the note has string content (not binary)
+Mark the entity as (soft) deleted. It will be completely erased later.
+This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
+Optionalopts: {}Optionalmessage: stringOptionalcode: stringOptionalconfig: InternalAxiosRequestConfig<any>Optionalrequest: anyOptionalresponse: AxiosResponse<T, any>OptionalcauseOptionalcodeOptionalconfigOptionalrequestOptionalresponseOptionalstackOptionalstatusStatic ReadonlyECONNABORTEDStatic ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyERR_Static ReadonlyETIMEDOUTStatic OptionalprepareOptional override for formatting stack traces
+StaticstackStaticcaptureCreate .stack property on a target object
+OptionalconstructorOpt: FunctionStaticfromOptionalcode: stringOptionalconfig: InternalAxiosRequestConfig<D>Optionalrequest: anyOptionalresponse: AxiosResponse<T, D>OptionalcustomProps: objectIntegrates EventEmitter with AsyncResource for EventEmitters that
+require manual async tracking. Specifically, all events emitted by instances
+of events.EventEmitterAsyncResource will run within its async context.
import { EventEmitterAsyncResource, EventEmitter } from 'node:events';
import { notStrictEqual, strictEqual } from 'node:assert';
import { executionAsyncId, triggerAsyncId } from 'node:async_hooks';
// Async tracking tooling will identify this as 'Q'.
const ee1 = new EventEmitterAsyncResource({ name: 'Q' });
// 'foo' listeners will run in the EventEmitters async context.
ee1.on('foo', () => {
strictEqual(executionAsyncId(), ee1.asyncId);
strictEqual(triggerAsyncId(), ee1.triggerAsyncId);
});
const ee2 = new EventEmitter();
// 'foo' listeners on ordinary EventEmitters that do not track async
// context, however, run in the same async context as the emit().
ee2.on('foo', () => {
notStrictEqual(executionAsyncId(), ee2.asyncId);
notStrictEqual(triggerAsyncId(), ee2.triggerAsyncId);
});
Promise.resolve().then(() => {
ee1.emit('foo');
ee2.emit('foo');
});
+
+
+The EventEmitterAsyncResource class has the same methods and takes the
+same options as EventEmitter and AsyncResource themselves.
Optionaloptions: EventEmitterAsyncResourceOptionsOnly optional in child class.
+ReadonlyasyncThe unique asyncId assigned to the resource.
ReadonlyasyncThe returned AsyncResource object has an additional eventEmitter property
+that provides a reference to this EventEmitterAsyncResource.
ReadonlytriggerThe same triggerAsyncId that is passed to the AsyncResource constructor.
+StaticcaptureValue: boolean
+Change the default captureRejections option on all new EventEmitter objects.
Static ReadonlycaptureValue: Symbol.for('nodejs.rejection')
See how to write a custom rejection handler.
StaticdefaultBy default, a maximum of 10 listeners can be registered for any single
+event. This limit can be changed for individual EventEmitter instances
+using the emitter.setMaxListeners(n) method. To change the default
+for allEventEmitter instances, the events.defaultMaxListeners property
+can be used. If this value is not a positive number, a RangeError is thrown.
Take caution when setting the events.defaultMaxListeners because the
+change affects all EventEmitter instances, including those created before
+the change is made. However, calling emitter.setMaxListeners(n) still has
+precedence over events.defaultMaxListeners.
This is not a hard limit. The EventEmitter instance will allow
+more listeners to be added but will output a trace warning to stderr indicating
+that a "possible EventEmitter memory leak" has been detected. For any single
+EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to
+temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+
+
+The --trace-warnings command-line flag can be used to display the
+stack trace for such warnings.
The emitted warning can be inspected with process.on('warning') and will
+have the additional emitter, type, and count properties, referring to
+the event emitter instance, the event's name and the number of attached
+listeners, respectively.
+Its name property is set to 'MaxListenersExceededWarning'.
Static ReadonlyerrorThis symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.
Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no
+regular 'error' listener is installed.
Optional[captureSynchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
+to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+
+
+Call all destroy hooks. This should only ever be called once. An error will
+be thrown if it is called more than once. This must be manually called. If
+the resource is left to be collected by the GC then the destroy hooks will
+never be called.
Returns an array listing the events for which the emitter has registered
+listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+
+
+Returns the current max listener value for the EventEmitter which is either
+set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns the number of listeners listening for the event named eventName.
+If listener is provided, it will return how many times the listener is found
+in the list of the listeners of the event.
The name of the event being listened for
+Optionallistener: FunctionThe event handler function
+Returns a copy of the array of listeners for the event named eventName.
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+
+
+Adds the listener function to the end of the listeners array for the event
+named eventName. No checks are made to see if the listener has already
+been added. Multiple calls passing the same combination of eventName and
+listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+The name of the event.
+The callback function
+Adds a one-time listener function for the event named eventName. The
+next time eventName is triggered, this listener is removed and then invoked.
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+The name of the event.
+The callback function
+Adds the listener function to the beginning of the listeners array for the
+event named eventName. No checks are made to see if the listener has
+already been added. Multiple calls passing the same combination of eventName
+and listener will result in the listener being added, and called, multiple times.
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
The name of the event.
+The callback function
+Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this
+listener is removed, and then invoked.
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
The name of the event.
+The callback function
+Returns a copy of the array of listeners for the event named eventName,
+including any wrappers (such as those created by .once()).
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+
+
+Removes all listeners, or those of the specified eventName.
It is bad practice to remove listeners added elsewhere in the code,
+particularly when the EventEmitter instance was created by some other
+component or module (e.g. sockets or file streams).
Returns a reference to the EventEmitter, so that calls can be chained.
OptionaleventName: string | symbolRemoves the specified listener from the listener array for the event named eventName.
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+
+
+removeListener() will remove, at most, one instance of a listener from the
+listener array. If any single listener has been added multiple times to the
+listener array for the specified eventName, then removeListener() must be
+called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the
+time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution
+will not remove them fromemit() in progress. Subsequent events behave as expected.
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+
+
+Because listeners are managed using an internal array, calling this will
+change the position indices of any listener registered after the listener
+being removed. This will not impact the order in which listeners are called,
+but it means that any copies of the listener array as returned by
+the emitter.listeners() method will need to be recreated.
When a single function has been added as a handler multiple times for a single
+event (as in the example below), removeListener() will remove the most
+recently added instance. In the example the once('ping') listener is removed:
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default EventEmitters will print a warning if more than 10 listeners are
+added for a particular event. This is a useful default that helps finding
+memory leaks. The emitter.setMaxListeners() method allows the limit to be
+modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.
Returns a reference to the EventEmitter, so that calls can be chained.
StaticaddExperimentalListens once to the abort event on the provided signal.
Listening to the abort event on abort signals is unsafe and may
+lead to resource leaks since another third party with the signal can
+call e.stopImmediatePropagation(). Unfortunately Node.js cannot change
+this since it would violate the web standard. Additionally, the original
+API makes it easy to forget to remove listeners.
This API allows safely using AbortSignals in Node.js APIs by solving these
+two issues by listening to the event such that stopImmediatePropagation does
+not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+
+
+Disposable that removes the abort listener.
StaticgetReturns a copy of the array of listeners for the event named eventName.
For EventEmitters this behaves exactly the same as calling .listeners on
+the emitter.
For EventTargets this is the only way to get the event listeners for the
+event target. This is useful for debugging and diagnostic purposes.
import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+
+
+StaticgetReturns the currently set max amount of listeners.
+For EventEmitters this behaves exactly the same as calling .getMaxListeners on
+the emitter.
For EventTargets this is the only way to get the max event listeners for the
+event target. If the number of event handlers on a single EventTarget exceeds
+the max set, the EventTarget will print a warning.
import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+
+
+StaticlistenerA class method that returns the number of listeners for the given eventName registered on the given emitter.
import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+
+
+The emitter to query
+The event name
+Staticonimport { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
StaticonceCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsStaticsetimport { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
+
+Optionaln: numberA non-negative number. The maximum number of listeners per EventTarget event.
Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, n is set as the default max for all newly created {EventTarget} and {EventEmitter}
+objects.
The EventEmitter class is defined and exposed by the node:events module:
import { EventEmitter } from 'node:events';
+
+
+All EventEmitters emit the event 'newListener' when new listeners are
+added and 'removeListener' when existing listeners are removed.
It supports the following option:
+Optionaloptions: EventEmitterOptionsStaticcaptureValue: boolean
+Change the default captureRejections option on all new EventEmitter objects.
Static ReadonlycaptureValue: Symbol.for('nodejs.rejection')
See how to write a custom rejection handler.
StaticdefaultBy default, a maximum of 10 listeners can be registered for any single
+event. This limit can be changed for individual EventEmitter instances
+using the emitter.setMaxListeners(n) method. To change the default
+for allEventEmitter instances, the events.defaultMaxListeners property
+can be used. If this value is not a positive number, a RangeError is thrown.
Take caution when setting the events.defaultMaxListeners because the
+change affects all EventEmitter instances, including those created before
+the change is made. However, calling emitter.setMaxListeners(n) still has
+precedence over events.defaultMaxListeners.
This is not a hard limit. The EventEmitter instance will allow
+more listeners to be added but will output a trace warning to stderr indicating
+that a "possible EventEmitter memory leak" has been detected. For any single
+EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to
+temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+
+
+The --trace-warnings command-line flag can be used to display the
+stack trace for such warnings.
The emitted warning can be inspected with process.on('warning') and will
+have the additional emitter, type, and count properties, referring to
+the event emitter instance, the event's name and the number of attached
+listeners, respectively.
+Its name property is set to 'MaxListenersExceededWarning'.
Static ReadonlyerrorThis symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.
Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no
+regular 'error' listener is installed.
Optional[captureSynchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
+to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+
+
+Returns an array listing the events for which the emitter has registered
+listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+
+
+Returns the current max listener value for the EventEmitter which is either
+set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns the number of listeners listening for the event named eventName.
+If listener is provided, it will return how many times the listener is found
+in the list of the listeners of the event.
Adds the listener function to the end of the listeners array for the event
+named eventName. No checks are made to see if the listener has already
+been added. Multiple calls passing the same combination of eventName and
+listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+Adds a one-time listener function for the event named eventName. The
+next time eventName is triggered, this listener is removed and then invoked.
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+Adds the listener function to the beginning of the listeners array for the
+event named eventName. No checks are made to see if the listener has
+already been added. Multiple calls passing the same combination of eventName
+and listener will result in the listener being added, and called, multiple times.
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this
+listener is removed, and then invoked.
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
Returns a copy of the array of listeners for the event named eventName,
+including any wrappers (such as those created by .once()).
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+
+
+Removes all listeners, or those of the specified eventName.
It is bad practice to remove listeners added elsewhere in the code,
+particularly when the EventEmitter instance was created by some other
+component or module (e.g. sockets or file streams).
Returns a reference to the EventEmitter, so that calls can be chained.
Removes the specified listener from the listener array for the event named eventName.
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+
+
+removeListener() will remove, at most, one instance of a listener from the
+listener array. If any single listener has been added multiple times to the
+listener array for the specified eventName, then removeListener() must be
+called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the
+time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution
+will not remove them fromemit() in progress. Subsequent events behave as expected.
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+
+
+Because listeners are managed using an internal array, calling this will
+change the position indices of any listener registered after the listener
+being removed. This will not impact the order in which listeners are called,
+but it means that any copies of the listener array as returned by
+the emitter.listeners() method will need to be recreated.
When a single function has been added as a handler multiple times for a single
+event (as in the example below), removeListener() will remove the most
+recently added instance. In the example the once('ping') listener is removed:
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default EventEmitters will print a warning if more than 10 listeners are
+added for a particular event. This is a useful default that helps finding
+memory leaks. The emitter.setMaxListeners() method allows the limit to be
+modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.
Returns a reference to the EventEmitter, so that calls can be chained.
StaticaddExperimentalListens once to the abort event on the provided signal.
Listening to the abort event on abort signals is unsafe and may
+lead to resource leaks since another third party with the signal can
+call e.stopImmediatePropagation(). Unfortunately Node.js cannot change
+this since it would violate the web standard. Additionally, the original
+API makes it easy to forget to remove listeners.
This API allows safely using AbortSignals in Node.js APIs by solving these
+two issues by listening to the event such that stopImmediatePropagation does
+not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+
+
+Disposable that removes the abort listener.
StaticgetReturns a copy of the array of listeners for the event named eventName.
For EventEmitters this behaves exactly the same as calling .listeners on
+the emitter.
For EventTargets this is the only way to get the event listeners for the
+event target. This is useful for debugging and diagnostic purposes.
import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+
+
+StaticgetReturns the currently set max amount of listeners.
+For EventEmitters this behaves exactly the same as calling .getMaxListeners on
+the emitter.
For EventTargets this is the only way to get the max event listeners for the
+event target. If the number of event handlers on a single EventTarget exceeds
+the max set, the EventTarget will print a warning.
import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+
+
+StaticlistenerA class method that returns the number of listeners for the given eventName registered on the given emitter.
import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+
+
+The emitter to query
+The event name
+Staticonimport { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
StaticonceCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsStaticsetimport { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
+
+Optionaln: numberA non-negative number. The maximum number of listeners per EventTarget event.
Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, n is set as the default max for all newly created {EventTarget} and {EventEmitter}
+objects.
Optionalresult: string | Record<string, undefined | string>StaticgetBecca is a backend cache of all notes, branches, and attributes. +There's a similar frontend cache Froca, and share cache Shaca.
+Points from attribute type-name to list of attributes
+Should be called when the set of all non-skeleton notes changes (added/removed)
+Optionaloptions: BuilderOptionsThe EventEmitter class is defined and exposed by the node:events module:
import { EventEmitter } from 'node:events';
+
+
+All EventEmitters emit the event 'newListener' when new listeners are
+added and 'removeListener' when existing listeners are removed.
It supports the following option:
+Optionaloptions: ParserOptionsStaticcaptureValue: boolean
+Change the default captureRejections option on all new EventEmitter objects.
Static ReadonlycaptureValue: Symbol.for('nodejs.rejection')
See how to write a custom rejection handler.
StaticdefaultBy default, a maximum of 10 listeners can be registered for any single
+event. This limit can be changed for individual EventEmitter instances
+using the emitter.setMaxListeners(n) method. To change the default
+for allEventEmitter instances, the events.defaultMaxListeners property
+can be used. If this value is not a positive number, a RangeError is thrown.
Take caution when setting the events.defaultMaxListeners because the
+change affects all EventEmitter instances, including those created before
+the change is made. However, calling emitter.setMaxListeners(n) still has
+precedence over events.defaultMaxListeners.
This is not a hard limit. The EventEmitter instance will allow
+more listeners to be added but will output a trace warning to stderr indicating
+that a "possible EventEmitter memory leak" has been detected. For any single
+EventEmitter, the emitter.getMaxListeners() and emitter.setMaxListeners() methods can be used to
+temporarily avoid this warning:
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.setMaxListeners(emitter.getMaxListeners() + 1);
emitter.once('event', () => {
// do stuff
emitter.setMaxListeners(Math.max(emitter.getMaxListeners() - 1, 0));
});
+
+
+The --trace-warnings command-line flag can be used to display the
+stack trace for such warnings.
The emitted warning can be inspected with process.on('warning') and will
+have the additional emitter, type, and count properties, referring to
+the event emitter instance, the event's name and the number of attached
+listeners, respectively.
+Its name property is set to 'MaxListenersExceededWarning'.
Static ReadonlyerrorThis symbol shall be used to install a listener for only monitoring 'error' events. Listeners installed using this symbol are called before the regular 'error' listeners are called.
Installing a listener using this symbol does not change the behavior once an 'error' event is emitted. Therefore, the process will still crash if no
+regular 'error' listener is installed.
Optional[captureSynchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
+to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+
+
+Returns an array listing the events for which the emitter has registered
+listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+
+
+Returns the current max listener value for the EventEmitter which is either
+set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns the number of listeners listening for the event named eventName.
+If listener is provided, it will return how many times the listener is found
+in the list of the listeners of the event.
The name of the event being listened for
+Optionallistener: FunctionThe event handler function
+Returns a copy of the array of listeners for the event named eventName.
server.on('connection', (stream) => {
console.log('someone connected!');
});
console.log(util.inspect(server.listeners('connection')));
// Prints: [ [Function] ]
+
+
+Adds the listener function to the end of the listeners array for the event
+named eventName. No checks are made to see if the listener has already
+been added. Multiple calls passing the same combination of eventName and
+listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+The name of the event.
+The callback function
+Adds a one-time listener function for the event named eventName. The
+next time eventName is triggered, this listener is removed and then invoked.
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+The name of the event.
+The callback function
+Optionalcb: (error: null | Error, result: any) => voidAdds the listener function to the beginning of the listeners array for the
+event named eventName. No checks are made to see if the listener has
+already been added. Multiple calls passing the same combination of eventName
+and listener will result in the listener being added, and called, multiple times.
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
The name of the event.
+The callback function
+Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this
+listener is removed, and then invoked.
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
The name of the event.
+The callback function
+Returns a copy of the array of listeners for the event named eventName,
+including any wrappers (such as those created by .once()).
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+
+
+Removes all listeners, or those of the specified eventName.
It is bad practice to remove listeners added elsewhere in the code,
+particularly when the EventEmitter instance was created by some other
+component or module (e.g. sockets or file streams).
Returns a reference to the EventEmitter, so that calls can be chained.
OptionaleventName: string | symbolRemoves the specified listener from the listener array for the event named eventName.
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+
+
+removeListener() will remove, at most, one instance of a listener from the
+listener array. If any single listener has been added multiple times to the
+listener array for the specified eventName, then removeListener() must be
+called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the
+time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution
+will not remove them fromemit() in progress. Subsequent events behave as expected.
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+
+
+Because listeners are managed using an internal array, calling this will
+change the position indices of any listener registered after the listener
+being removed. This will not impact the order in which listeners are called,
+but it means that any copies of the listener array as returned by
+the emitter.listeners() method will need to be recreated.
When a single function has been added as a handler multiple times for a single
+event (as in the example below), removeListener() will remove the most
+recently added instance. In the example the once('ping') listener is removed:
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default EventEmitters will print a warning if more than 10 listeners are
+added for a particular event. This is a useful default that helps finding
+memory leaks. The emitter.setMaxListeners() method allows the limit to be
+modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.
Returns a reference to the EventEmitter, so that calls can be chained.
StaticaddExperimentalListens once to the abort event on the provided signal.
Listening to the abort event on abort signals is unsafe and may
+lead to resource leaks since another third party with the signal can
+call e.stopImmediatePropagation(). Unfortunately Node.js cannot change
+this since it would violate the web standard. Additionally, the original
+API makes it easy to forget to remove listeners.
This API allows safely using AbortSignals in Node.js APIs by solving these
+two issues by listening to the event such that stopImmediatePropagation does
+not prevent the listener from running.
Returns a disposable so that it may be unsubscribed from more easily.
+import { addAbortListener } from 'node:events';
function example(signal) {
let disposable;
try {
signal.addEventListener('abort', (e) => e.stopImmediatePropagation());
disposable = addAbortListener(signal, (e) => {
// Do something when signal is aborted.
});
} finally {
disposable?.[Symbol.dispose]();
}
}
+
+
+Disposable that removes the abort listener.
StaticgetReturns a copy of the array of listeners for the event named eventName.
For EventEmitters this behaves exactly the same as calling .listeners on
+the emitter.
For EventTargets this is the only way to get the event listeners for the
+event target. This is useful for debugging and diagnostic purposes.
import { getEventListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
const listener = () => console.log('Events are fun');
ee.on('foo', listener);
console.log(getEventListeners(ee, 'foo')); // [ [Function: listener] ]
}
{
const et = new EventTarget();
const listener = () => console.log('Events are fun');
et.addEventListener('foo', listener);
console.log(getEventListeners(et, 'foo')); // [ [Function: listener] ]
}
+
+
+StaticgetReturns the currently set max amount of listeners.
+For EventEmitters this behaves exactly the same as calling .getMaxListeners on
+the emitter.
For EventTargets this is the only way to get the max event listeners for the
+event target. If the number of event handlers on a single EventTarget exceeds
+the max set, the EventTarget will print a warning.
import { getMaxListeners, setMaxListeners, EventEmitter } from 'node:events';
{
const ee = new EventEmitter();
console.log(getMaxListeners(ee)); // 10
setMaxListeners(11, ee);
console.log(getMaxListeners(ee)); // 11
}
{
const et = new EventTarget();
console.log(getMaxListeners(et)); // 10
setMaxListeners(11, et);
console.log(getMaxListeners(et)); // 11
}
+
+
+StaticlistenerA class method that returns the number of listeners for the given eventName registered on the given emitter.
import { EventEmitter, listenerCount } from 'node:events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {});
myEmitter.on('event', () => {});
console.log(listenerCount(myEmitter, 'event'));
// Prints: 2
+
+
+The emitter to query
+The event name
+Staticonimport { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo')) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
+
+
+Returns an AsyncIterator that iterates eventName events. It will throw
+if the EventEmitter emits 'error'. It removes all listeners when
+exiting the loop. The value returned by each iteration is an array
+composed of the emitted event arguments.
An AbortSignal can be used to cancel waiting on events:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ac = new AbortController();
(async () => {
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
});
for await (const event of on(ee, 'foo', { signal: ac.signal })) {
// The execution of this inner block is synchronous and it
// processes one event at a time (even with await). Do not use
// if concurrent execution is required.
console.log(event); // prints ['bar'] [42]
}
// Unreachable here
})();
process.nextTick(() => ac.abort());
+
+
+Use the close option to specify an array of event names that will end the iteration:
import { on, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
// Emit later on
process.nextTick(() => {
ee.emit('foo', 'bar');
ee.emit('foo', 42);
ee.emit('close');
});
for await (const event of on(ee, 'foo', { close: ['close'] })) {
console.log(event); // prints ['bar'] [42]
}
// the loop will exit after 'close' is emitted
console.log('done'); // prints 'done'
+
+
+Optionaloptions: StaticEventEmitterIteratorOptionsAn AsyncIterator that iterates eventName events emitted by the emitter
StaticonceCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsCreates a Promise that is fulfilled when the EventEmitter emits the given
+event or that is rejected if the EventEmitter emits 'error' while waiting.
+The Promise will resolve with an array of all the arguments emitted to the
+given event.
This method is intentionally generic and works with the web platform EventTarget interface, which has no special'error' event
+semantics and does not listen to the 'error' event.
import { once, EventEmitter } from 'node:events';
import process from 'node:process';
const ee = new EventEmitter();
process.nextTick(() => {
ee.emit('myevent', 42);
});
const [value] = await once(ee, 'myevent');
console.log(value);
const err = new Error('kaboom');
process.nextTick(() => {
ee.emit('error', err);
});
try {
await once(ee, 'myevent');
} catch (err) {
console.error('error happened', err);
}
+
+
+The special handling of the 'error' event is only used when events.once() is used to wait for another event. If events.once() is used to wait for the
+'error' event itself, then it is treated as any other kind of event without
+special handling:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
once(ee, 'error')
.then(([err]) => console.log('ok', err.message))
.catch((err) => console.error('error', err.message));
ee.emit('error', new Error('boom'));
// Prints: ok boom
+
+
+An AbortSignal can be used to cancel waiting for the event:
import { EventEmitter, once } from 'node:events';
const ee = new EventEmitter();
const ac = new AbortController();
async function foo(emitter, event, signal) {
try {
await once(emitter, event, { signal });
console.log('event emitted!');
} catch (error) {
if (error.name === 'AbortError') {
console.error('Waiting for the event was canceled!');
} else {
console.error('There was an error', error.message);
}
}
}
foo(ee, 'foo', ac.signal);
ac.abort(); // Abort waiting for the event
ee.emit('foo'); // Prints: Waiting for the event was canceled!
+
+
+Optionaloptions: StaticEventEmitterOptionsStaticsetimport { setMaxListeners, EventEmitter } from 'node:events';
const target = new EventTarget();
const emitter = new EventEmitter();
setMaxListeners(5, target, emitter);
+
+
+Optionaln: numberA non-negative number. The maximum number of listeners per EventTarget event.
Zero or more {EventTarget} or {EventEmitter} instances. If none are specified, n is set as the default max for all newly created {EventTarget} and {EventEmitter}
+objects.
AbstractBase class for all backend entities.
-OptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaProtected_getProtected_setProtectedbeforeOptionalopts: {}OptionalisDeleted: booleanAbstractgetProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}AbstractupdateAttachment represent data related/attached to the note. Conceptually similar to attributes, but intended for -larger amounts of data and generally not accessible to the user.
-OptionalattachmentOptionalblobOptionalcontentoptionally added to the entity
-OptionaldateOptionaldateOptionalisOptionalisOptionalisOptionalnoteeither noteId or revisionId to which this attachment belongs
-OptionalpositionOptionaltypeOptionalutcOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleantrue if the note has string content (not binary)
-Mark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Optionalopts: ContentOptsAttribute is an abstract concept which has two real uses - label (key - value pair) -and relation (representing named relationship between source and target note)
-Optionalrow: AttributeRowOptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisInheritable: booleanOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Base class for all backend entities.
-OptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setProtectedbeforeOptionalopts: {}OptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Branch represents a relationship between a child note and its parent note. Trilium allows a note to have multiple -parents.
-Note that you should not rely on the branch's identity, since it can change easily with a note's move. -Always check noteId instead.
-OptionalblobOptionalbranchOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaBranch is weak when its existence should not hinder deletion of its note. -As a result, note with only weak branches should be immediately deleted. -An example is shared or bookmarked clones - they are created automatically and exist for technical reasons, -not as user-intended actions. From user perspective, they don't count as real clones and for the purpose -of deletion should not act as a clone.
-root branch will have undefined parent, all other branches have to have a parent note
-StaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalnotePosition: numberDelete a branch. If this is a last note's branch, delete the note as well.
-OptionaldeleteId: stringoptional delete identified
-OptionaltaskContext: TaskContexttrue if note has been deleted, false otherwise
-OptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}EtapiToken is an entity representing token used to authenticate against Trilium REST API from client applications. -Used by:
-The format user is presented with is "
Optionalrow: EtapiTokenRowOptionalblobOptionaldateOptionaldateOptionaletapiOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Trilium's main entity, which can represent text note, image, code note, file attachment etc.
-Optionalblobsize of the note content, attachment contents and revision contents in bytes
-size of the note content, attachment contents in bytes
-size of the content in bytes
-OptionaldateOptionaldateset during the deletion operation, before it is completed (removed from becca completely).
-OptionalisOptionalisnumber of note revisions for this note
-OptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryOptionaltype: null | stringOptionalname: null | stringProtected_getProtected_setAdds a new attribute to this note. The attribute is saved and returned. -See addLabel, addRelation for more specific methods.
-attribute type (label / relation)
-name of the attribute, not including the leading ~/#
-value of the attribute - text for labels, target note ID for relations; optional.
-Adds a new label to this note. The label attribute is saved and returned.
-name of the label, not including the leading #
-text value of the label; optional
-Adds a new relation to this note. The relation attribute is saved and -returned.
-name of the relation, not including the leading ~
-Some notes are eligible for conversion into an attachment of its parent, note must have these properties:
-Currently, works only for image notes.
-In the future, this functionality might get more generic and some of the requirements relaxed.
-null if note is not eligible for conversion
-(Soft) delete a note and all its descendants.
-optional delete identified
-OptionalisDeleted: booleanGives all possible note paths leading to this note. Paths containing search note are ignored (could form cycles)
-array of notePaths (each represented by array of noteIds constituting the particular note path)
-attribute type (label, relation, etc.)
-attribute name
-attribute of the given type and name. If there are more such attributes, first is returned. -Returns null if there's no such attribute belonging to this note.
-Beware that the method must not create a copy of the array, but actually returns its internal array -(for performance reasons)
-Optionaltype: string(optional) attribute type to filter
-Optionalname: string(optional) attribute name to filter
-all note's attributes, including inherited ones
-attribute type (label, relation, etc.)
-attribute name
-attribute value of given type and name or null if no such attribute exists.
-Returns a note path considered to be the "best"
-array of noteIds constituting the particular note path
-Returns a note path considered to be the "best"
-serialized note path (e.g. 'root/a1h315/js725h')
-Note content has quite special handling - it's not a separate entity, but a lazily loaded -part of Note entity with its own sync. Reasons behind this hybrid design has been:
-This is used for:
-returns only notes which are templated, does not include their subtrees -in effect returns notes which are influenced by note's non-inheritable attributes
-valid object or null if the content cannot be parsed as JSON
-Optionalname: stringlabel name to filter
-all note's labels (attributes with type label), including inherited ones
-label name
-label value if label exists, null otherwise
-label name to filter
-all note's label values, including inherited ones
-attribute belonging to this specific note (excludes inherited attributes)
-This method can be significantly faster than the getAttribute()
-Beware that the method must not create a copy of the array, but actually returns its internal array -(for performance reasons)
-(optional) attribute type to filter
-(optional) attribute name to filter
-(optional) attribute value to filter
-note's "owned" attributes - excluding inherited ones
-attribute type (label, relation, etc.)
-attribute name
-attribute value of given type and name or null if no such attribute exists.
-label name to filter
-all note's labels (attributes with type label), excluding inherited ones
-label name
-label value if label exists, null otherwise
-label name to filter
-all note's label values, excluding inherited ones
-Optionalname: null | stringrelation name to filter
-all note's relations (attributes with type relation), excluding inherited ones
-relation name
-relation value if relation exists, null otherwise
-Optionalname: stringrelation name to filter
-all note's relations (attributes with type relation), including inherited ones
-relation name
-relation value if relation exists, null otherwise
-JS script environment - either "frontend" or "backend"
-Returns strong (as opposed to weak) parent branches. See isWeak for details.
-includes the subtree root note as well
-label name
-Optionalvalue: stringlabel value
-true if label exists (including inherited)
-attribute name
-Optionalvalue: stringattribute value
-true if note has an attribute with given type and name (excluding inherited)
-label name
-Optionalvalue: stringlabel value
-true if label exists (excluding inherited)
-relation name
-Optionalvalue: stringrelation value
-true if relation exists (excluding inherited)
-relation name
-Optionalvalue: stringrelation value
-true if relation exists (including inherited)
-true if the note has string content (not binary)
-true if ancestorNoteId occurs in at least one of the note's paths
-boolean - true if there's no non-hidden path, note is not cloned to the visible tree
-true if this note is HTML
-true if this note is an image
-true if this note is JavaScript (code or attachment)
-true if this note is of application/json content type
-label name
-true if label exists (including inherited) and does not have "false" value.
-true if this note is the root of the note tree. Root note has "root" noteId
-Mark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputRemoves given attribute name-value pair if it exists.
-attribute type (label, relation, etc.)
-attribute name
-Optionalvalue: stringattribute value (optional)
-Remove label name-value pair, if it exists.
-label name
-Optionalvalue: stringlabel value
-Remove the relation name-value pair, if it exists.
-relation name
-Optionalvalue: stringrelation value (noteId)
-Saves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}choose by which property we detect if to update an existing attachment. -Supported values are either 'attachmentId' (default) or 'title'
-Update's given attribute's value or creates it if it doesn't exist
-attribute type (label, relation, etc.)
-attribute name
-Optionalvalue: stringattribute value (optional)
-Update's given label's value or creates it if it doesn't exist
-label name
-Optionalvalue: stringlabel value
-Update's given relation's value or creates it if it doesn't exist
-relation name
-Optionalvalue: stringrelation value (noteId)
-Based on enabled, the attribute is either set or removed.
-attribute type ('relation', 'label' etc.)
-toggle On or Off
-attribute name
-Optionalvalue: stringattribute value (optional)
-Based on enabled, label is either set or removed.
-toggle On or Off
-label name
-Optionalvalue: stringlabel value (optional)
-Based on enabled, relation is either set or removed.
-toggle On or Off
-relation name
-Optionalvalue: stringrelation value (noteId)
-Option represents a name-value pair, either directly configurable by the user or some system property.
-OptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setOptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}RecentNote represents recently visited note.
-OptionalblobOptionaldateOptionaldateOptionalisOptionalisOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setProtectedbeforeOptionalopts: {}OptionalisDeleted: booleanProtectedgetMark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Revision represents a snapshot of note's title and content at some point in the past. -It's used for seamless note versioning.
-OptionalblobOptionalcontentOptionalcontentOptionaldateOptionaldateOptionaldateOptionalisOptionalisOptionalrevisionOptionalutcOptionalutcProtectedbeccaStaticentityStatichashedStaticprimaryProtected_getProtected_setRevisions are not soft-deletable, they are immediately hard-deleted (erased).
-OptionalisDeleted: booleanvalid object or null if the content cannot be parsed as JSON
-true if the note has string content (not binary)
-Mark the entity as (soft) deleted. It will be completely erased later.
-This is a low-level method, for notes and branches use note.deleteNote() and 'branch.deleteBranch()` instead.
ProtectedputSaves entity - executes SQL, but doesn't commit the transaction on its own
-Optionalopts: {}Optionaloptions: ParserOptionsThis object contains "at your risk" and "no BC guarantees" objects for advanced use cases.
+Axios library for HTTP requests. See https://axios-http.com for documentation
+cheerio library for HTML parsing and manipulation. See https://cheerio.js.org for documentation
+Note where the script is currently executing. This comes into play when your script is spread in multiple code +notes, the script starts in "startNote", but then through function calls may jump into another note (currentNote). +A similar concept in C would be FILE +Don't mix this up with the concept of active note.
+day.js library for date manipulation. See https://day.js.org for documentation
+OptionaloriginEntity whose event triggered this execution
+sql
+OptionalstartNote where the script started executing (entrypoint). +As an analogy, in C this would be the file which contains the main() function of the current process.
+xml2js library for XML parsing. See https://github.com/Leonidas-from-XIV/node-xml2js for documentation
+If the backupName is e.g. "now", then the backup will be written to "backup-now.db" file
+resolves once the backup is finished
+Create data note - data in this context means object serializable to JSON. Created note will be of type 'code' and +JSON MIME type. See also createNewNote() for more options.
+object contains newly created entities note and branch
+create new note under this parent
+Optionalattributes?: AttributeRow[]Optionaljson?: booleanshould the note be JSON
+object contains newly created entities note and branch
+Creates a new launcher to the launchbar. If the launcher (id) already exists, it will be updated.
+name of the boxicon to be used (e.g. "bx-time")
+id of the launcher, only alphanumeric at least 6 characters long
+if true, will be created in the "Visible launchers", otherwise in "Available launchers"
+will activate the target note/script upon pressing, e.g. "ctrl+e"
+for type "script"
+for type "note"
+one of
+OptionalwidgetNoteId?: stringfor type "customWidget"
+Create text note. See also createNewNote() for more options.
+If there's a branch between note and parent note, remove it. Otherwise, do nothing.
+If there's no branch between note and parent note, create one. Otherwise, do nothing. Returns the new or existing branch.
+if branch is created between note and parent note, set this prefix
+escaped string
+Instance name identifies particular Trilium instance. It can be useful for scripts +if some action needs to happen on only one specific instance.
+Retrieves notes with given label name & value
+attribute name
+Optionalvalue: stringattribute value
+Retrieves first note with given label name & value
+attribute name
+Optionalvalue: stringattribute value
+Returns root note of the calendar.
+Log given message to trilium logs and log pane in UI
+Return randomly generated string of given length. This random string generation is NOT cryptographically secure.
+of the string
+random string
+Executes given anonymous function on the frontend(s). +Internally, this serializes the anonymous function into string and sends it to frontend(s) via WebSocket. +Note that there can be multiple connected frontend instances (e.g. in different tabs). In such case, all +instances execute the given function.
+script to be executed on the frontend
+list of parameters to the anonymous function to be sent to frontend
+no return value is provided.
+Sync process can make data intermittently inconsistent. Scripts which require strong data consistency +can use this function to wait for a possible sync process to finish and prevent new sync process from starting +while it is running.
+Because this is an async process, the inner callback doesn't have automatic transaction handling, so in case +you need to make some DB changes, you need to surround your call with api.transactional(...)
+function to be executed while sync process is not running
+resolves once the callback is finished (callback is awaited)
+This is a powerful search method - you can search by attributes and their values, e.g.: +"#dateModified =* MONTH AND #log". See https://triliumnext.github.io/Docs/Wiki/search.html for full documentation for all options
+This is a powerful search method - you can search by attributes and their values, e.g.: +"#dateModified =* MONTH AND #log". See https://triliumnext.github.io/Docs/Wiki/search.html for full documentation for all options
+This method finds note by its noteId and prefix and either sets it to the given parentNoteId +or removes the branch (if parentNoteId is not given).
+This method looks similar to toggleNoteInParent() but differs because we're looking up branch by prefix.
+Sort child notes of a given note.
+OptionalfoldersFirst?: booleanOptionalreverse?: booleanOptionalsortBy?: string'title', 'dateCreated', 'dateModified' or a label name +See https://triliumnext.github.io/Docs/Wiki/sorting.html for details.
+Based on the value, either create or remove branch between note and parent note.
+true if we want the branch to exist, false if we want it gone
+if branch is created between note and parent note, set this prefix
+This functions wraps code which is supposed to be running in transaction. If transaction already +exists, then we'll use that transaction.
+result of func callback
+to unescape
+unescaped string
+OptionalrequireDisables automatic emitDestroy when the object is garbage collected.
+This usually does not need to be set (even if emitDestroy is called
+manually), unless the resource's asyncId is retrieved and the
+sensitive API's emitDestroy is called with it.
OptionaltriggerThe ID of the execution context that created this async event.
+OptionalattachmentOptionalblobOptionalcontentOptionalcontentOptionaldateOptionaldeleteOptionalisOptionalisOptionalownerOptionalpositionOptionalutcOptionalutcConstruct a type with the properties of T except for those in type K.
+OptionaladapterOptionalallowOptionalauthOptionalbaseURLOptionalbeforeOptionalcancelOptionaldataOptionaldecompressOptionalenvOptionalfamilyOptionalfetchOptionalformOptionalhttpOptionalhttpsOptionalinsecureHTTPParserOptionallookupOptionalmaxOptionalmaxOptionalmaxOptionalmaxOptionalmethodOptionalonOptionalonOptionalparamsOptionalparamsOptionalproxyOptionalresponseOptionalresponseOptionalsignalOptionalsocketOptionaltimeoutOptionaltimeoutOptionaltransformOptionaltransformOptionaltransitionalOptionaltransportOptionalurlOptionalvalidateOptionalwithOptionalwithXSRFTokenOptionalxsrfOptionalxsrfOptionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<any>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>OptionaladapterOptionalallowOptionalauthOptionalbaseURLOptionalbeforeOptionalcancelOptionaldataOptionaldecompressOptionalenvOptionalfamilyOptionalfetchOptionalformOptionalheadersOptionalhttpOptionalhttpsOptionalinsecureHTTPParserOptionallookupOptionalmaxOptionalmaxOptionalmaxOptionalmaxOptionalmethodOptionalonOptionalonOptionalparamsOptionalparamsOptionalproxyOptionalresponseOptionalresponseOptionalsignalOptionalsocketOptionaltimeoutOptionaltimeoutOptionaltransformOptionaltransformOptionaltransitionalOptionaltransportOptionalurlOptionalvalidateOptionalwithOptionalwithXSRFTokenOptionalxsrfOptionalxsrfOptionalrequestOptionalstatus: numberOptionalconfig: AxiosRequestConfig<D>ReadonlyVERSIONOptionalconfig: CreateAxiosDefaults<any>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<any>Optionalconfig: AxiosRequestConfig<D>Optionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>Optionaldata: DOptionalconfig: AxiosRequestConfig<D>OptionalbranchOptionalisOptionalisOptionalnoteOptionalprefixOptionalutcCurrent column number [if this function was defined in a script]
+A call site object representing the location where eval was called +[if this function was created using a call to eval]
+Name of the script [if this function was defined in a script]
+Current function
+Name of the current function, typically its name property. +If a name property is not available an attempt will be made to try +to infer a name from the function's context.
+Current line number [if this function was defined in a script]
+Name of the property [of "this" or one of its prototypes] that holds +the current function
+returns the index of the promise element that was followed in +Promise.all() or Promise.any() for async stack traces, or null +if the CallSite is not an async
+Value of "this"
+Type of "this" as a string. +This is the name of the function stored in the constructor field of +"this", if available. Otherwise the object's [[Class]] internal +property.
+is this an async call (i.e. await, Promise.all(), or Promise.any())?
+Is this a constructor call?
+Does this call take place in code defined by a call to eval?
+Is this call in native V8 code?
+is this an async call to Promise.all()?
+Is this a toplevel invocation, that is, is "this" the global object?
+Optionalmessage: stringOptionalconfig: AxiosRequestConfig<any>Optionalrequest: anyOptionalselector: stringOptionalpropertyName: stringOptionalselector: stringOptionalselector: stringOptionalfilter: stringOptionalselector: stringOptionalselector: stringOptionalselector: stringOptionalfilter: stringOptionalselector: stringOptionalselector: stringOptionalfilter: stringOptionalselector: stringOptionalselector: stringOptionalend: numberOptionaltoggleSwitch: booleanOptionaltoggleSwitch: booleanOptionaloptions: CheerioParserOptionsOptionaloptions: CheerioParserOptionsOptionaloptions: CheerioParserOptionsOptionaloptions: CheerioParserOptionsOptionalcontext: null | DocumentOptionalkeepScripts: booleanOptional_useOptionaldecodeOptionalignoreOptionallowerOptionallowerOptionalnormalizeOptionalrecognizeCDATAOptionalrecognizeOptionalwithOptionalwithOptionalxmlConstruct a type with the properties of T except for those in type K.
+OptionaladapterOptionalallowOptionalauthOptionalbaseURLOptionalbeforeOptionalcancelOptionaldataOptionaldecompressOptionalenvOptionalfamilyOptionalfetchOptionalformOptionalheadersOptionalhttpOptionalhttpsOptionalinsecureHTTPParserOptionallookupOptionalmaxOptionalmaxOptionalmaxOptionalmaxOptionalmethodOptionalonOptionalonOptionalparamsOptionalparamsOptionalproxyOptionalresponseOptionalresponseOptionalsignalOptionalsocketOptionaltimeoutOptionaltimeoutOptionaltransformOptionaltransformOptionaltransitionalOptionaltransportOptionalurlOptionalvalidateOptionalwithOptionalwithXSRFTokenOptionalxsrfOptionalxsrfOptionaloptions: ParamsSerializerOptionsOptionalcaptureEnables automatic capturing of promise rejection.
+OptionalnameThe type of async event, this is required when instantiating EventEmitterAsyncResource
+directly rather than as a child class.
OptionalrequireDisables automatic emitDestroy when the object is garbage collected.
+This usually does not need to be set (even if emitDestroy is called
+manually), unless the resource's asyncId is retrieved and the
+sensitive API's emitDestroy is called with it.
OptionaltriggerThe ID of the execution context that created this async event.
+The class AsyncResource is designed to be extended by the embedder's async
+resources. Using this, users can easily trigger the lifetime events of their
+own resources.
The init hook will trigger when an AsyncResource is instantiated.
The following is an overview of the AsyncResource API.
import { AsyncResource, executionAsyncId } from 'node:async_hooks';
// AsyncResource() is meant to be extended. Instantiating a
// new AsyncResource() also triggers init. If triggerAsyncId is omitted then
// async_hook.executionAsyncId() is used.
const asyncResource = new AsyncResource(
type, { triggerAsyncId: executionAsyncId(), requireManualDestroy: false },
);
// Run a function in the execution context of the resource. This will
// * establish the context of the resource
// * trigger the AsyncHooks before callbacks
// * call the provided function `fn` with the supplied arguments
// * trigger the AsyncHooks after callbacks
// * restore the original execution context
asyncResource.runInAsyncScope(fn, thisArg, ...args);
// Call AsyncHooks destroy callbacks.
asyncResource.emitDestroy();
// Return the unique ID assigned to the AsyncResource instance.
asyncResource.asyncId();
// Return the trigger ID for the AsyncResource instance.
asyncResource.triggerAsyncId();
+
+
+The unique asyncId assigned to the resource.
Call all destroy hooks. This should only ever be called once. An error will
+be thrown if it is called more than once. This must be manually called. If
+the resource is left to be collected by the GC then the destroy hooks will
+never be called.
A reference to asyncResource.
Call the provided function with the provided arguments in the execution context +of the async resource. This will establish the context, trigger the AsyncHooks +before callbacks, call the function, trigger the AsyncHooks after callbacks, and +then restore the original execution context.
+The same triggerAsyncId that is passed to the AsyncResource constructor.
Optional[captureSynchronously calls each of the listeners registered for the event named eventName, in the order they were registered, passing the supplied arguments
+to each.
Returns true if the event had listeners, false otherwise.
import { EventEmitter } from 'node:events';
const myEmitter = new EventEmitter();
// First listener
myEmitter.on('event', function firstListener() {
console.log('Helloooo! first listener');
});
// Second listener
myEmitter.on('event', function secondListener(arg1, arg2) {
console.log(`event with parameters ${arg1}, ${arg2} in second listener`);
});
// Third listener
myEmitter.on('event', function thirdListener(...args) {
const parameters = args.join(', ');
console.log(`event with parameters ${parameters} in third listener`);
});
console.log(myEmitter.listeners('event'));
myEmitter.emit('event', 1, 2, 3, 4, 5);
// Prints:
// [
// [Function: firstListener],
// [Function: secondListener],
// [Function: thirdListener]
// ]
// Helloooo! first listener
// event with parameters 1, 2 in second listener
// event with parameters 1, 2, 3, 4, 5 in third listener
+
+
+Returns an array listing the events for which the emitter has registered
+listeners. The values in the array are strings or Symbols.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => {});
myEE.on('bar', () => {});
const sym = Symbol('symbol');
myEE.on(sym, () => {});
console.log(myEE.eventNames());
// Prints: [ 'foo', 'bar', Symbol(symbol) ]
+
+
+Returns the current max listener value for the EventEmitter which is either
+set by emitter.setMaxListeners(n) or defaults to EventEmitter.defaultMaxListeners.
Returns the number of listeners listening for the event named eventName.
+If listener is provided, it will return how many times the listener is found
+in the list of the listeners of the event.
Adds the listener function to the end of the listeners array for the event
+named eventName. No checks are made to see if the listener has already
+been added. Multiple calls passing the same combination of eventName and
+listener will result in the listener being added, and called, multiple times.
server.on('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.on('foo', () => console.log('a'));
myEE.prependListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+Adds a one-time listener function for the event named eventName. The
+next time eventName is triggered, this listener is removed and then invoked.
server.once('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default, event listeners are invoked in the order they are added. The emitter.prependOnceListener() method can be used as an alternative to add the
+event listener to the beginning of the listeners array.
import { EventEmitter } from 'node:events';
const myEE = new EventEmitter();
myEE.once('foo', () => console.log('a'));
myEE.prependOnceListener('foo', () => console.log('b'));
myEE.emit('foo');
// Prints:
// b
// a
+
+
+Adds the listener function to the beginning of the listeners array for the
+event named eventName. No checks are made to see if the listener has
+already been added. Multiple calls passing the same combination of eventName
+and listener will result in the listener being added, and called, multiple times.
server.prependListener('connection', (stream) => {
console.log('someone connected!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
Adds a one-timelistener function for the event named eventName to the beginning of the listeners array. The next time eventName is triggered, this
+listener is removed, and then invoked.
server.prependOnceListener('connection', (stream) => {
console.log('Ah, we have our first user!');
});
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
Returns a copy of the array of listeners for the event named eventName,
+including any wrappers (such as those created by .once()).
import { EventEmitter } from 'node:events';
const emitter = new EventEmitter();
emitter.once('log', () => console.log('log once'));
// Returns a new Array with a function `onceWrapper` which has a property
// `listener` which contains the original listener bound above
const listeners = emitter.rawListeners('log');
const logFnWrapper = listeners[0];
// Logs "log once" to the console and does not unbind the `once` event
logFnWrapper.listener();
// Logs "log once" to the console and removes the listener
logFnWrapper();
emitter.on('log', () => console.log('log persistently'));
// Will return a new Array with a single function bound by `.on()` above
const newListeners = emitter.rawListeners('log');
// Logs "log persistently" twice
newListeners[0]();
emitter.emit('log');
+
+
+Removes all listeners, or those of the specified eventName.
It is bad practice to remove listeners added elsewhere in the code,
+particularly when the EventEmitter instance was created by some other
+component or module (e.g. sockets or file streams).
Returns a reference to the EventEmitter, so that calls can be chained.
Removes the specified listener from the listener array for the event named eventName.
const callback = (stream) => {
console.log('someone connected!');
};
server.on('connection', callback);
// ...
server.removeListener('connection', callback);
+
+
+removeListener() will remove, at most, one instance of a listener from the
+listener array. If any single listener has been added multiple times to the
+listener array for the specified eventName, then removeListener() must be
+called multiple times to remove each instance.
Once an event is emitted, all listeners attached to it at the
+time of emitting are called in order. This implies that any removeListener() or removeAllListeners() calls after emitting and before the last listener finishes execution
+will not remove them fromemit() in progress. Subsequent events behave as expected.
import { EventEmitter } from 'node:events';
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
const callbackA = () => {
console.log('A');
myEmitter.removeListener('event', callbackB);
};
const callbackB = () => {
console.log('B');
};
myEmitter.on('event', callbackA);
myEmitter.on('event', callbackB);
// callbackA removes listener callbackB but it will still be called.
// Internal listener array at time of emit [callbackA, callbackB]
myEmitter.emit('event');
// Prints:
// A
// B
// callbackB is now removed.
// Internal listener array [callbackA]
myEmitter.emit('event');
// Prints:
// A
+
+
+Because listeners are managed using an internal array, calling this will
+change the position indices of any listener registered after the listener
+being removed. This will not impact the order in which listeners are called,
+but it means that any copies of the listener array as returned by
+the emitter.listeners() method will need to be recreated.
When a single function has been added as a handler multiple times for a single
+event (as in the example below), removeListener() will remove the most
+recently added instance. In the example the once('ping') listener is removed:
import { EventEmitter } from 'node:events';
const ee = new EventEmitter();
function pong() {
console.log('pong');
}
ee.on('ping', pong);
ee.once('ping', pong);
ee.removeListener('ping', pong);
ee.emit('ping');
ee.emit('ping');
+
+
+Returns a reference to the EventEmitter, so that calls can be chained.
By default EventEmitters will print a warning if more than 10 listeners are
+added for a particular event. This is a useful default that helps finding
+memory leaks. The emitter.setMaxListeners() method allows the limit to be
+modified for this specific EventEmitter instance. The value can be set to Infinity (or 0) to indicate an unlimited number of listeners.
Returns a reference to the EventEmitter, so that calls can be chained.
OptionallinkOptionaloptionsOptionalpurgeOptionalunlinkOptionaladapterOptionalallowOptionalauthOptionalbaseURLOptionalbeforeOptionalcancelOptionaldataOptionaldecompressOptionalenvOptionalfamilyOptionalfetchOptionalformOptionalhttpOptionalhttpsOptionalinsecureHTTPParserOptionallookupOptionalmaxOptionalmaxOptionalmaxOptionalmaxOptionalmethodOptionalonOptionalonOptionalparamsOptionalparamsOptionalproxyOptionalresponseOptionalresponseOptionalsignalOptionalsocketOptionaltimeoutOptionaltimeoutOptionaltransformOptionaltransformOptionaltransitionalOptionaltransportOptionalurlOptionalvalidateOptionalwithOptionalwithXSRFTokenOptionalxsrfOptionalxsrfDescribes a user-defined Iterator that is also iterable.
+OptionalreturnOptionalvalue: TReturnOptionalthrowOptionale: anyOptionalreturnOptionalvalue: TReturnOptionalthrowOptionale: anyOptionalbranchOptionaldateOptionalignoreOptionalisdefault is false
+Optionalisdefault is false
+Optionalmimedefault value is derived from default mimes for type
+Optionalnoteoptionally can force specific noteId
+Optionalnotedefault is the last existing notePosition in a parent + 10
+Optionalprefixdefault is empty string
+OptionaltargetOptionaltemplatetext, code, file, image, search, book, relationMap, canvas, webView
+OptionalutcOptionalblobOptionaldateOptionaldateOptionalisOptionaltitleOptionalutcOptionalcontentThe initial value of Object.prototype.constructor is the standard built-in Object constructor.
+Determines whether an object has a property with the specified name.
+A property name.
+Determines whether an object exists in another object's prototype chain.
+Another object whose prototype chain is to be checked.
+Determines whether a specified property is enumerable.
+A property name.
+Returns a date converted to a string using the current locale.
+Returns a string representation of an object.
+Returns the primitive value of the specified object.
+Database representation of an option.
+Options are key-value pairs that are used to store information such as user preferences (for example +the current theme, sync server information), but also information about the state of the application).
+OptionalblobOptionalcontentOptionaldateOptionalisOptionalrevisionOptionalutcOptionaloptions: CheerioParserOptionsOptionaloptions: CheerioParserOptionsOptionalcontext: null | DocumentOptionalkeepScripts: booleanAn instance of the frontend api available globally.
+OptionalcloseNames of events that will end the iteration.
+OptionalhighThe high watermark. The emitter is paused every time the size of events being buffered is higher than it.
+Supported only on emitters implementing pause() and resume() methods.
OptionallowThe low watermark. The emitter is resumed every time the size of events being buffered is lower than it.
+Supported only on emitters implementing pause() and resume() methods.
OptionalsignalCan be used to cancel awaiting events.
+OptionaldataOptionalendOptionalstartOptionalasyncOptionalattrkeyOptionalattrOptionalattrOptionalcharkeyOptionalcharsOptionalchildkeyOptionalchunkOptionalemptyOptionalexplicitOptionalexplicitOptionalexplicitOptionalexplicitOptionalignoreOptionalincludeOptionalmergeOptionalnormalizeOptionalnormalizeOptionalpreserveOptionalstrictOptionaltagOptionaltrimOptionalvalidatorOptionalvalueOptionalxmlnsOptionalattachmentOptionalblobOptionalcontentOptionalcontentOptionaldateOptionaldeleteOptionalisOptionalisOptionalownerOptionalpositionOptionalutcOptionalutcOptionalbranchOptionalisOptionalisOptionalnoteOptionalprefixOptionalutcOptionalcontentDatabase representation of an option.
-Options are key-value pairs that are used to store information such as user preferences (for example -the current theme, sync server information), but also information about the state of the application).
-OptionalblobOptionalcontentOptionaldateOptionalisOptionalrevisionOptionalutcOptionalonFulfilled: ((value: T) => T | Promise<T>) | nullOptionalonRejected: ((error: any) => any) | nullOptionaloptions: AxiosInterceptorOptionsProvides functionality common to all JavaScript objects.
+ConstThere are many different Note types, some of which are entirely opaque to the -end user. Those types should be used only for checking against, they are -not for direct use.
-Execute SQL
-Get a first column in an array.
-Get a map of first column mapping to second column.
-Get first returned row.
-Get all returned rows.
-Get single value from the given query - first column from first returned row.
-
Base class for all backend entities.
+