@elizaos/plugin-matrix 2.0.3-beta.6 → 2.0.3-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accounts.d.ts +14 -0
- package/dist/accounts.d.ts.map +1 -0
- package/dist/connector-account-provider.d.ts +22 -0
- package/dist/connector-account-provider.d.ts.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4888 -0
- package/dist/index.js.map +56 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/service.d.ts +205 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/types.d.ts +241 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/workflow-credential-provider.d.ts +21 -0
- package/dist/workflow-credential-provider.d.ts.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/errors.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/isSharedArrayBuffer.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/valueToKeyWithoutThrowing.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/valueToKey.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/cmp.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBKeyRange.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/extractKey.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/cloneValueForInsertion.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBCursor.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBCursorWithValue.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/FakeEventTarget.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBRequest.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/FakeDOMStringList.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/valueToKeyRange.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/getKeyPath.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/isPotentiallyValidKeyRange.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/enforceRange.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/extractGetAllOptions.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBIndex.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/canInjectKey.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBRecord.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/binarySearchTree.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/RecordStore.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/Index.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/validateKeyPath.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBObjectStore.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/FakeEvent.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/scheduling.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBTransaction.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/KeyGenerator.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/ObjectStore.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/closeConnection.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBDatabase.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBOpenDBRequest.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBVersionChangeEvent.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/intersection.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/Database.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/lib/validateRequiredArguments.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/FDBFactory.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/build/esm/fakeIndexedDB.js", "../../../node_modules/.bun/fake-indexeddb@6.2.5/node_modules/fake-indexeddb/auto/index.mjs", "../src/index.ts", "../src/accounts.ts", "../src/service.ts", "../src/types.ts", "../src/connector-account-provider.ts", "../src/workflow-credential-provider.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"const messages = {\n AbortError: \"A request was aborted, for example through a call to IDBTransaction.abort.\",\n ConstraintError: \"A mutation operation in the transaction failed because a constraint was not satisfied. For example, an object such as an object store or index already exists and a request attempted to create a new one.\",\n DataCloneError: \"The data being stored could not be cloned by the internal structured cloning algorithm.\",\n DataError: \"Data provided to an operation does not meet requirements.\",\n InvalidAccessError: \"An invalid operation was performed on an object. For example transaction creation attempt was made, but an empty scope was provided.\",\n InvalidStateError: \"An operation was called on an object on which it is not allowed or at a time when it is not allowed. Also occurs if a request is made on a source object that has been deleted or removed. Use TransactionInactiveError or ReadOnlyError when possible, as they are more specific variations of InvalidStateError.\",\n NotFoundError: \"The operation failed because the requested database object could not be found. For example, an object store did not exist but was being opened.\",\n ReadOnlyError: 'The mutating operation was attempted in a \"readonly\" transaction.',\n TransactionInactiveError: \"A request was placed against a transaction which is currently not active, or which is finished.\",\n SyntaxError: \"The keypath argument contains an invalid key path\",\n VersionError: \"An attempt was made to open a database using a lower version than the existing version.\"\n};\n\n// Cannot set an error code on an error using the normal setter;\n// this leads to \"Cannot set property code of which has only a getter\"\nconst setErrorCode = (error, value) => {\n Object.defineProperty(error, 'code', {\n value,\n writable: false,\n enumerable: true,\n configurable: false\n });\n};\nexport class AbortError extends DOMException {\n constructor(message = messages.AbortError) {\n super(message, \"AbortError\");\n }\n}\nexport class ConstraintError extends DOMException {\n constructor(message = messages.ConstraintError) {\n super(message, \"ConstraintError\");\n }\n}\nexport class DataCloneError extends DOMException {\n constructor(message = messages.DataCloneError) {\n super(message, \"DataCloneError\");\n }\n}\nexport class DataError extends DOMException {\n constructor(message = messages.DataError) {\n super(message, \"DataError\");\n setErrorCode(this, 0);\n }\n}\nexport class InvalidAccessError extends DOMException {\n constructor(message = messages.InvalidAccessError) {\n super(message, \"InvalidAccessError\");\n }\n}\nexport class InvalidStateError extends DOMException {\n constructor(message = messages.InvalidStateError) {\n super(message, \"InvalidStateError\");\n setErrorCode(this, 11);\n }\n}\nexport class NotFoundError extends DOMException {\n constructor(message = messages.NotFoundError) {\n super(message, \"NotFoundError\");\n }\n}\nexport class ReadOnlyError extends DOMException {\n constructor(message = messages.ReadOnlyError) {\n super(message, \"ReadOnlyError\");\n }\n}\nexport class SyntaxError extends DOMException {\n constructor(message = messages.VersionError) {\n super(message, \"SyntaxError\");\n setErrorCode(this, 12);\n }\n}\nexport class TransactionInactiveError extends DOMException {\n constructor(message = messages.TransactionInactiveError) {\n super(message, \"TransactionInactiveError\");\n setErrorCode(this, 0);\n }\n}\nexport class VersionError extends DOMException {\n constructor(message = messages.VersionError) {\n super(message, \"VersionError\");\n }\n}",
|
|
6
|
+
"export default function isSharedArrayBuffer(input) {\n return typeof SharedArrayBuffer !== \"undefined\" && input instanceof SharedArrayBuffer;\n}",
|
|
7
|
+
"import isSharedArrayBuffer from \"./isSharedArrayBuffer.js\";\nexport const INVALID_TYPE = Symbol(\"INVALID_TYPE\");\nexport const INVALID_VALUE = Symbol(\"INVALID_VALUE\");\n\n// https://w3c.github.io/IndexedDB/#convert-value-to-key\n// The \"without exceptions\" version is because we typically want to throw exceptions (DataError) but not for\n// the \"is potentially valid key range\" routine.\nconst valueToKeyWithoutThrowing = (input, seen) => {\n if (typeof input === \"number\") {\n if (isNaN(input)) {\n // If input is NaN then return \"invalid value\".\n return INVALID_VALUE;\n }\n return input;\n } else if (Object.prototype.toString.call(input) === \"[object Date]\") {\n const ms = input.valueOf();\n if (isNaN(ms)) {\n // If ms is NaN then return \"invalid value\".\n return INVALID_VALUE;\n }\n return new Date(ms);\n } else if (typeof input === \"string\") {\n return input;\n } else if (\n // https://w3c.github.io/IndexedDB/#ref-for-dfn-buffer-source-type\n input instanceof ArrayBuffer || isSharedArrayBuffer(input) || typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView && ArrayBuffer.isView(input)) {\n // We can't consistently test detachedness, so instead we check if byteLength === 0\n // This isn't foolproof, but there's no perfect way to detect if Uint8Arrays or\n // SharedArrayBuffers are detached\n if (\"detached\" in input ? input.detached : input.byteLength === 0) {\n // If input is detached then return \"invalid value\".\n return INVALID_VALUE;\n }\n let arrayBuffer;\n let offset = 0;\n let length = 0;\n if (input instanceof ArrayBuffer || isSharedArrayBuffer(input)) {\n arrayBuffer = input;\n length = input.byteLength;\n } else {\n arrayBuffer = input.buffer;\n offset = input.byteOffset;\n length = input.byteLength;\n }\n return arrayBuffer.slice(offset, offset + length);\n } else if (Array.isArray(input)) {\n if (seen === undefined) {\n seen = new Set();\n } else if (seen.has(input)) {\n // If seen contains input, then return \"invalid value\".\n return INVALID_VALUE;\n }\n seen.add(input);\n\n // This algorithm is tricky to account for `bindings-inject-keys-bypass.any.js`. We _should_ return early when\n // encountering an invalid key/type, but we also need to avoid triggering `Object.prototype['10']` if it's been\n // overridden. One simple way to do this (and which doesn't rely on sparse arrays or other exotic solutions that\n // could cause de-opts) is to use `Array.from()` with a mapper function, which does not trigger the prototype\n // setter [1]. It does prevent an early return, but we can at least short-circuit inside the mapper function\n // (which isn't strictly necessary to pass the WPTs, but is closer to the spec).\n // [1]: See https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.from, specifically\n // the chain CreateDataPropertyOrThrow -> CreateDataProperty -> DefineOwnProperty which defines\n // the array element as an \"own\" property.\n let hasInvalid = false;\n const keys = Array.from({\n length: input.length\n }, (_, i) => {\n if (hasInvalid) {\n return;\n }\n const hop = Object.hasOwn(input, i);\n if (!hop) {\n // If hop is false, return \"invalid value\".\n hasInvalid = true;\n return;\n }\n const entry = input[i];\n const key = valueToKeyWithoutThrowing(entry, seen);\n // If key is \"invalid value\" or \"invalid type\" abort these steps and return \"invalid value\".\n if (key === INVALID_VALUE || key === INVALID_TYPE) {\n hasInvalid = true;\n return;\n }\n return key;\n });\n if (hasInvalid) {\n return INVALID_VALUE;\n }\n return keys;\n } else {\n // Otherwise: Return \"invalid type\".\n return INVALID_TYPE;\n }\n};\nexport default valueToKeyWithoutThrowing;",
|
|
8
|
+
"import { DataError } from \"./errors.js\";\nimport valueToKeyWithoutThrowing, { INVALID_TYPE, INVALID_VALUE } from \"./valueToKeyWithoutThrowing.js\";\n// https://w3c.github.io/IndexedDB/#convert-value-to-key\n// Plus throwing a DataError for invalid value/invalid key, which is commonly done\n// in lots of IndexedDB operations\nconst valueToKey = (input, seen) => {\n const result = valueToKeyWithoutThrowing(input, seen);\n if (result === INVALID_VALUE || result === INVALID_TYPE) {\n // If key is \"invalid value\" or \"invalid type\", throw a \"DataError\" DOMException\n throw new DataError();\n }\n return result;\n};\nexport default valueToKey;",
|
|
9
|
+
"import { DataError } from \"./errors.js\";\nimport valueToKey from \"./valueToKey.js\";\nconst getType = x => {\n if (typeof x === \"number\") {\n return \"Number\";\n }\n if (Object.prototype.toString.call(x) === \"[object Date]\") {\n return \"Date\";\n }\n if (Array.isArray(x)) {\n return \"Array\";\n }\n if (typeof x === \"string\") {\n return \"String\";\n }\n if (x instanceof ArrayBuffer) {\n return \"Binary\";\n }\n throw new DataError();\n};\n\n// https://w3c.github.io/IndexedDB/#compare-two-keys\nconst cmp = (first, second) => {\n if (second === undefined) {\n throw new TypeError();\n }\n first = valueToKey(first);\n second = valueToKey(second);\n const t1 = getType(first);\n const t2 = getType(second);\n if (t1 !== t2) {\n if (t1 === \"Array\") {\n return 1;\n }\n if (t1 === \"Binary\" && (t2 === \"String\" || t2 === \"Date\" || t2 === \"Number\")) {\n return 1;\n }\n if (t1 === \"String\" && (t2 === \"Date\" || t2 === \"Number\")) {\n return 1;\n }\n if (t1 === \"Date\" && t2 === \"Number\") {\n return 1;\n }\n return -1;\n }\n if (t1 === \"Binary\") {\n first = new Uint8Array(first);\n second = new Uint8Array(second);\n }\n if (t1 === \"Array\" || t1 === \"Binary\") {\n const length = Math.min(first.length, second.length);\n for (let i = 0; i < length; i++) {\n const result = cmp(first[i], second[i]);\n if (result !== 0) {\n return result;\n }\n }\n if (first.length > second.length) {\n return 1;\n }\n if (first.length < second.length) {\n return -1;\n }\n return 0;\n }\n if (t1 === \"Date\") {\n if (first.getTime() === second.getTime()) {\n return 0;\n }\n } else {\n if (first === second) {\n return 0;\n }\n }\n return first > second ? 1 : -1;\n};\nexport default cmp;",
|
|
10
|
+
"import cmp from \"./lib/cmp.js\";\nimport { DataError } from \"./lib/errors.js\";\nimport valueToKey from \"./lib/valueToKey.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#range-concept\nclass FDBKeyRange {\n static only(value) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n value = valueToKey(value);\n return new FDBKeyRange(value, value, false, false);\n }\n static lowerBound(lower, open = false) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n lower = valueToKey(lower);\n return new FDBKeyRange(lower, undefined, open, true);\n }\n static upperBound(upper, open = false) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n upper = valueToKey(upper);\n return new FDBKeyRange(undefined, upper, true, open);\n }\n static bound(lower, upper, lowerOpen = false, upperOpen = false) {\n if (arguments.length < 2) {\n throw new TypeError();\n }\n const cmpResult = cmp(lower, upper);\n if (cmpResult === 1 || cmpResult === 0 && (lowerOpen || upperOpen)) {\n throw new DataError();\n }\n lower = valueToKey(lower);\n upper = valueToKey(upper);\n return new FDBKeyRange(lower, upper, lowerOpen, upperOpen);\n }\n constructor(lower, upper, lowerOpen, upperOpen) {\n this.lower = lower;\n this.upper = upper;\n this.lowerOpen = lowerOpen;\n this.upperOpen = upperOpen;\n }\n\n // https://w3c.github.io/IndexedDB/#dom-idbkeyrange-includes\n includes(key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n key = valueToKey(key);\n if (this.lower !== undefined) {\n const cmpResult = cmp(this.lower, key);\n if (cmpResult === 1 || cmpResult === 0 && this.lowerOpen) {\n return false;\n }\n }\n if (this.upper !== undefined) {\n const cmpResult = cmp(this.upper, key);\n if (cmpResult === -1 || cmpResult === 0 && this.upperOpen) {\n return false;\n }\n }\n return true;\n }\n get [Symbol.toStringTag]() {\n return \"IDBKeyRange\";\n }\n}\nexport default FDBKeyRange;",
|
|
11
|
+
"import valueToKey from \"./valueToKey.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-extracting-a-key-from-a-value-using-a-key-path\nconst extractKey = (keyPath, value) => {\n if (Array.isArray(keyPath)) {\n const result = [];\n for (let item of keyPath) {\n // This doesn't make sense to me based on the spec, but it is needed to pass the W3C KeyPath tests (see same\n // comment in validateKeyPath)\n if (item !== undefined && item !== null && typeof item !== \"string\" && item.toString) {\n item = item.toString();\n }\n const key = extractKey(item, value).key;\n result.push(valueToKey(key));\n }\n return {\n type: \"found\",\n key: result\n };\n }\n if (keyPath === \"\") {\n return {\n type: \"found\",\n key: value\n };\n }\n let remainingKeyPath = keyPath;\n let object = value;\n while (remainingKeyPath !== null) {\n let identifier;\n const i = remainingKeyPath.indexOf(\".\");\n if (i >= 0) {\n identifier = remainingKeyPath.slice(0, i);\n remainingKeyPath = remainingKeyPath.slice(i + 1);\n } else {\n identifier = remainingKeyPath;\n remainingKeyPath = null;\n }\n\n // special cases: https://w3c.github.io/IndexedDB/#evaluate-a-key-path-on-a-value\n const isSpecialIdentifier = identifier === \"length\" && (typeof object === \"string\" || Array.isArray(object)) || (identifier === \"size\" || identifier === \"type\") && typeof Blob !== \"undefined\" && object instanceof Blob || (identifier === \"name\" || identifier === \"lastModified\") && typeof File !== \"undefined\" && object instanceof File;\n if (!isSpecialIdentifier && (typeof object !== \"object\" || object === null || !Object.hasOwn(object, identifier))) {\n return {\n type: \"notFound\"\n };\n }\n object = object[identifier];\n }\n return {\n type: \"found\",\n key: object\n };\n};\nexport default extractKey;",
|
|
12
|
+
"// https://w3c.github.io/IndexedDB/#clone-value\n// Note that we only need to call this during insertions because the spec does not expect any cloning during retrieval,\n// only `StructuredDeserialize()` (e.g. see [1]). This is also only required for values, not keys, since keys do not\n// require cloning during insertion (e.g. see [2]).\n// [1]: https://w3c.github.io/IndexedDB/#retrieve-multiple-items-from-an-object-store\n// [2]: https://w3c.github.io/IndexedDB/#add-or-put\nexport function cloneValueForInsertion(value, transaction) {\n // Assert: transaction’s state is active.\n if (transaction._state !== \"active\") {\n throw new Error(\"Assert: transaction state is active\");\n }\n\n // Set transaction’s state to inactive.\n transaction._state = \"inactive\";\n try {\n // Let serialized be StructuredSerializeForStorage(value).\n // Let clone be ? StructuredDeserialize(serialized, targetRealm).\n // Return clone.\n return structuredClone(value);\n } finally {\n // Set transaction’s state to active.\n transaction._state = \"active\";\n }\n}",
|
|
13
|
+
"import FDBKeyRange from \"./FDBKeyRange.js\";\nimport FDBObjectStore from \"./FDBObjectStore.js\";\nimport cmp from \"./lib/cmp.js\";\nimport { DataError, InvalidAccessError, InvalidStateError, ReadOnlyError, TransactionInactiveError } from \"./lib/errors.js\";\nimport extractKey from \"./lib/extractKey.js\";\nimport valueToKey from \"./lib/valueToKey.js\";\nimport { cloneValueForInsertion } from \"./lib/cloneValueForInsertion.js\";\nconst getEffectiveObjectStore = cursor => {\n if (cursor.source instanceof FDBObjectStore) {\n return cursor.source;\n }\n return cursor.source.objectStore;\n};\n\n// This takes a key range, a list of lower bounds, and a list of upper bounds and combines them all into a single key\n// range. It does not handle gt/gte distinctions, because it doesn't really matter much anyway, since for next/prev\n// cursor iteration it'd also have to look at values to be precise, which would be complicated. This should get us 99%\n// of the way there.\nconst makeKeyRange = (range, lowers, uppers) => {\n // Start with bounds from range\n let lower = range !== undefined ? range.lower : undefined;\n let upper = range !== undefined ? range.upper : undefined;\n\n // Augment with values from lowers and uppers\n for (const lowerTemp of lowers) {\n if (lowerTemp === undefined) {\n continue;\n }\n if (lower === undefined || cmp(lower, lowerTemp) === 1) {\n lower = lowerTemp;\n }\n }\n for (const upperTemp of uppers) {\n if (upperTemp === undefined) {\n continue;\n }\n if (upper === undefined || cmp(upper, upperTemp) === -1) {\n upper = upperTemp;\n }\n }\n if (lower !== undefined && upper !== undefined) {\n return FDBKeyRange.bound(lower, upper);\n }\n if (lower !== undefined) {\n return FDBKeyRange.lowerBound(lower);\n }\n if (upper !== undefined) {\n return FDBKeyRange.upperBound(upper);\n }\n};\n\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#cursor\nclass FDBCursor {\n _gotValue = false;\n _position = undefined; // Key of previously returned record\n _objectStorePosition = undefined;\n _keyOnly = false;\n _key = undefined;\n _primaryKey = undefined;\n constructor(source, range, direction = \"next\", request, keyOnly = false) {\n this._range = range;\n this._source = source;\n this._direction = direction;\n this._request = request;\n this._keyOnly = keyOnly;\n }\n\n // Read only properties\n get source() {\n return this._source;\n }\n set source(val) {\n /* For babel */\n }\n get request() {\n return this._request;\n }\n set request(val) {\n /* For babel */\n }\n get direction() {\n return this._direction;\n }\n set direction(val) {\n /* For babel */\n }\n get key() {\n return this._key;\n }\n set key(val) {\n /* For babel */\n }\n get primaryKey() {\n return this._primaryKey;\n }\n set primaryKey(val) {\n /* For babel */\n }\n\n // https://w3c.github.io/IndexedDB/#iterate-a-cursor\n _iterate(key, primaryKey) {\n const sourceIsObjectStore = this.source instanceof FDBObjectStore;\n\n // Can't use sourceIsObjectStore because TypeScript\n const records = this.source instanceof FDBObjectStore ? this.source._rawObjectStore.records : this.source._rawIndex.records;\n let foundRecord;\n if (this.direction === \"next\") {\n const range = makeKeyRange(this._range, [key, this._position], []);\n for (const record of records.values(range)) {\n const cmpResultKey = key !== undefined ? cmp(record.key, key) : undefined;\n const cmpResultPosition = this._position !== undefined ? cmp(record.key, this._position) : undefined;\n if (key !== undefined) {\n if (cmpResultKey === -1) {\n continue;\n }\n }\n if (primaryKey !== undefined) {\n if (cmpResultKey === -1) {\n continue;\n }\n const cmpResultPrimaryKey = cmp(record.value, primaryKey);\n if (cmpResultKey === 0 && cmpResultPrimaryKey === -1) {\n continue;\n }\n }\n if (this._position !== undefined && sourceIsObjectStore) {\n if (cmpResultPosition !== 1) {\n continue;\n }\n }\n if (this._position !== undefined && !sourceIsObjectStore) {\n if (cmpResultPosition === -1) {\n continue;\n }\n if (cmpResultPosition === 0 && cmp(record.value, this._objectStorePosition) !== 1) {\n continue;\n }\n }\n if (this._range !== undefined) {\n if (!this._range.includes(record.key)) {\n continue;\n }\n }\n foundRecord = record;\n break;\n }\n } else if (this.direction === \"nextunique\") {\n // This could be done without iterating, if the range was defined slightly better (to handle gt/gte cases).\n // But the performance difference should be small, and that wouldn't work anyway for directions where the\n // value needs to be used (like next and prev).\n const range = makeKeyRange(this._range, [key, this._position], []);\n for (const record of records.values(range)) {\n if (key !== undefined) {\n if (cmp(record.key, key) === -1) {\n continue;\n }\n }\n if (this._position !== undefined) {\n if (cmp(record.key, this._position) !== 1) {\n continue;\n }\n }\n if (this._range !== undefined) {\n if (!this._range.includes(record.key)) {\n continue;\n }\n }\n foundRecord = record;\n break;\n }\n } else if (this.direction === \"prev\") {\n const range = makeKeyRange(this._range, [], [key, this._position]);\n for (const record of records.values(range, \"prev\")) {\n const cmpResultKey = key !== undefined ? cmp(record.key, key) : undefined;\n const cmpResultPosition = this._position !== undefined ? cmp(record.key, this._position) : undefined;\n if (key !== undefined) {\n if (cmpResultKey === 1) {\n continue;\n }\n }\n if (primaryKey !== undefined) {\n if (cmpResultKey === 1) {\n continue;\n }\n const cmpResultPrimaryKey = cmp(record.value, primaryKey);\n if (cmpResultKey === 0 && cmpResultPrimaryKey === 1) {\n continue;\n }\n }\n if (this._position !== undefined && sourceIsObjectStore) {\n if (cmpResultPosition !== -1) {\n continue;\n }\n }\n if (this._position !== undefined && !sourceIsObjectStore) {\n if (cmpResultPosition === 1) {\n continue;\n }\n if (cmpResultPosition === 0 && cmp(record.value, this._objectStorePosition) !== -1) {\n continue;\n }\n }\n if (this._range !== undefined) {\n if (!this._range.includes(record.key)) {\n continue;\n }\n }\n foundRecord = record;\n break;\n }\n } else if (this.direction === \"prevunique\") {\n let tempRecord;\n const range = makeKeyRange(this._range, [], [key, this._position]);\n for (const record of records.values(range, \"prev\")) {\n if (key !== undefined) {\n if (cmp(record.key, key) === 1) {\n continue;\n }\n }\n if (this._position !== undefined) {\n if (cmp(record.key, this._position) !== -1) {\n continue;\n }\n }\n if (this._range !== undefined) {\n if (!this._range.includes(record.key)) {\n continue;\n }\n }\n tempRecord = record;\n break;\n }\n if (tempRecord) {\n foundRecord = records.get(tempRecord.key);\n }\n }\n let result;\n if (!foundRecord) {\n this._key = undefined;\n if (!sourceIsObjectStore) {\n this._objectStorePosition = undefined;\n }\n\n // \"this instanceof FDBCursorWithValue\" would be better and not require (this as any), but causes runtime\n // error due to circular dependency.\n if (!this._keyOnly && this.toString() === \"[object IDBCursorWithValue]\") {\n this.value = undefined;\n }\n result = null;\n } else {\n this._position = foundRecord.key;\n if (!sourceIsObjectStore) {\n this._objectStorePosition = foundRecord.value;\n }\n this._key = foundRecord.key;\n if (sourceIsObjectStore) {\n this._primaryKey = structuredClone(foundRecord.key);\n if (!this._keyOnly && this.toString() === \"[object IDBCursorWithValue]\") {\n this.value = structuredClone(foundRecord.value);\n }\n } else {\n this._primaryKey = structuredClone(foundRecord.value);\n if (!this._keyOnly && this.toString() === \"[object IDBCursorWithValue]\") {\n if (this.source instanceof FDBObjectStore) {\n // Can't use sourceIsObjectStore because TypeScript\n throw new Error(\"This should never happen\");\n }\n const value = this.source.objectStore._rawObjectStore.getValue(foundRecord.value);\n this.value = structuredClone(value);\n }\n }\n this._gotValue = true;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n result = this;\n }\n return result;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBCursor-update-IDBRequest-any-value\n update(value) {\n if (value === undefined) {\n throw new TypeError();\n }\n const effectiveObjectStore = getEffectiveObjectStore(this);\n const effectiveKey = Object.hasOwn(this.source, \"_rawIndex\") ? this.primaryKey : this._position;\n const transaction = effectiveObjectStore.transaction;\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (transaction.mode === \"readonly\") {\n throw new ReadOnlyError();\n }\n if (effectiveObjectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (!(this.source instanceof FDBObjectStore) && this.source._rawIndex.deleted) {\n throw new InvalidStateError();\n }\n if (!this._gotValue || !Object.hasOwn(this, \"value\")) {\n throw new InvalidStateError();\n }\n const clone = cloneValueForInsertion(value, transaction);\n if (effectiveObjectStore.keyPath !== null) {\n let tempKey;\n try {\n tempKey = extractKey(effectiveObjectStore.keyPath, clone).key;\n } catch (err) {\n /* Handled immediately below */\n }\n if (cmp(tempKey, effectiveKey) !== 0) {\n throw new DataError();\n }\n }\n const record = {\n key: effectiveKey,\n value: clone\n };\n return transaction._execRequestAsync({\n operation: effectiveObjectStore._rawObjectStore.storeRecord.bind(effectiveObjectStore._rawObjectStore, record, false, transaction._rollbackLog),\n source: this\n });\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBCursor-advance-void-unsigned-long-count\n advance(count) {\n if (!Number.isInteger(count) || count <= 0) {\n throw new TypeError();\n }\n const effectiveObjectStore = getEffectiveObjectStore(this);\n const transaction = effectiveObjectStore.transaction;\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (effectiveObjectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (!(this.source instanceof FDBObjectStore) && this.source._rawIndex.deleted) {\n throw new InvalidStateError();\n }\n if (!this._gotValue) {\n throw new InvalidStateError();\n }\n if (this._request) {\n this._request.readyState = \"pending\";\n }\n transaction._execRequestAsync({\n operation: () => {\n let result;\n for (let i = 0; i < count; i++) {\n result = this._iterate();\n\n // Not sure why this is needed\n if (!result) {\n break;\n }\n }\n return result;\n },\n request: this._request,\n source: this.source\n });\n this._gotValue = false;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBCursor-continue-void-any-key\n continue(key) {\n const effectiveObjectStore = getEffectiveObjectStore(this);\n const transaction = effectiveObjectStore.transaction;\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (effectiveObjectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (!(this.source instanceof FDBObjectStore) && this.source._rawIndex.deleted) {\n throw new InvalidStateError();\n }\n if (!this._gotValue) {\n throw new InvalidStateError();\n }\n if (key !== undefined) {\n key = valueToKey(key);\n const cmpResult = cmp(key, this._position);\n if (cmpResult <= 0 && (this.direction === \"next\" || this.direction === \"nextunique\") || cmpResult >= 0 && (this.direction === \"prev\" || this.direction === \"prevunique\")) {\n throw new DataError();\n }\n }\n if (this._request) {\n this._request.readyState = \"pending\";\n }\n transaction._execRequestAsync({\n operation: this._iterate.bind(this, key),\n request: this._request,\n source: this.source\n });\n this._gotValue = false;\n }\n\n // hthttps://w3c.github.io/IndexedDB/#dom-idbcursor-continueprimarykey\n continuePrimaryKey(key, primaryKey) {\n const effectiveObjectStore = getEffectiveObjectStore(this);\n const transaction = effectiveObjectStore.transaction;\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (effectiveObjectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (!(this.source instanceof FDBObjectStore) && this.source._rawIndex.deleted) {\n throw new InvalidStateError();\n }\n if (this.source instanceof FDBObjectStore || this.direction !== \"next\" && this.direction !== \"prev\") {\n throw new InvalidAccessError();\n }\n if (!this._gotValue) {\n throw new InvalidStateError();\n }\n\n // Not sure about this\n if (key === undefined || primaryKey === undefined) {\n throw new DataError();\n }\n key = valueToKey(key);\n const cmpResult = cmp(key, this._position);\n if (cmpResult === -1 && this.direction === \"next\" || cmpResult === 1 && this.direction === \"prev\") {\n throw new DataError();\n }\n const cmpResult2 = cmp(primaryKey, this._objectStorePosition);\n if (cmpResult === 0) {\n if (cmpResult2 <= 0 && this.direction === \"next\" || cmpResult2 >= 0 && this.direction === \"prev\") {\n throw new DataError();\n }\n }\n if (this._request) {\n this._request.readyState = \"pending\";\n }\n transaction._execRequestAsync({\n operation: this._iterate.bind(this, key, primaryKey),\n request: this._request,\n source: this.source\n });\n this._gotValue = false;\n }\n delete() {\n const effectiveObjectStore = getEffectiveObjectStore(this);\n const effectiveKey = Object.hasOwn(this.source, \"_rawIndex\") ? this.primaryKey : this._position;\n const transaction = effectiveObjectStore.transaction;\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (transaction.mode === \"readonly\") {\n throw new ReadOnlyError();\n }\n if (effectiveObjectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (!(this.source instanceof FDBObjectStore) && this.source._rawIndex.deleted) {\n throw new InvalidStateError();\n }\n if (!this._gotValue || !Object.hasOwn(this, \"value\")) {\n throw new InvalidStateError();\n }\n return transaction._execRequestAsync({\n operation: effectiveObjectStore._rawObjectStore.deleteRecord.bind(effectiveObjectStore._rawObjectStore, effectiveKey, transaction._rollbackLog),\n source: this\n });\n }\n get [Symbol.toStringTag]() {\n return \"IDBCursor\";\n }\n}\nexport default FDBCursor;",
|
|
14
|
+
"import FDBCursor from \"./FDBCursor.js\";\nclass FDBCursorWithValue extends FDBCursor {\n value = undefined;\n constructor(source, range, direction, request) {\n super(source, range, direction, request);\n }\n get [Symbol.toStringTag]() {\n return \"IDBCursorWithValue\";\n }\n}\nexport default FDBCursorWithValue;",
|
|
15
|
+
"import { InvalidStateError } from \"./errors.js\";\nconst stopped = (event, listener) => {\n return event.immediatePropagationStopped || event.eventPhase === event.CAPTURING_PHASE && listener.capture === false || event.eventPhase === event.BUBBLING_PHASE && listener.capture === true;\n};\n\n// http://www.w3.org/TR/dom/#concept-event-listener-invoke\nconst invokeEventListeners = (event, obj) => {\n event.currentTarget = obj;\n const errors = [];\n const invoke = callbackOrObject => {\n try {\n const callback = typeof callbackOrObject === \"function\" ? callbackOrObject : callbackOrObject.handleEvent;\n // @ts-expect-error EventCallback's types are not quite right here\n callback.call(event.currentTarget, event);\n } catch (err) {\n errors.push(err);\n }\n };\n\n // The callback might cause obj.listeners to mutate as we traverse it.\n // Take a copy of the array so that nothing sneaks in and we don't lose\n // our place.\n for (const listener of obj.listeners.slice()) {\n if (event.type !== listener.type || stopped(event, listener)) {\n continue;\n }\n invoke(listener.callback);\n }\n const typeToProp = {\n abort: \"onabort\",\n blocked: \"onblocked\",\n close: \"onclose\",\n complete: \"oncomplete\",\n error: \"onerror\",\n success: \"onsuccess\",\n upgradeneeded: \"onupgradeneeded\",\n versionchange: \"onversionchange\"\n };\n const prop = typeToProp[event.type];\n if (prop === undefined) {\n throw new Error(`Unknown event type: \"${event.type}\"`);\n }\n const callback = event.currentTarget[prop];\n if (callback) {\n const listener = {\n callback,\n capture: false,\n type: event.type\n };\n if (!stopped(event, listener)) {\n invoke(listener.callback);\n }\n }\n\n // we want to execute all listeners before deciding if we want to throw, because there could be an error thrown by\n // the first listener, but the second should still be invoked\n if (errors.length) {\n throw new AggregateError(errors);\n }\n};\nclass FakeEventTarget {\n listeners = [];\n\n // These will be overridden in individual subclasses and made not readonly\n\n addEventListener(type, callback, options) {\n const capture = !!(typeof options === \"object\" && options ? options.capture : options);\n this.listeners.push({\n callback,\n capture,\n type\n });\n }\n removeEventListener(type, callback, options) {\n const capture = !!(typeof options === \"object\" && options ? options.capture : options);\n const i = this.listeners.findIndex(listener => {\n return listener.type === type && listener.callback === callback && listener.capture === capture;\n });\n this.listeners.splice(i, 1);\n }\n\n // http://www.w3.org/TR/dom/#dispatching-events\n dispatchEvent(event) {\n if (event.dispatched || !event.initialized) {\n throw new InvalidStateError(\"The object is in an invalid state.\");\n }\n event.isTrusted = false;\n event.dispatched = true;\n event.target = this;\n // NOT SURE WHEN THIS SHOULD BE SET event.eventPath = [];\n\n event.eventPhase = event.CAPTURING_PHASE;\n for (const obj of event.eventPath) {\n if (!event.propagationStopped) {\n invokeEventListeners(event, obj);\n }\n }\n event.eventPhase = event.AT_TARGET;\n if (!event.propagationStopped) {\n invokeEventListeners(event, event.target);\n }\n if (event.bubbles) {\n event.eventPath.reverse();\n event.eventPhase = event.BUBBLING_PHASE;\n for (const obj of event.eventPath) {\n if (!event.propagationStopped) {\n invokeEventListeners(event, obj);\n }\n }\n }\n event.dispatched = false;\n event.eventPhase = event.NONE;\n event.currentTarget = null;\n if (event.canceled) {\n return false;\n }\n return true;\n }\n}\nexport default FakeEventTarget;",
|
|
16
|
+
"import { InvalidStateError } from \"./lib/errors.js\";\nimport FakeEventTarget from \"./lib/FakeEventTarget.js\";\nclass FDBRequest extends FakeEventTarget {\n _result = null;\n _error = null;\n source = null;\n transaction = null;\n readyState = \"pending\";\n onsuccess = null;\n onerror = null;\n get error() {\n if (this.readyState === \"pending\") {\n throw new InvalidStateError();\n }\n return this._error;\n }\n set error(value) {\n this._error = value;\n }\n get result() {\n if (this.readyState === \"pending\") {\n throw new InvalidStateError();\n }\n return this._result;\n }\n set result(value) {\n this._result = value;\n }\n get [Symbol.toStringTag]() {\n return \"IDBRequest\";\n }\n}\nexport default FDBRequest;",
|
|
17
|
+
"class FakeDOMStringList {\n constructor(...values) {\n this._values = values;\n for (let i = 0; i < values.length; i++) {\n this[i] = values[i];\n }\n }\n contains(value) {\n return this._values.includes(value);\n }\n item(i) {\n if (i < 0 || i >= this._values.length) {\n return null;\n }\n return this._values[i];\n }\n get length() {\n return this._values.length;\n }\n [Symbol.iterator]() {\n return this._values[Symbol.iterator]();\n }\n\n // Handled by proxy\n\n // Used internally, should not be used by others. I could maybe get rid of these and replace rather than mutate, but too lazy to check the spec.\n _push(...values) {\n for (let i = 0; i < values.length; i++) {\n this[this._values.length + i] = values[i];\n }\n this._values.push(...values);\n }\n _sort(...values) {\n this._values.sort(...values);\n for (let i = 0; i < this._values.length; i++) {\n this[i] = this._values[i];\n }\n return this;\n }\n}\nexport default FakeDOMStringList;",
|
|
18
|
+
"import FDBKeyRange from \"../FDBKeyRange.js\";\nimport { DataError } from \"./errors.js\";\nimport valueToKey from \"./valueToKey.js\";\n\n// http://w3c.github.io/IndexedDB/#convert-a-value-to-a-key-range\nconst valueToKeyRange = (value, nullDisallowedFlag = false) => {\n if (value instanceof FDBKeyRange) {\n return value;\n }\n if (value === null || value === undefined) {\n if (nullDisallowedFlag) {\n throw new DataError();\n }\n return new FDBKeyRange(undefined, undefined, false, false);\n }\n const key = valueToKey(value);\n return FDBKeyRange.only(key);\n};\nexport default valueToKeyRange;",
|
|
19
|
+
"// Keys provided as functions or arrays or objects need to be stringified\nconst convertKey = key => typeof key === 'object' && key ? key + '' : key;\n\n// https://www.w3.org/TR/IndexedDB/#dom-idbobjectstore-keypath\nexport function getKeyPath(keyPath) {\n // It's important to clone the Array here because of the WPT test:\n // \"Different instances are returned from different store instances.\"\n // Also note that the same instance must be returned across multiple gets\n return Array.isArray(keyPath) ? keyPath.map(convertKey) : convertKey(keyPath);\n}",
|
|
20
|
+
"import FDBKeyRange from \"../FDBKeyRange.js\";\nimport valueToKeyWithoutThrowing, { INVALID_TYPE } from \"./valueToKeyWithoutThrowing.js\";\n\n// https://www.w3.org/TR/IndexedDB/#is-a-potentially-valid-key-range\nconst isPotentiallyValidKeyRange = value => {\n // If value is a key range, return true.\n if (value instanceof FDBKeyRange) {\n return true;\n }\n\n // Let key be the result of converting a value to a key with value.\n const key = valueToKeyWithoutThrowing(value);\n\n // If key is \"invalid type\" return false.\n // Else return true.\n return key !== INVALID_TYPE;\n};\nexport default isPotentiallyValidKeyRange;",
|
|
21
|
+
"// https://heycam.github.io/webidl/#EnforceRange\n\nconst enforceRange = (num, type) => {\n const min = 0;\n const max = type === \"unsigned long\" ? 4294967295 : 9007199254740991;\n if (isNaN(num) || num < min || num > max) {\n throw new TypeError();\n }\n if (num >= 0) {\n return Math.floor(num);\n }\n};\nexport default enforceRange;",
|
|
22
|
+
"import isPotentiallyValidKeyRange from \"./isPotentiallyValidKeyRange.js\";\nimport enforceRange from \"./enforceRange.js\";\n// https://www.w3.org/TR/IndexedDB/#create-request-to-retrieve-multiple-items\nconst extractGetAllOptions = (queryOrOptions, count, numArguments) => {\n let query;\n let direction;\n if (queryOrOptions === undefined || queryOrOptions === null || isPotentiallyValidKeyRange(queryOrOptions)) {\n // queryOrOptions is FDBKeyRange | Key | null | undefined\n query = queryOrOptions;\n if (numArguments > 1 && count !== undefined) {\n count = enforceRange(count, \"unsigned long\");\n }\n } else {\n // queryOrOptions is FDBGetAllOptions\n const getAllOptions = queryOrOptions;\n if (getAllOptions.query !== undefined) {\n query = getAllOptions.query;\n }\n if (getAllOptions.count !== undefined) {\n count = enforceRange(getAllOptions.count, \"unsigned long\");\n }\n if (getAllOptions.direction !== undefined) {\n direction = getAllOptions.direction;\n }\n }\n return {\n query,\n count,\n direction\n };\n};\nexport default extractGetAllOptions;",
|
|
23
|
+
"import FDBCursor from \"./FDBCursor.js\";\nimport FDBCursorWithValue from \"./FDBCursorWithValue.js\";\nimport FDBKeyRange from \"./FDBKeyRange.js\";\nimport FDBRequest from \"./FDBRequest.js\";\nimport { ConstraintError, InvalidStateError, TransactionInactiveError } from \"./lib/errors.js\";\nimport FakeDOMStringList from \"./lib/FakeDOMStringList.js\";\nimport valueToKey from \"./lib/valueToKey.js\";\nimport valueToKeyRange from \"./lib/valueToKeyRange.js\";\nimport { getKeyPath } from \"./lib/getKeyPath.js\";\nimport extractGetAllOptions from \"./lib/extractGetAllOptions.js\";\nimport enforceRange from \"./lib/enforceRange.js\";\nconst confirmActiveTransaction = index => {\n if (index._rawIndex.deleted || index.objectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (index.objectStore.transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n};\n\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#idl-def-IDBIndex\nclass FDBIndex {\n constructor(objectStore, rawIndex) {\n this._rawIndex = rawIndex;\n this._name = rawIndex.name;\n this.objectStore = objectStore;\n this.keyPath = getKeyPath(rawIndex.keyPath);\n this.multiEntry = rawIndex.multiEntry;\n this.unique = rawIndex.unique;\n }\n get name() {\n return this._name;\n }\n\n // https://w3c.github.io/IndexedDB/#dom-idbindex-name\n set name(name) {\n const transaction = this.objectStore.transaction;\n if (!transaction.db._runningVersionchangeTransaction) {\n throw transaction._state === \"active\" ? new InvalidStateError() : new TransactionInactiveError();\n }\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n if (this._rawIndex.deleted || this.objectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n name = String(name);\n if (name === this._name) {\n return;\n }\n if (this.objectStore.indexNames.contains(name)) {\n throw new ConstraintError();\n }\n const oldName = this._name;\n const oldIndexNames = [...this.objectStore.indexNames];\n this._name = name;\n this._rawIndex.name = name;\n this.objectStore._indexesCache.delete(oldName);\n this.objectStore._indexesCache.set(name, this);\n this.objectStore._rawObjectStore.rawIndexes.delete(oldName);\n this.objectStore._rawObjectStore.rawIndexes.set(name, this._rawIndex);\n this.objectStore.indexNames = new FakeDOMStringList(...Array.from(this.objectStore._rawObjectStore.rawIndexes.keys()).filter(indexName => {\n const index = this.objectStore._rawObjectStore.rawIndexes.get(indexName);\n return index && !index.deleted;\n }).sort());\n\n // https://www.w3.org/TR/IndexedDB/#abort-an-upgrade-transaction - \"If handle’s index was not newly created during transaction, set handle’s name to its index’s name.\"\n if (!this.objectStore.transaction._createdIndexes.has(this._rawIndex)) {\n transaction._rollbackLog.push(() => {\n this._name = oldName;\n this._rawIndex.name = oldName;\n this.objectStore._indexesCache.delete(name);\n this.objectStore._indexesCache.set(oldName, this);\n this.objectStore._rawObjectStore.rawIndexes.delete(name);\n this.objectStore._rawObjectStore.rawIndexes.set(oldName, this._rawIndex);\n this.objectStore.indexNames = new FakeDOMStringList(...oldIndexNames);\n });\n }\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBIndex-openCursor-IDBRequest-any-range-IDBCursorDirection-direction\n openCursor(range, direction) {\n confirmActiveTransaction(this);\n if (range === null) {\n range = undefined;\n }\n if (range !== undefined && !(range instanceof FDBKeyRange)) {\n range = FDBKeyRange.only(valueToKey(range));\n }\n const request = new FDBRequest();\n request.source = this;\n request.transaction = this.objectStore.transaction;\n const cursor = new FDBCursorWithValue(this, range, direction, request);\n return this.objectStore.transaction._execRequestAsync({\n operation: cursor._iterate.bind(cursor),\n request,\n source: this\n });\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBIndex-openKeyCursor-IDBRequest-any-range-IDBCursorDirection-direction\n openKeyCursor(range, direction) {\n confirmActiveTransaction(this);\n if (range === null) {\n range = undefined;\n }\n if (range !== undefined && !(range instanceof FDBKeyRange)) {\n range = FDBKeyRange.only(valueToKey(range));\n }\n const request = new FDBRequest();\n request.source = this;\n request.transaction = this.objectStore.transaction;\n const cursor = new FDBCursor(this, range, direction, request, true);\n return this.objectStore.transaction._execRequestAsync({\n operation: cursor._iterate.bind(cursor),\n request,\n source: this\n });\n }\n get(key) {\n confirmActiveTransaction(this);\n if (!(key instanceof FDBKeyRange)) {\n key = valueToKey(key);\n }\n return this.objectStore.transaction._execRequestAsync({\n operation: this._rawIndex.getValue.bind(this._rawIndex, key),\n source: this\n });\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbindex-getall\n getAll(queryOrOptions, count) {\n const options = extractGetAllOptions(queryOrOptions, count, arguments.length);\n confirmActiveTransaction(this);\n const range = valueToKeyRange(options.query);\n return this.objectStore.transaction._execRequestAsync({\n operation: this._rawIndex.getAllValues.bind(this._rawIndex, range, options.count, options.direction),\n source: this\n });\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBIndex-getKey-IDBRequest-any-key\n getKey(key) {\n confirmActiveTransaction(this);\n if (!(key instanceof FDBKeyRange)) {\n key = valueToKey(key);\n }\n return this.objectStore.transaction._execRequestAsync({\n operation: this._rawIndex.getKey.bind(this._rawIndex, key),\n source: this\n });\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbindex-getallkeys\n getAllKeys(queryOrOptions, count) {\n const options = extractGetAllOptions(queryOrOptions, count, arguments.length);\n confirmActiveTransaction(this);\n const range = valueToKeyRange(options.query);\n return this.objectStore.transaction._execRequestAsync({\n operation: this._rawIndex.getAllKeys.bind(this._rawIndex, range, options.count, options.direction),\n source: this\n });\n }\n\n // https://www.w3.org/TR/IndexedDB/#dom-idbobjectstore-getallrecords\n getAllRecords(options) {\n let query;\n let count;\n let direction;\n if (options !== undefined) {\n if (options.query !== undefined) {\n query = options.query;\n }\n if (options.count !== undefined) {\n count = enforceRange(options.count, \"unsigned long\");\n }\n if (options.direction !== undefined) {\n direction = options.direction;\n }\n }\n confirmActiveTransaction(this);\n const range = valueToKeyRange(query);\n return this.objectStore.transaction._execRequestAsync({\n operation: this._rawIndex.getAllRecords.bind(this._rawIndex, range, count, direction),\n source: this\n });\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBIndex-count-IDBRequest-any-key\n count(key) {\n confirmActiveTransaction(this);\n if (key === null) {\n key = undefined;\n }\n if (key !== undefined && !(key instanceof FDBKeyRange)) {\n key = FDBKeyRange.only(valueToKey(key));\n }\n return this.objectStore.transaction._execRequestAsync({\n operation: () => {\n return this._rawIndex.count(key);\n },\n source: this\n });\n }\n get [Symbol.toStringTag]() {\n return \"IDBIndex\";\n }\n}\nexport default FDBIndex;",
|
|
24
|
+
"// http://w3c.github.io/IndexedDB/#check-that-a-key-could-be-injected-into-a-value\nconst canInjectKey = (keyPath, value) => {\n if (Array.isArray(keyPath)) {\n throw new Error(\"The key paths used in this section are always strings and never sequences, since it is not possible to create a object store which has a key generator and also has a key path that is a sequence.\");\n }\n const identifiers = keyPath.split(\".\");\n if (identifiers.length === 0) {\n throw new Error(\"Assert: identifiers is not empty\");\n }\n identifiers.pop();\n for (const identifier of identifiers) {\n if (typeof value !== \"object\" && !Array.isArray(value)) {\n return false;\n }\n const hop = Object.hasOwn(value, identifier);\n if (!hop) {\n return true;\n }\n value = value[identifier];\n }\n return typeof value === \"object\" || Array.isArray(value);\n};\nexport default canInjectKey;",
|
|
25
|
+
"class FDBRecord {\n constructor(key, primaryKey, value) {\n this._key = key;\n this._primaryKey = primaryKey;\n this._value = value;\n }\n get key() {\n return this._key;\n }\n set key(_) {\n /* for babel */\n }\n get primaryKey() {\n return this._primaryKey;\n }\n set primaryKey(_) {\n /* for babel */\n }\n get value() {\n return this._value;\n }\n set value(_) {\n /* for babel */\n }\n get [Symbol.toStringTag]() {\n return \"IDBRecord\";\n }\n}\nexport default FDBRecord;",
|
|
26
|
+
"import FDBKeyRange from \"../FDBKeyRange.js\";\nimport cmp from \"./cmp.js\";\nimport { ConstraintError } from \"./errors.js\";\n// what fraction of the total number of nodes are allowed to be deleted tombstones?\nconst MAX_TOMBSTONE_FACTOR = 2 / 3;\nconst EVERYTHING_KEY_RANGE = new FDBKeyRange(undefined, undefined, false, false);\n/**\n * Simple red-black binary tree with some aspects of a scapegoat tree. The main goal here is simplicity of\n * implementation, tailored to the needs of IndexedDB.\n *\n * Basically this implements a [red-black tree][1] for insertions, but uses the much simpler [scapegoat tree][2]\n * strategy for deletions. Deletions are a simple matter of rebuilding the tree from scratch if more than 2/3 of the\n * tree is full of deleted (tombstone) markers.\n *\n * [1]: https://en.wikipedia.org/wiki/Red%E2%80%93black_tree\n * [2]: https://en.wikipedia.org/wiki/Scapegoat_tree\n */\nexport default class BinarySearchTree {\n _numTombstones = 0;\n _numNodes = 0;\n\n /**\n *\n * @param keysAreUnique - whether keys can be unique, and thus whether we cn skip checking `record.value` when\n * comparing. This is basically used to distinguish ObjectStores (where the value is the entire object, not used\n * as a key) from non-unique Indexes (where both the key and the value are meaningful keys used for sorting)\n */\n constructor(keysAreUnique) {\n this._keysAreUnique = !!keysAreUnique;\n }\n size() {\n return this._numNodes - this._numTombstones;\n }\n get(record) {\n return this._getByComparator(this._root, otherRecord => this._compare(record, otherRecord));\n }\n contains(record) {\n return !!this.get(record);\n }\n _compare(a, b) {\n const keyComparison = cmp(a.key, b.key);\n if (keyComparison !== 0) {\n return keyComparison;\n }\n // if keys are unique, then we can (and must) avoid comparing the values, since they may be non-comparable\n // (e.g. in the case of an ObjectStore, they are record objects)\n return this._keysAreUnique ? 0 : cmp(a.value, b.value);\n }\n _getByComparator(node, comparator) {\n let current = node;\n while (current) {\n const comparison = comparator(current.record);\n if (comparison < 0) {\n current = current.left;\n } else if (comparison > 0) {\n current = current.right;\n } else {\n return current.record;\n }\n }\n }\n\n /**\n * Put a new record, and return the overwritten record if an overwrite occurred.\n * @param record\n * @param noOverwrite - throw a ConstraintError in case of overwrite\n */\n put(record, noOverwrite = false) {\n if (!this._root) {\n this._root = {\n record,\n left: undefined,\n right: undefined,\n parent: undefined,\n deleted: false,\n // the root is always black in a red-black tree\n red: false\n };\n this._numNodes++;\n return;\n }\n return this._put(this._root, record, noOverwrite);\n }\n _put(node, record, noOverwrite) {\n const comparison = this._compare(record, node.record);\n if (comparison < 0) {\n if (node.left) {\n return this._put(node.left, record, noOverwrite);\n } else {\n node.left = {\n record,\n left: undefined,\n right: undefined,\n parent: node,\n deleted: false,\n red: true\n };\n this._onNewNodeInserted(node.left);\n }\n } else if (comparison > 0) {\n if (node.right) {\n return this._put(node.right, record, noOverwrite);\n } else {\n node.right = {\n record,\n left: undefined,\n right: undefined,\n parent: node,\n deleted: false,\n red: true\n };\n this._onNewNodeInserted(node.right);\n }\n } else if (node.deleted) {\n // undelete\n node.deleted = false;\n node.record = record;\n this._numTombstones--;\n } else if (noOverwrite) {\n // replace not allowed in case of noOverwrite\n throw new ConstraintError();\n } else {\n // replace, don't add, so no need to increment. return the overwritten record\n const overwrittenRecord = node.record;\n node.record = record;\n return overwrittenRecord;\n }\n }\n delete(record) {\n if (!this._root) {\n return;\n }\n this._delete(this._root, record);\n if (this._numTombstones > this._numNodes * MAX_TOMBSTONE_FACTOR) {\n // to keep the implementation simple, and because most users of fake-indexeddb are not going to be deleting\n // a lot of nodes, just rebuild the whole tree (defragment) if the tree is too full of tombstones,\n // as inspired by the scapegoat tree: https://en.wikipedia.org/wiki/Scapegoat_tree#Deletion\n const records = [...this.getAllRecords()];\n this._root = this._rebuild(records, undefined, false);\n this._numNodes = records.length;\n this._numTombstones = 0;\n }\n }\n _delete(node, record) {\n if (!node) {\n return;\n }\n const comparison = this._compare(record, node.record);\n if (comparison < 0) {\n this._delete(node.left, record);\n } else if (comparison > 0) {\n this._delete(node.right, record);\n } else if (!node.deleted) {\n this._numTombstones++;\n node.deleted = true;\n }\n }\n *getAllRecords(descending = false) {\n yield* this.getRecords(EVERYTHING_KEY_RANGE, descending);\n }\n *getRecords(keyRange, descending = false) {\n yield* this._getRecordsForNode(this._root, keyRange, descending);\n }\n *_getRecordsForNode(node, keyRange, descending = false) {\n if (!node) {\n return;\n }\n yield* this._findRecords(node, keyRange, descending);\n }\n *_findRecords(node, keyRange, descending = false) {\n const {\n lower,\n upper,\n lowerOpen,\n upperOpen\n } = keyRange;\n const {\n record: {\n key\n }\n } = node;\n const lowerComparison = lower === undefined ? -1 : cmp(lower, key);\n const upperComparison = upper === undefined ? 1 : cmp(upper, key);\n\n // if keys are non-unique then we need to go left/right even for equality\n // else we can just do LT/GT rather than LTE/GTE as a slight optimization\n const moreLeft = this._keysAreUnique ? lowerComparison < 0 : lowerComparison <= 0;\n const moreRight = this._keysAreUnique ? upperComparison > 0 : upperComparison >= 0;\n\n // in descending mode we start with rightmost nodes, else leftmost\n const moreStart = descending ? moreRight : moreLeft;\n const moreEnd = descending ? moreLeft : moreRight;\n const start = descending ? \"right\" : \"left\";\n const end = descending ? \"left\" : \"right\";\n\n // does the current record actually match the key range?\n const lowerMatches = lowerOpen ? lowerComparison < 0 : lowerComparison <= 0;\n const upperMatches = upperOpen ? upperComparison > 0 : upperComparison >= 0;\n if (moreStart && node[start]) {\n yield* this._findRecords(node[start], keyRange, descending);\n }\n if (lowerMatches && upperMatches && !node.deleted) {\n yield node.record;\n }\n if (moreEnd && node[end]) {\n yield* this._findRecords(node[end], keyRange, descending);\n }\n }\n _onNewNodeInserted(newNode) {\n this._numNodes++;\n this._rebalanceTree(newNode);\n }\n\n // based on https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#Insertion\n _rebalanceTree(node) {\n let parent = node.parent;\n do {\n // case 1 - no red/black violation\n if (!parent.red) {\n return;\n }\n const grandparent = parent.parent;\n if (!grandparent) {\n // case #4 - parent is the red root, node is also red, so parent goes black\n parent.red = false;\n return;\n }\n const parentIsRightChild = parent === grandparent.right;\n const uncle = parentIsRightChild ? grandparent.left : grandparent.right;\n if (!uncle || !uncle.red) {\n if (node === (parentIsRightChild ? parent.left : parent.right)) {\n // case #5 - parent is red but uncle is black\n this._rotateSubtree(parent, parentIsRightChild);\n node = parent;\n parent = parentIsRightChild ? grandparent.right : grandparent.left;\n }\n\n // case #6 - node is \"outer\" grandchild of grandparent\n this._rotateSubtree(grandparent, !parentIsRightChild);\n parent.red = false;\n grandparent.red = true;\n return;\n }\n\n // case #2 - parent and uncle are both red, so both of them go black and grandparent goes red\n parent.red = false;\n uncle.red = false;\n grandparent.red = true;\n node = grandparent;\n } while (node.parent ? parent = node.parent : false);\n\n // case #3 - current node is the root, all constraints satisfied\n }\n\n // based on https://en.wikipedia.org/wiki/Red%E2%80%93black_tree#Implementation\n _rotateSubtree(node, right) {\n const parent = node.parent;\n const newRoot = right ? node.left : node.right; // opposite direction\n const newChild = right ? newRoot.right : newRoot.left;\n node[right ? \"left\" : \"right\"] = newChild;\n if (newChild) {\n newChild.parent = node;\n }\n newRoot[right ? \"right\" : \"left\"] = node;\n newRoot.parent = parent;\n node.parent = newRoot;\n if (parent) {\n parent[node === parent.right ? \"right\" : \"left\"] = newRoot;\n } else {\n this._root = newRoot;\n }\n return newRoot;\n }\n\n // rebuild the whole tree from scratch, used to avoid too many deletion tombstones accumulating\n _rebuild(records, parent, red) {\n const {\n length\n } = records;\n if (!length) {\n return undefined;\n }\n const mid = length >>> 1; // like Math.floor(records.length / 2) but fast\n\n const node = {\n record: records[mid],\n left: undefined,\n right: undefined,\n parent,\n deleted: false,\n red\n };\n const left = this._rebuild(records.slice(0, mid), node, !red);\n const right = this._rebuild(records.slice(mid + 1), node, !red);\n node.left = left;\n node.right = right;\n return node;\n }\n}",
|
|
27
|
+
"import FDBKeyRange from \"../FDBKeyRange.js\";\nimport cmp from \"./cmp.js\";\nimport BinarySearchTree from \"./binarySearchTree.js\";\nclass RecordStore {\n constructor(keysAreUnique) {\n this.keysAreUnique = keysAreUnique;\n this.records = new BinarySearchTree(this.keysAreUnique);\n }\n get(key) {\n const range = key instanceof FDBKeyRange ? key : FDBKeyRange.only(key);\n return this.records.getRecords(range).next().value;\n }\n\n /**\n * Put a new record, and return the overwritten record if an overwrite occurred.\n * @param newRecord\n * @param noOverwrite - throw a ConstraintError in case of overwrite\n */\n put(newRecord, noOverwrite = false) {\n return this.records.put(newRecord, noOverwrite);\n }\n delete(key) {\n const range = key instanceof FDBKeyRange ? key : FDBKeyRange.only(key);\n const deletedRecords = [...this.records.getRecords(range)];\n for (const record of deletedRecords) {\n this.records.delete(record);\n }\n return deletedRecords;\n }\n deleteByValue(key) {\n const range = key instanceof FDBKeyRange ? key : FDBKeyRange.only(key);\n const deletedRecords = [];\n for (const record of this.records.getAllRecords()) {\n if (range.includes(record.value)) {\n this.records.delete(record);\n deletedRecords.push(record);\n }\n }\n return deletedRecords;\n }\n clear() {\n const deletedRecords = [...this.records.getAllRecords()];\n this.records = new BinarySearchTree(this.keysAreUnique);\n return deletedRecords;\n }\n values(range, direction = \"next\") {\n const descending = direction === \"prev\" || direction === \"prevunique\";\n const records = range ? this.records.getRecords(range, descending) : this.records.getAllRecords(descending);\n return {\n [Symbol.iterator]: () => {\n const next = () => {\n return records.next();\n };\n if (direction === \"next\" || direction === \"prev\") {\n return {\n next\n };\n }\n\n // For nextunique/prevunique, return an iterator that skips seen values\n // Note that we must return the _lowest_ value regardless of direction:\n // > Iterating with \"prevunique\" visits the same records that \"nextunique\"\n // > visits, but in reverse order.\n // https://w3c.github.io/IndexedDB/#dom-idbcursordirection-prevunique\n if (direction === \"nextunique\") {\n let previousValue = undefined;\n return {\n next: () => {\n let current = next();\n // for nextunique, continue if we already emitted the lowest unique value\n while (!current.done && previousValue !== undefined && cmp(previousValue.key, current.value.key) === 0) {\n current = next();\n }\n previousValue = current.value;\n return current;\n }\n };\n }\n\n // prevunique is a bit more complex due to needing to check the next value, which\n // invokes the iterable, so we need to keep a buffer of one \"lookahead\" result\n let current = next();\n let nextResult = next();\n return {\n next: () => {\n while (!nextResult.done && cmp(current.value.key, nextResult.value.key) === 0) {\n // note we return the _lowest_ possible value, hence set the current\n current = nextResult;\n nextResult = next();\n }\n const result = current;\n current = nextResult;\n nextResult = next();\n return result;\n }\n };\n }\n };\n }\n size() {\n return this.records.size();\n }\n}\nexport default RecordStore;",
|
|
28
|
+
"import FDBRecord from \"../FDBRecord.js\";\nimport { ConstraintError } from \"./errors.js\";\nimport extractKey from \"./extractKey.js\";\nimport RecordStore from \"./RecordStore.js\";\nimport valueToKey from \"./valueToKey.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-index\nclass Index {\n deleted = false;\n // Initialized should be used to decide whether to throw an error or abort the versionchange transaction when there is a\n // constraint\n initialized = false;\n constructor(rawObjectStore, name, keyPath, multiEntry, unique) {\n this.rawObjectStore = rawObjectStore;\n this.name = name;\n this.keyPath = keyPath;\n this.multiEntry = multiEntry;\n this.unique = unique;\n this.records = new RecordStore(unique);\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-retrieving-a-value-from-an-index\n getKey(key) {\n const record = this.records.get(key);\n return record !== undefined ? record.value : undefined;\n }\n\n // http://w3c.github.io/IndexedDB/#retrieve-multiple-referenced-values-from-an-index\n getAllKeys(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(structuredClone(record.value));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#index-referenced-value-retrieval-operation\n getValue(key) {\n const record = this.records.get(key);\n return record !== undefined ? this.rawObjectStore.getValue(record.value) : undefined;\n }\n\n // http://w3c.github.io/IndexedDB/#retrieve-multiple-referenced-values-from-an-index\n getAllValues(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(this.rawObjectStore.getValue(record.value));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // https://www.w3.org/TR/IndexedDB/#dom-idbindex-getallrecords\n getAllRecords(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(new FDBRecord(structuredClone(record.key), structuredClone(this.rawObjectStore.getKey(record.value)), this.rawObjectStore.getValue(record.value)));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-storing-a-record-into-an-object-store (step 7)\n storeRecord(newRecord) {\n let indexKey;\n try {\n indexKey = extractKey(this.keyPath, newRecord.value).key;\n } catch (err) {\n if (err.name === \"DataError\") {\n // Invalid key is not an actual error, just means we do not store an entry in this index\n return;\n }\n throw err;\n }\n if (!this.multiEntry || !Array.isArray(indexKey)) {\n try {\n valueToKey(indexKey);\n } catch (e) {\n return;\n }\n } else {\n // remove any elements from index key that are not valid keys and remove any duplicate elements from index\n // key such that only one instance of the duplicate value remains.\n const keep = [];\n for (const part of indexKey) {\n if (keep.indexOf(part) < 0) {\n try {\n keep.push(valueToKey(part));\n } catch (err) {\n /* Do nothing */\n }\n }\n }\n indexKey = keep;\n }\n if (!this.multiEntry || !Array.isArray(indexKey)) {\n if (this.unique) {\n const existingRecord = this.records.get(indexKey);\n if (existingRecord) {\n throw new ConstraintError();\n }\n }\n } else {\n if (this.unique) {\n for (const individualIndexKey of indexKey) {\n const existingRecord = this.records.get(individualIndexKey);\n if (existingRecord) {\n throw new ConstraintError();\n }\n }\n }\n }\n if (!this.multiEntry || !Array.isArray(indexKey)) {\n this.records.put({\n key: indexKey,\n value: newRecord.key\n });\n } else {\n for (const individualIndexKey of indexKey) {\n this.records.put({\n key: individualIndexKey,\n value: newRecord.key\n });\n }\n }\n }\n initialize(transaction) {\n if (this.initialized) {\n throw new Error(\"Index already initialized\");\n }\n transaction._execRequestAsync({\n operation: () => {\n try {\n // Create index based on current value of objectstore\n for (const record of this.rawObjectStore.records.values()) {\n this.storeRecord(record);\n }\n this.initialized = true;\n } catch (err) {\n // console.error(err);\n transaction._abort(err.name);\n }\n },\n source: null\n });\n }\n count(range) {\n let count = 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const record of this.records.values(range)) {\n count += 1;\n }\n return count;\n }\n}\nexport default Index;",
|
|
29
|
+
"import { SyntaxError } from \"./errors.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-valid-key-path\nconst validateKeyPath = (keyPath, parent) => {\n // This doesn't make sense to me based on the spec, but it is needed to pass the W3C KeyPath tests (see same\n // comment in extractKey)\n if (keyPath !== undefined && keyPath !== null && typeof keyPath !== \"string\" && keyPath.toString && (parent === \"array\" || !Array.isArray(keyPath))) {\n keyPath = keyPath.toString();\n }\n if (typeof keyPath === \"string\") {\n if (keyPath === \"\" && parent !== \"string\") {\n return;\n }\n try {\n // https://mathiasbynens.be/demo/javascript-identifier-regex for ECMAScript 5.1 / Unicode v7.0.0, with\n // reserved words at beginning removed\n const validIdentifierRegex =\n // eslint-disable-next-line no-misleading-character-class\n /^(?:[$A-Z_a-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])(?:[$0-9A-Z_a-z\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC])*$/;\n if (keyPath.length >= 1 && validIdentifierRegex.test(keyPath)) {\n return;\n }\n } catch (err) {\n throw new SyntaxError(err.message);\n }\n if (keyPath.indexOf(\" \") >= 0) {\n throw new SyntaxError(\"The keypath argument contains an invalid key path (no spaces allowed).\");\n }\n }\n if (Array.isArray(keyPath) && keyPath.length > 0) {\n if (parent) {\n // No nested arrays\n throw new SyntaxError(\"The keypath argument contains an invalid key path (nested arrays).\");\n }\n for (const part of keyPath) {\n validateKeyPath(part, \"array\");\n }\n return;\n } else if (typeof keyPath === \"string\" && keyPath.indexOf(\".\") >= 0) {\n keyPath = keyPath.split(\".\");\n for (const part of keyPath) {\n validateKeyPath(part, \"string\");\n }\n return;\n }\n throw new SyntaxError();\n};\nexport default validateKeyPath;",
|
|
30
|
+
"import FDBCursor from \"./FDBCursor.js\";\nimport FDBCursorWithValue from \"./FDBCursorWithValue.js\";\nimport FDBIndex from \"./FDBIndex.js\";\nimport FDBKeyRange from \"./FDBKeyRange.js\";\nimport FDBRequest from \"./FDBRequest.js\";\nimport canInjectKey from \"./lib/canInjectKey.js\";\nimport { ConstraintError, DataError, InvalidAccessError, InvalidStateError, NotFoundError, ReadOnlyError, TransactionInactiveError } from \"./lib/errors.js\";\nimport extractKey from \"./lib/extractKey.js\";\nimport FakeDOMStringList from \"./lib/FakeDOMStringList.js\";\nimport Index from \"./lib/Index.js\";\nimport validateKeyPath from \"./lib/validateKeyPath.js\";\nimport valueToKey from \"./lib/valueToKey.js\";\nimport valueToKeyRange from \"./lib/valueToKeyRange.js\";\nimport { getKeyPath } from \"./lib/getKeyPath.js\";\nimport extractGetAllOptions from \"./lib/extractGetAllOptions.js\";\nimport enforceRange from \"./lib/enforceRange.js\";\nimport { cloneValueForInsertion } from \"./lib/cloneValueForInsertion.js\";\nconst confirmActiveTransaction = objectStore => {\n if (objectStore._rawObjectStore.deleted) {\n throw new InvalidStateError();\n }\n if (objectStore.transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n};\nconst buildRecordAddPut = (objectStore, value, key) => {\n confirmActiveTransaction(objectStore);\n if (objectStore.transaction.mode === \"readonly\") {\n throw new ReadOnlyError();\n }\n if (objectStore.keyPath !== null) {\n if (key !== undefined) {\n throw new DataError();\n }\n }\n const clone = cloneValueForInsertion(value, objectStore.transaction);\n if (objectStore.keyPath !== null) {\n const tempKey = extractKey(objectStore.keyPath, clone);\n if (tempKey.type === \"found\") {\n valueToKey(tempKey.key);\n } else {\n if (!objectStore._rawObjectStore.keyGenerator) {\n throw new DataError();\n } else if (!canInjectKey(objectStore.keyPath, clone)) {\n throw new DataError();\n }\n }\n }\n if (objectStore.keyPath === null && objectStore._rawObjectStore.keyGenerator === null && key === undefined) {\n throw new DataError();\n }\n if (key !== undefined) {\n key = valueToKey(key);\n }\n return {\n key,\n value: clone\n };\n};\n\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#object-store\nclass FDBObjectStore {\n _indexesCache = new Map();\n constructor(transaction, rawObjectStore) {\n this._rawObjectStore = rawObjectStore;\n this._name = rawObjectStore.name;\n this.keyPath = getKeyPath(rawObjectStore.keyPath);\n this.autoIncrement = rawObjectStore.autoIncrement;\n this.transaction = transaction;\n this.indexNames = new FakeDOMStringList(...Array.from(rawObjectStore.rawIndexes.keys()).sort());\n }\n get name() {\n return this._name;\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbobjectstore-name\n set name(name) {\n const transaction = this.transaction;\n if (!transaction.db._runningVersionchangeTransaction) {\n throw transaction._state === \"active\" ? new InvalidStateError() : new TransactionInactiveError();\n }\n confirmActiveTransaction(this);\n name = String(name);\n if (name === this._name) {\n return;\n }\n if (this._rawObjectStore.rawDatabase.rawObjectStores.has(name)) {\n throw new ConstraintError();\n }\n const oldName = this._name;\n const oldObjectStoreNames = [...transaction.db.objectStoreNames];\n this._name = name;\n this._rawObjectStore.name = name;\n this.transaction._objectStoresCache.delete(oldName);\n this.transaction._objectStoresCache.set(name, this);\n this._rawObjectStore.rawDatabase.rawObjectStores.delete(oldName);\n this._rawObjectStore.rawDatabase.rawObjectStores.set(name, this._rawObjectStore);\n transaction.db.objectStoreNames = new FakeDOMStringList(...Array.from(this._rawObjectStore.rawDatabase.rawObjectStores.keys()).filter(objectStoreName => {\n const objectStore = this._rawObjectStore.rawDatabase.rawObjectStores.get(objectStoreName);\n return objectStore && !objectStore.deleted;\n }).sort());\n const oldScope = new Set(transaction._scope);\n const oldTransactionObjectStoreNames = [...transaction.objectStoreNames];\n this.transaction._scope.delete(oldName);\n transaction._scope.add(name);\n transaction.objectStoreNames = new FakeDOMStringList(...Array.from(transaction._scope).sort());\n\n // https://www.w3.org/TR/IndexedDB/#abort-an-upgrade-transaction - \"If handle’s object store was not newly created during transaction, set handle’s name to its object store’s name.\"\n if (!this.transaction._createdObjectStores.has(this._rawObjectStore)) {\n transaction._rollbackLog.push(() => {\n this._name = oldName;\n this._rawObjectStore.name = oldName;\n this.transaction._objectStoresCache.delete(name);\n this.transaction._objectStoresCache.set(oldName, this);\n this._rawObjectStore.rawDatabase.rawObjectStores.delete(name);\n this._rawObjectStore.rawDatabase.rawObjectStores.set(oldName, this._rawObjectStore);\n transaction.db.objectStoreNames = new FakeDOMStringList(...oldObjectStoreNames);\n transaction._scope = oldScope;\n transaction.objectStoreNames = new FakeDOMStringList(...oldTransactionObjectStoreNames);\n });\n }\n }\n put(value, key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n const record = buildRecordAddPut(this, value, key);\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.storeRecord.bind(this._rawObjectStore, record, false, this.transaction._rollbackLog),\n source: this\n });\n }\n add(value, key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n const record = buildRecordAddPut(this, value, key);\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.storeRecord.bind(this._rawObjectStore, record, true, this.transaction._rollbackLog),\n source: this\n });\n }\n delete(key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n confirmActiveTransaction(this);\n if (this.transaction.mode === \"readonly\") {\n throw new ReadOnlyError();\n }\n if (!(key instanceof FDBKeyRange)) {\n key = valueToKey(key);\n }\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.deleteRecord.bind(this._rawObjectStore, key, this.transaction._rollbackLog),\n source: this\n });\n }\n get(key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n confirmActiveTransaction(this);\n if (!(key instanceof FDBKeyRange)) {\n key = valueToKey(key);\n }\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.getValue.bind(this._rawObjectStore, key),\n source: this\n });\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbobjectstore-getall\n getAll(queryOrOptions, count) {\n const options = extractGetAllOptions(queryOrOptions, count, arguments.length);\n confirmActiveTransaction(this);\n const range = valueToKeyRange(options.query);\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.getAllValues.bind(this._rawObjectStore, range, options.count, options.direction),\n source: this\n });\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbobjectstore-getkey\n getKey(key) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n confirmActiveTransaction(this);\n if (!(key instanceof FDBKeyRange)) {\n key = valueToKey(key);\n }\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.getKey.bind(this._rawObjectStore, key),\n source: this\n });\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbobjectstore-getallkeys\n getAllKeys(queryOrOptions, count) {\n const options = extractGetAllOptions(queryOrOptions, count, arguments.length);\n confirmActiveTransaction(this);\n const range = valueToKeyRange(options.query);\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.getAllKeys.bind(this._rawObjectStore, range, options.count, options.direction),\n source: this\n });\n }\n\n // https://www.w3.org/TR/IndexedDB/#dom-idbobjectstore-getallrecords\n getAllRecords(options) {\n let query;\n let count;\n let direction;\n if (options !== undefined) {\n if (options.query !== undefined) {\n query = options.query;\n }\n if (options.count !== undefined) {\n count = enforceRange(options.count, \"unsigned long\");\n }\n if (options.direction !== undefined) {\n direction = options.direction;\n }\n }\n confirmActiveTransaction(this);\n const range = valueToKeyRange(query);\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.getAllRecords.bind(this._rawObjectStore, range, count, direction),\n source: this\n });\n }\n clear() {\n confirmActiveTransaction(this);\n if (this.transaction.mode === \"readonly\") {\n throw new ReadOnlyError();\n }\n return this.transaction._execRequestAsync({\n operation: this._rawObjectStore.clear.bind(this._rawObjectStore, this.transaction._rollbackLog),\n source: this\n });\n }\n openCursor(range, direction) {\n confirmActiveTransaction(this);\n if (range === null) {\n range = undefined;\n }\n if (range !== undefined && !(range instanceof FDBKeyRange)) {\n range = FDBKeyRange.only(valueToKey(range));\n }\n const request = new FDBRequest();\n request.source = this;\n request.transaction = this.transaction;\n const cursor = new FDBCursorWithValue(this, range, direction, request);\n return this.transaction._execRequestAsync({\n operation: cursor._iterate.bind(cursor),\n request,\n source: this\n });\n }\n openKeyCursor(range, direction) {\n confirmActiveTransaction(this);\n if (range === null) {\n range = undefined;\n }\n if (range !== undefined && !(range instanceof FDBKeyRange)) {\n range = FDBKeyRange.only(valueToKey(range));\n }\n const request = new FDBRequest();\n request.source = this;\n request.transaction = this.transaction;\n const cursor = new FDBCursor(this, range, direction, request, true);\n return this.transaction._execRequestAsync({\n operation: cursor._iterate.bind(cursor),\n request,\n source: this\n });\n }\n\n // tslint:-next-line max-line-length\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBObjectStore-createIndex-IDBIndex-DOMString-name-DOMString-sequence-DOMString--keyPath-IDBIndexParameters-optionalParameters\n createIndex(name, keyPath, optionalParameters = {}) {\n if (arguments.length < 2) {\n throw new TypeError();\n }\n const multiEntry = optionalParameters.multiEntry !== undefined ? optionalParameters.multiEntry : false;\n const unique = optionalParameters.unique !== undefined ? optionalParameters.unique : false;\n if (this.transaction.mode !== \"versionchange\") {\n throw new InvalidStateError();\n }\n confirmActiveTransaction(this);\n if (this.indexNames.contains(name)) {\n throw new ConstraintError();\n }\n validateKeyPath(keyPath);\n if (Array.isArray(keyPath) && multiEntry) {\n throw new InvalidAccessError();\n }\n\n // The index that is requested to be created can contain constraints on the data allowed in the index's\n // referenced object store, such as requiring uniqueness of the values referenced by the index's keyPath. If the\n // referenced object store already contains data which violates these constraints, this MUST NOT cause the\n // implementation of createIndex to throw an exception or affect what it returns. The implementation MUST still\n // create and return an IDBIndex object. Instead the implementation must queue up an operation to abort the\n // \"versionchange\" transaction which was used for the createIndex call.\n\n // Save for rollbackLog\n const indexNames = [...this.indexNames];\n const index = new Index(this._rawObjectStore, name, keyPath, multiEntry, unique);\n this.indexNames._push(name);\n this.indexNames._sort();\n this.transaction._createdIndexes.add(index);\n this._rawObjectStore.rawIndexes.set(name, index);\n index.initialize(this.transaction); // This is async by design\n\n this.transaction._rollbackLog.push(() => {\n index.deleted = true;\n this.indexNames = new FakeDOMStringList(...indexNames);\n this._rawObjectStore.rawIndexes.delete(index.name);\n });\n return new FDBIndex(this, index);\n }\n\n // https://w3c.github.io/IndexedDB/#dom-idbobjectstore-index\n index(name) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n if (this._rawObjectStore.deleted || this.transaction._state === \"finished\") {\n throw new InvalidStateError();\n }\n const index = this._indexesCache.get(name);\n if (index !== undefined) {\n return index;\n }\n const rawIndex = this._rawObjectStore.rawIndexes.get(name);\n if (!this.indexNames.contains(name) || rawIndex === undefined) {\n throw new NotFoundError();\n }\n const index2 = new FDBIndex(this, rawIndex);\n this._indexesCache.set(name, index2);\n return index2;\n }\n deleteIndex(name) {\n if (arguments.length === 0) {\n throw new TypeError();\n }\n if (this.transaction.mode !== \"versionchange\") {\n throw new InvalidStateError();\n }\n confirmActiveTransaction(this);\n const rawIndex = this._rawObjectStore.rawIndexes.get(name);\n if (rawIndex === undefined) {\n throw new NotFoundError();\n }\n this.transaction._rollbackLog.push(() => {\n rawIndex.deleted = false;\n this._rawObjectStore.rawIndexes.set(rawIndex.name, rawIndex);\n this.indexNames._push(rawIndex.name);\n this.indexNames._sort();\n });\n this.indexNames = new FakeDOMStringList(...Array.from(this.indexNames).filter(indexName => {\n return indexName !== name;\n }));\n rawIndex.deleted = true; // Not sure if this is supposed to happen synchronously\n\n this.transaction._execRequestAsync({\n operation: () => {\n const rawIndex2 = this._rawObjectStore.rawIndexes.get(name);\n\n // Hack in case another index is given this name before this async request is processed. It'd be better\n // to have a real unique ID for each index.\n if (rawIndex === rawIndex2) {\n this._rawObjectStore.rawIndexes.delete(name);\n }\n },\n source: this\n });\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBObjectStore-count-IDBRequest-any-key\n count(key) {\n confirmActiveTransaction(this);\n if (key === null) {\n key = undefined;\n }\n if (key !== undefined && !(key instanceof FDBKeyRange)) {\n key = FDBKeyRange.only(valueToKey(key));\n }\n return this.transaction._execRequestAsync({\n operation: () => {\n return this._rawObjectStore.count(key);\n },\n source: this\n });\n }\n get [Symbol.toStringTag]() {\n return \"IDBObjectStore\";\n }\n}\nexport default FDBObjectStore;",
|
|
31
|
+
"class Event {\n eventPath = [];\n NONE = 0;\n CAPTURING_PHASE = 1;\n AT_TARGET = 2;\n BUBBLING_PHASE = 3;\n\n // Flags\n propagationStopped = false;\n immediatePropagationStopped = false;\n canceled = false;\n initialized = true;\n dispatched = false;\n target = null;\n currentTarget = null;\n eventPhase = 0;\n defaultPrevented = false;\n isTrusted = false;\n timeStamp = Date.now();\n constructor(type, eventInitDict = {}) {\n this.type = type;\n this.bubbles = eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;\n this.cancelable = eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;\n }\n preventDefault() {\n if (this.cancelable) {\n this.canceled = true;\n }\n }\n stopPropagation() {\n this.propagationStopped = true;\n }\n stopImmediatePropagation() {\n this.propagationStopped = true;\n this.immediatePropagationStopped = true;\n }\n}\nexport default Event;",
|
|
32
|
+
"// When running within Node.js (including jsdom), we want to use setImmediate\n// (which runs immediately) rather than setTimeout (which enforces a minimum\n// delay of 1ms, and on Windows only has a resolution of 15ms or so). jsdom\n// doesn't provide setImmediate (to better match the browser environment) and\n// sandboxes scripts, but its sandbox is by necessity imperfect, so we can break\n// out of it:\n//\n// - https://github.com/jsdom/jsdom#executing-scripts\n// - https://github.com/jsdom/jsdom/issues/2729\n// - https://github.com/scala-js/scala-js-macrotask-executor/pull/17\nfunction getSetImmediateFromJsdom() {\n if (typeof navigator !== \"undefined\" && /jsdom/.test(navigator.userAgent)) {\n const outerRealmFunctionConstructor = Node.constructor;\n return new outerRealmFunctionConstructor(\"return setImmediate\")();\n } else {\n return undefined;\n }\n}\n\n// waiting on this PR for typescript types: https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1249\n\n// 'postTask' runs right after microtasks, so equivalent to setTimeout but without the 4ms clamping.\n// Using the default priority of 'user-visible' to avoid blocking input while still running fairly quickly.\n// See: https://developer.mozilla.org/en-US/docs/Web/API/Prioritized_Task_Scheduling_API#task_priorities\nconst schedulerPostTask = typeof scheduler !== \"undefined\" && (fn => scheduler.postTask(fn));\n\n// fallback for environments that don't support any of the above\nconst doSetTimeout = fn => setTimeout(fn, 0);\n\n// Schedules a task to run later. Use Node.js's setImmediate if available and\n// setTimeout otherwise. Note that options like process.nextTick or\n// queueMicrotask will likely not work: IndexedDB semantics require that\n// transactions are marked as not active when the event loop runs. The next\n// tick queue and microtask queue run within the current event loop macrotask,\n// so they'd process database operations too quickly.\nexport const queueTask = fn => {\n const setImmediate = globalThis.setImmediate || getSetImmediateFromJsdom() || schedulerPostTask || doSetTimeout;\n setImmediate(fn);\n};",
|
|
33
|
+
"import FDBObjectStore from \"./FDBObjectStore.js\";\nimport FDBRequest from \"./FDBRequest.js\";\nimport { AbortError, InvalidStateError, NotFoundError, TransactionInactiveError } from \"./lib/errors.js\";\nimport FakeDOMStringList from \"./lib/FakeDOMStringList.js\";\nimport FakeEvent from \"./lib/FakeEvent.js\";\nimport FakeEventTarget from \"./lib/FakeEventTarget.js\";\nimport { queueTask } from \"./lib/scheduling.js\";\nconst prioritizedListenerTypes = [\"error\", \"abort\", \"complete\"];\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#transaction\nclass FDBTransaction extends FakeEventTarget {\n _state = \"active\";\n _started = false;\n _rollbackLog = [];\n _objectStoresCache = new Map();\n _openRequest = null;\n error = null;\n onabort = null;\n oncomplete = null;\n onerror = null;\n _prioritizedListeners = new Map();\n _requests = [];\n _createdIndexes = new Set();\n _createdObjectStores = new Set();\n constructor(storeNames, mode, durability, db) {\n super();\n this._scope = new Set(storeNames);\n this.mode = mode;\n this.durability = durability;\n this.db = db;\n this.objectStoreNames = new FakeDOMStringList(...Array.from(this._scope).sort());\n for (const type of prioritizedListenerTypes) {\n // Attach prioritized (internal) listeners before any external listeners are attached.\n // This ensures that these listeners run with the same timing regardless of whether\n // the user uses `on*` or `addEventListener` for event listeners.\n this.addEventListener(type, () => {\n this._prioritizedListeners.get(type)?.();\n });\n }\n }\n\n // https://w3c.github.io/IndexedDB/#abort-transaction\n _abort(errName) {\n for (const f of this._rollbackLog.reverse()) {\n f();\n }\n if (errName !== null) {\n const e = new DOMException(undefined, errName);\n this.error = e;\n }\n\n // Should this directly remove from _requests?\n for (const {\n request\n } of this._requests) {\n if (request.readyState !== \"done\") {\n request.readyState = \"done\"; // This will cancel execution of this request's operation\n if (request.source) {\n // https://w3c.github.io/IndexedDB/#ref-for-list-iterate%E2%91%A2\n // For each request of transaction’s request list, abort the steps to asynchronously\n // execute a request for request, set request’s processed flag to true, and queue a\n // database task to run these steps:\n queueTask(() => {\n // Set request’s result to undefined.\n request.result = undefined;\n // Set request’s error to a newly created \"AbortError\" DOMException.\n request.error = new AbortError();\n\n // Fire an event named error at request with its bubbles and cancelable attributes initialized\n // to true.\n const event = new FakeEvent(\"error\", {\n bubbles: true,\n cancelable: true\n });\n event.eventPath = [this.db, this];\n try {\n request.dispatchEvent(event);\n } catch (_err) {\n if (this._state === \"active\") {\n this._abort(\"AbortError\");\n }\n }\n });\n }\n }\n }\n\n // Queue a database task to run these steps:\n queueTask(() => {\n // If transaction is an upgrade transaction, then set transaction’s connection’s associated database’s\n // upgrade transaction to null.\n // (i.e. remove it from the list of `db.connections`)\n const isUpgradeTransaction = this.mode === \"versionchange\";\n if (isUpgradeTransaction) {\n this.db._rawDatabase.connections = this.db._rawDatabase.connections.filter(connection => !connection._rawDatabase.transactions.includes(this));\n }\n // Fire an event named abort at transaction with its bubbles attribute initialized to true.\n const event = new FakeEvent(\"abort\", {\n bubbles: true,\n cancelable: false\n });\n event.eventPath = [this.db];\n this.dispatchEvent(event);\n\n // If transaction is an upgrade transaction, then:\n if (isUpgradeTransaction) {\n // Let request be the open request associated with transaction.\n const request = this._openRequest;\n // Set request’s transaction to null.\n request.transaction = null;\n // Set request’s result to undefined.\n request.result = undefined;\n }\n });\n this._state = \"finished\";\n }\n abort() {\n if (this._state === \"committing\" || this._state === \"finished\") {\n throw new InvalidStateError();\n }\n this._state = \"active\";\n this._abort(null);\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbtransaction-objectstore\n objectStore(name) {\n if (this._state !== \"active\") {\n throw new InvalidStateError();\n }\n const objectStore = this._objectStoresCache.get(name);\n if (objectStore !== undefined) {\n return objectStore;\n }\n const rawObjectStore = this.db._rawDatabase.rawObjectStores.get(name);\n if (!this._scope.has(name) || rawObjectStore === undefined) {\n throw new NotFoundError();\n }\n const objectStore2 = new FDBObjectStore(this, rawObjectStore);\n this._objectStoresCache.set(name, objectStore2);\n return objectStore2;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-asynchronously-executing-a-request\n _execRequestAsync(obj) {\n const source = obj.source;\n const operation = obj.operation;\n let request = Object.hasOwn(obj, \"request\") ? obj.request : null;\n if (this._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n\n // Request should only be passed for cursors\n if (!request) {\n if (!source) {\n // Special requests like indexes that just need to run some code\n request = new FDBRequest();\n } else {\n request = new FDBRequest();\n request.source = source;\n request.transaction = source.transaction;\n }\n }\n this._requests.push({\n operation,\n request\n });\n return request;\n }\n _start() {\n this._started = true;\n\n // Remove from request queue - cursor ones will be added back if necessary by cursor.continue and such\n let operation;\n let request;\n while (this._requests.length > 0) {\n const r = this._requests.shift();\n\n // This should only be false if transaction was aborted\n if (r && r.request.readyState !== \"done\") {\n request = r.request;\n operation = r.operation;\n break;\n }\n }\n if (request && operation) {\n if (!request.source) {\n // Special requests like indexes that just need to run some code, with error handling already built into\n // operation\n operation();\n } else {\n let defaultAction;\n let event;\n try {\n const result = operation();\n request.readyState = \"done\";\n request.result = result;\n request.error = undefined;\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-fire-a-success-event\n if (this._state === \"inactive\") {\n this._state = \"active\";\n }\n event = new FakeEvent(\"success\", {\n bubbles: false,\n cancelable: false\n });\n } catch (err) {\n request.readyState = \"done\";\n request.result = undefined;\n request.error = err;\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-fire-an-error-event\n if (this._state === \"inactive\") {\n this._state = \"active\";\n }\n event = new FakeEvent(\"error\", {\n bubbles: true,\n cancelable: true\n });\n defaultAction = this._abort.bind(this, err.name);\n }\n try {\n event.eventPath = [this.db, this];\n request.dispatchEvent(event);\n } catch (_err) {\n if (this._state === \"active\") {\n this._abort(\"AbortError\");\n defaultAction = undefined; // do not abort again\n }\n }\n\n // Default action of event\n if (!event.canceled) {\n if (defaultAction) {\n defaultAction();\n }\n }\n }\n\n // Give it another chance for new handlers to be set before finishing\n queueTask(this._start.bind(this));\n return;\n }\n\n // Check if transaction complete event needs to be fired\n if (this._state !== \"finished\") {\n // Either aborted or committed already\n this._state = \"finished\";\n if (!this.error) {\n const event = new FakeEvent(\"complete\");\n this.dispatchEvent(event);\n }\n }\n }\n commit() {\n if (this._state !== \"active\") {\n throw new InvalidStateError();\n }\n this._state = \"committing\";\n }\n get [Symbol.toStringTag]() {\n return \"IDBTransaction\";\n }\n}\nexport default FDBTransaction;",
|
|
34
|
+
"import { ConstraintError } from \"./errors.js\";\nconst MAX_KEY = 9007199254740992;\nclass KeyGenerator {\n // This is kind of wrong. Should start at 1 and increment only after record is saved\n num = 0;\n next() {\n if (this.num >= MAX_KEY) {\n throw new ConstraintError();\n }\n this.num += 1;\n return this.num;\n }\n\n // https://w3c.github.io/IndexedDB/#possibly-update-the-key-generator\n setIfLarger(num) {\n const value = Math.floor(Math.min(num, MAX_KEY)) - 1;\n if (value >= this.num) {\n this.num = value + 1;\n }\n }\n}\nexport default KeyGenerator;",
|
|
35
|
+
"import FDBRecord from \"../FDBRecord.js\";\nimport { DataError } from \"./errors.js\";\nimport extractKey from \"./extractKey.js\";\nimport KeyGenerator from \"./KeyGenerator.js\";\nimport RecordStore from \"./RecordStore.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-object-store\nclass ObjectStore {\n deleted = false;\n records = new RecordStore(true);\n rawIndexes = new Map();\n constructor(rawDatabase, name, keyPath, autoIncrement) {\n this.rawDatabase = rawDatabase;\n this.keyGenerator = autoIncrement === true ? new KeyGenerator() : null;\n this.deleted = false;\n this.name = name;\n this.keyPath = keyPath;\n this.autoIncrement = autoIncrement;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-retrieving-a-value-from-an-object-store\n getKey(key) {\n const record = this.records.get(key);\n return record !== undefined ? structuredClone(record.key) : undefined;\n }\n\n // http://w3c.github.io/IndexedDB/#retrieve-multiple-keys-from-an-object-store\n getAllKeys(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(structuredClone(record.key));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-retrieving-a-value-from-an-object-store\n getValue(key) {\n const record = this.records.get(key);\n return record !== undefined ? structuredClone(record.value) : undefined;\n }\n\n // http://w3c.github.io/IndexedDB/#retrieve-multiple-values-from-an-object-store\n getAllValues(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(structuredClone(record.value));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // https://www.w3.org/TR/IndexedDB/#dom-idbobjectstore-getallrecords\n getAllRecords(range, count, direction) {\n if (count === undefined || count === 0) {\n count = Infinity;\n }\n const records = [];\n for (const record of this.records.values(range, direction)) {\n records.push(new FDBRecord(structuredClone(record.key), structuredClone(record.key), structuredClone(record.value)));\n if (records.length >= count) {\n break;\n }\n }\n return records;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-storing-a-record-into-an-object-store\n storeRecord(newRecord, noOverwrite, rollbackLog) {\n if (this.keyPath !== null) {\n const key = extractKey(this.keyPath, newRecord.value).key;\n if (key !== undefined) {\n newRecord.key = key;\n }\n }\n const rollbackLogForThisOperation = [];\n if (this.keyGenerator !== null && newRecord.key === undefined) {\n let rolledBack = false;\n const keyGeneratorBefore = this.keyGenerator.num;\n const rollbackKeyGenerator = () => {\n if (rolledBack) {\n return;\n }\n rolledBack = true;\n if (this.keyGenerator) {\n this.keyGenerator.num = keyGeneratorBefore;\n }\n };\n rollbackLogForThisOperation.push(rollbackKeyGenerator);\n if (rollbackLog) {\n rollbackLog.push(rollbackKeyGenerator);\n }\n newRecord.key = this.keyGenerator.next();\n\n // Set in value if keyPath defiend but led to no key\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-to-assign-a-key-to-a-value-using-a-key-path\n if (this.keyPath !== null) {\n if (Array.isArray(this.keyPath)) {\n throw new Error(\"Cannot have an array key path in an object store with a key generator\");\n }\n let remainingKeyPath = this.keyPath;\n let object = newRecord.value;\n let identifier;\n let i = 0; // Just to run the loop at least once\n while (i >= 0) {\n if (typeof object !== \"object\") {\n throw new DataError();\n }\n i = remainingKeyPath.indexOf(\".\");\n if (i >= 0) {\n identifier = remainingKeyPath.slice(0, i);\n remainingKeyPath = remainingKeyPath.slice(i + 1);\n if (!Object.hasOwn(object, identifier)) {\n // Bypass prototype when setting (See `bindings-inject-values-bypass.any.js`)\n // Equivalent to `object[identifier] = ...` without using `Object.prototype`\n Object.defineProperty(object, identifier, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: {}\n });\n }\n object = object[identifier];\n }\n }\n identifier = remainingKeyPath;\n\n // Bypass prototype when setting (See `bindings-inject-values-bypass.any.js`)\n // Equivalent to `object[identifier] = ...` without using `Object.prototype`\n Object.defineProperty(object, identifier, {\n configurable: true,\n enumerable: true,\n writable: true,\n value: newRecord.key\n });\n }\n } else if (this.keyGenerator !== null && typeof newRecord.key === \"number\") {\n this.keyGenerator.setIfLarger(newRecord.key);\n }\n const existingRecord = this.records.put(newRecord, noOverwrite);\n let rolledBack = false;\n const rollbackStoreRecord = () => {\n if (rolledBack) {\n return;\n }\n rolledBack = true;\n if (existingRecord) {\n // overwrite on rollback\n this.storeRecord(existingRecord, false);\n } else {\n // delete on rollback\n this.deleteRecord(newRecord.key);\n }\n };\n rollbackLogForThisOperation.push(rollbackStoreRecord);\n if (rollbackLog) {\n rollbackLog.push(rollbackStoreRecord);\n }\n\n // Delete existing indexes\n if (existingRecord) {\n for (const rawIndex of this.rawIndexes.values()) {\n rawIndex.records.deleteByValue(newRecord.key);\n }\n }\n\n // Update indexes\n try {\n for (const rawIndex of this.rawIndexes.values()) {\n if (rawIndex.initialized) {\n rawIndex.storeRecord(newRecord);\n }\n }\n } catch (err) {\n // If this request fails here and preventDefault is used to stop the transaction from aborting, we need to roll back the addition of this record to the store, otherwise it will be present in subsequent requests on this transaction. Same for key generator.\n if (err.name === \"ConstraintError\") {\n for (const rollback of rollbackLogForThisOperation) {\n rollback();\n }\n }\n throw err;\n }\n return newRecord.key;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-deleting-records-from-an-object-store\n deleteRecord(key, rollbackLog) {\n const deletedRecords = this.records.delete(key);\n if (rollbackLog) {\n for (const record of deletedRecords) {\n rollbackLog.push(() => {\n this.storeRecord(record, true);\n });\n }\n }\n for (const rawIndex of this.rawIndexes.values()) {\n rawIndex.records.deleteByValue(key);\n }\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-steps-for-clearing-an-object-store\n clear(rollbackLog) {\n const deletedRecords = this.records.clear();\n if (rollbackLog) {\n for (const record of deletedRecords) {\n rollbackLog.push(() => {\n this.storeRecord(record, true);\n });\n }\n }\n for (const rawIndex of this.rawIndexes.values()) {\n rawIndex.records.clear();\n }\n }\n count(range) {\n // optimization: if there is no range, or if the range is everything, then we can just count the total size\n if (range === undefined || range.lower === undefined && range.upper === undefined) {\n return this.records.size();\n }\n let count = 0;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const record of this.records.values(range)) {\n count += 1;\n }\n return count;\n }\n}\nexport default ObjectStore;",
|
|
36
|
+
"import FakeEvent from \"./FakeEvent.js\";\nimport { queueTask } from \"./scheduling.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#database-closing-steps\nconst closeConnection = (connection, forced = false) => {\n connection._closePending = true;\n const transactionsComplete = connection._rawDatabase.transactions.every(transaction => {\n return transaction._state === \"finished\";\n });\n if (transactionsComplete) {\n connection._closed = true;\n connection._rawDatabase.connections = connection._rawDatabase.connections.filter(otherConnection => {\n return connection !== otherConnection;\n });\n if (forced) {\n const event = new FakeEvent(\"close\", {\n bubbles: false,\n cancelable: false\n });\n event.eventPath = [];\n connection.dispatchEvent(event);\n }\n } else {\n queueTask(() => {\n closeConnection(connection, forced);\n });\n }\n};\nexport default closeConnection;",
|
|
37
|
+
"import FDBTransaction from \"./FDBTransaction.js\";\nimport { ConstraintError, InvalidAccessError, InvalidStateError, NotFoundError, TransactionInactiveError } from \"./lib/errors.js\";\nimport FakeDOMStringList from \"./lib/FakeDOMStringList.js\";\nimport FakeEventTarget from \"./lib/FakeEventTarget.js\";\nimport ObjectStore from \"./lib/ObjectStore.js\";\nimport validateKeyPath from \"./lib/validateKeyPath.js\";\nimport closeConnection from \"./lib/closeConnection.js\";\n// Common first 3 steps of https://www.w3.org/TR/IndexedDB/#dom-idbdatabase-createobjectstore and https://www.w3.org/TR/IndexedDB/#dom-idbdatabase-deleteobjectstore\nconst confirmActiveVersionchangeTransaction = database => {\n // Let transaction be database’s upgrade transaction if it is not null, or throw an \"InvalidStateError\" DOMException otherwise.\n let transaction;\n if (database._runningVersionchangeTransaction) {\n // Find the latest versionchange transaction\n transaction = database._rawDatabase.transactions.findLast(tx => {\n return tx.mode === \"versionchange\";\n });\n }\n if (!transaction) {\n throw new InvalidStateError();\n }\n\n // If transaction’s state is not active, then throw a \"TransactionInactiveError\" DOMException.\n if (transaction._state !== \"active\") {\n throw new TransactionInactiveError();\n }\n return transaction;\n};\n\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#database-interface\nclass FDBDatabase extends FakeEventTarget {\n _closePending = false;\n _closed = false;\n _runningVersionchangeTransaction = false;\n constructor(rawDatabase) {\n super();\n this._rawDatabase = rawDatabase;\n this._rawDatabase.connections.push(this);\n this.name = rawDatabase.name;\n this.version = rawDatabase.version;\n this.objectStoreNames = new FakeDOMStringList(...Array.from(rawDatabase.rawObjectStores.keys()).sort());\n }\n\n // http://w3c.github.io/IndexedDB/#dom-idbdatabase-createobjectstore\n createObjectStore(name, options = {}) {\n if (name === undefined) {\n throw new TypeError();\n }\n const transaction = confirmActiveVersionchangeTransaction(this);\n const keyPath = options !== null && options.keyPath !== undefined ? options.keyPath : null;\n const autoIncrement = options !== null && options.autoIncrement !== undefined ? options.autoIncrement : false;\n if (keyPath !== null) {\n validateKeyPath(keyPath);\n }\n if (this._rawDatabase.rawObjectStores.has(name)) {\n throw new ConstraintError();\n }\n if (autoIncrement && (keyPath === \"\" || Array.isArray(keyPath))) {\n throw new InvalidAccessError();\n }\n\n // Save for rollbackLog\n const objectStoreNames = [...this.objectStoreNames];\n const transactionObjectStoreNames = [...transaction.objectStoreNames];\n const rawObjectStore = new ObjectStore(this._rawDatabase, name, keyPath, autoIncrement);\n this.objectStoreNames._push(name);\n this.objectStoreNames._sort();\n transaction._scope.add(name);\n transaction._createdObjectStores.add(rawObjectStore);\n this._rawDatabase.rawObjectStores.set(name, rawObjectStore);\n transaction.objectStoreNames = new FakeDOMStringList(...this.objectStoreNames);\n transaction._rollbackLog.push(() => {\n rawObjectStore.deleted = true;\n this.objectStoreNames = new FakeDOMStringList(...objectStoreNames);\n transaction.objectStoreNames = new FakeDOMStringList(...transactionObjectStoreNames);\n transaction._scope.delete(rawObjectStore.name);\n this._rawDatabase.rawObjectStores.delete(rawObjectStore.name);\n });\n return transaction.objectStore(name);\n }\n\n // https://www.w3.org/TR/IndexedDB/#dom-idbdatabase-deleteobjectstore\n deleteObjectStore(name) {\n if (name === undefined) {\n throw new TypeError();\n }\n const transaction = confirmActiveVersionchangeTransaction(this);\n\n // Let store be the object store named name in database, or throw a \"NotFoundError\" DOMException if none.\n const store = this._rawDatabase.rawObjectStores.get(name);\n if (store === undefined) {\n throw new NotFoundError();\n }\n\n // Remove store from this’s object store set.\n // This method synchronously modifies the objectStoreNames property on the IDBDatabase instance on which it was called.\n this.objectStoreNames = new FakeDOMStringList(...Array.from(this.objectStoreNames).filter(objectStoreName => {\n return objectStoreName !== name;\n }));\n transaction.objectStoreNames = new FakeDOMStringList(...this.objectStoreNames);\n\n // If there is an object store handle associated with store and transaction, remove all entries from its index set.\n const objectStore = transaction._objectStoresCache.get(name);\n let prevIndexNames;\n if (objectStore) {\n prevIndexNames = [...objectStore.indexNames];\n objectStore.indexNames = new FakeDOMStringList();\n }\n transaction._rollbackLog.push(() => {\n store.deleted = false;\n this._rawDatabase.rawObjectStores.set(store.name, store);\n this.objectStoreNames._push(store.name);\n transaction.objectStoreNames._push(store.name);\n this.objectStoreNames._sort();\n if (objectStore && prevIndexNames) {\n objectStore.indexNames = new FakeDOMStringList(...prevIndexNames);\n }\n });\n\n // Destroy store.\n store.deleted = true;\n this._rawDatabase.rawObjectStores.delete(name);\n transaction._objectStoresCache.delete(name);\n }\n transaction(storeNames, mode, options) {\n mode = mode !== undefined ? mode : \"readonly\";\n if (mode !== \"readonly\" && mode !== \"readwrite\" && mode !== \"versionchange\") {\n throw new TypeError(\"Invalid mode: \" + mode);\n }\n const hasActiveVersionchange = this._rawDatabase.transactions.some(transaction => {\n return transaction._state === \"active\" && transaction.mode === \"versionchange\" && transaction.db === this;\n });\n if (hasActiveVersionchange) {\n throw new InvalidStateError();\n }\n if (this._closePending) {\n throw new InvalidStateError();\n }\n if (!Array.isArray(storeNames)) {\n storeNames = [storeNames];\n }\n if (storeNames.length === 0 && mode !== \"versionchange\") {\n throw new InvalidAccessError();\n }\n for (const storeName of storeNames) {\n if (!this.objectStoreNames.contains(storeName)) {\n throw new NotFoundError(\"No objectStore named \" + storeName + \" in this database\");\n }\n }\n\n // the actual algo is more complex but this passes the IDB tests: https://webidl.spec.whatwg.org/#es-dictionary\n const durability = options?.durability ?? \"default\";\n // invalid enums throw a TypeError: https://webidl.spec.whatwg.org/#es-enumeration\n if (durability !== \"default\" && durability !== \"strict\" && durability !== \"relaxed\") {\n throw new TypeError(\n // based on Firefox's error message\n `'${durability}' (value of 'durability' member of IDBTransactionOptions) ` + `is not a valid value for enumeration IDBTransactionDurability`);\n }\n const tx = new FDBTransaction(storeNames, mode, durability, this);\n this._rawDatabase.transactions.push(tx);\n this._rawDatabase.processTransactions(); // See if can start right away (async)\n\n return tx;\n }\n close() {\n closeConnection(this);\n }\n get [Symbol.toStringTag]() {\n return \"IDBDatabase\";\n }\n}\nexport default FDBDatabase;",
|
|
38
|
+
"import FDBRequest from \"./FDBRequest.js\";\nclass FDBOpenDBRequest extends FDBRequest {\n onupgradeneeded = null;\n onblocked = null;\n get [Symbol.toStringTag]() {\n return \"IDBOpenDBRequest\";\n }\n}\nexport default FDBOpenDBRequest;",
|
|
39
|
+
"import FakeEvent from \"./lib/FakeEvent.js\";\nclass FDBVersionChangeEvent extends FakeEvent {\n constructor(type, parameters = {}) {\n super(type);\n this.newVersion = parameters.newVersion !== undefined ? parameters.newVersion : null;\n this.oldVersion = parameters.oldVersion !== undefined ? parameters.oldVersion : 0;\n }\n get [Symbol.toStringTag]() {\n return \"IDBVersionChangeEvent\";\n }\n}\nexport default FDBVersionChangeEvent;",
|
|
40
|
+
"/**\n * Minimal polyfill of `Set.prototype.intersection`, available in Node 22+.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/intersection\n * @param set1\n * @param set2\n */\nexport function intersection(set1, set2) {\n if (\"intersection\" in set1) {\n return set1.intersection(set2);\n }\n return new Set([...set1].filter(item => set2.has(item)));\n}",
|
|
41
|
+
"import { queueTask } from \"./scheduling.js\";\nimport { intersection } from \"./intersection.js\";\n// http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#dfn-database\nclass Database {\n transactions = [];\n rawObjectStores = new Map();\n connections = [];\n constructor(name, version) {\n this.name = name;\n this.version = version;\n this.processTransactions = this.processTransactions.bind(this);\n }\n processTransactions() {\n queueTask(() => {\n const running = this.transactions.filter(transaction => transaction._started && transaction._state !== \"finished\");\n const waiting = this.transactions.filter(transaction => !transaction._started && transaction._state !== \"finished\");\n\n // The next transaction to run is the first waiting one that doesn't overlap with either a running one or a\n // preceding waiting one. This allows non-overlapping transactions to run in parallel.\n // The exception is readonly transactions, which are allowed to run in parallel with other readonly\n // transactions, even with overlapping scopes, since no data is being modified.\n const next = waiting.find((transaction, i) => {\n const anyRunning = running.some(other => !(transaction.mode === \"readonly\" && other.mode === \"readonly\") && intersection(other._scope, transaction._scope).size > 0);\n if (anyRunning) {\n return false;\n }\n\n // If any _preceding_ waiting transactions are blocked, then that's also blocking.\n // E.g. if you have 3 transactions: [a], [a,b], and [b,c], then [a] blocks [a,b] which blocks [b,c]\n // until [a] is complete, even though [a] and [b,c] share no overlap.\n // Note that readonly transactions do not have to be handled as a special case here,\n // because if any transactions with overlapping scopes are blocked, then we can assume they are\n const anyWaiting = waiting.slice(0, i).some(other => intersection(other._scope, transaction._scope).size > 0);\n return !anyWaiting;\n });\n if (next) {\n next.addEventListener(\"complete\", this.processTransactions);\n next.addEventListener(\"abort\", this.processTransactions);\n next._start();\n }\n });\n }\n}\nexport default Database;",
|
|
42
|
+
"// WebIDL requires passing the right number of non-optional arguments, e.g. IDBFactory.open() must have at least 1 arg\nexport function validateRequiredArguments(numArguments, expectedNumArguments, methodName) {\n if (numArguments < expectedNumArguments) {\n // imitate Firefox's error message\n throw new TypeError(`${methodName}: At least ${expectedNumArguments} ${expectedNumArguments === 1 ? \"argument\" : \"arguments\"} ` + `required, but only ${arguments.length} passed`);\n }\n}",
|
|
43
|
+
"import FDBDatabase from \"./FDBDatabase.js\";\nimport FDBOpenDBRequest from \"./FDBOpenDBRequest.js\";\nimport FDBVersionChangeEvent from \"./FDBVersionChangeEvent.js\";\nimport cmp from \"./lib/cmp.js\";\nimport Database from \"./lib/Database.js\";\nimport enforceRange from \"./lib/enforceRange.js\";\nimport { AbortError, VersionError } from \"./lib/errors.js\";\nimport FakeEvent from \"./lib/FakeEvent.js\";\nimport { queueTask } from \"./lib/scheduling.js\";\nimport { validateRequiredArguments } from \"./lib/validateRequiredArguments.js\";\n// https://w3c.github.io/IndexedDB/#connection-queue\nconst runTaskInConnectionQueue = (connectionQueues, name, task) => {\n // Let queue be the connection queue for storageKey and name.\n // (note FakeIndexedDB does not support storageKeys currently)\n // Add request to queue.\n // Wait until all previous requests in queue have been processed.\n const queue = connectionQueues.get(name) ?? Promise.resolve();\n connectionQueues.set(name, queue.then(task));\n};\nconst waitForOthersClosedDelete = (databases, name, openDatabases, cb) => {\n const anyOpen = openDatabases.some(openDatabase2 => {\n return !openDatabase2._closed && !openDatabase2._closePending;\n });\n if (anyOpen) {\n queueTask(() => waitForOthersClosedDelete(databases, name, openDatabases, cb));\n return;\n }\n databases.delete(name);\n cb(null);\n};\n\n// https://w3c.github.io/IndexedDB/#delete-a-database\nconst deleteDatabase = (databases, connectionQueues, name, request, cb) => {\n const deleteDBTask = () => {\n return new Promise(resolve => {\n const db = databases.get(name);\n const oldVersion = db !== undefined ? db.version : 0;\n const onComplete = err => {\n try {\n if (err) {\n cb(err);\n } else {\n cb(null, oldVersion);\n }\n } finally {\n resolve();\n }\n };\n try {\n const db = databases.get(name);\n if (db === undefined) {\n onComplete(null);\n return;\n }\n\n // Let openConnections be the set of all connections associated with db.\n const openConnections = db.connections.filter(connection => {\n return !connection._closed;\n });\n\n // For each entry of openConnections that does not have its close pending flag set to true, queue a\n // database task to fire a version change event named versionchange at entry with db’s version and null.\n for (const openDatabase2 of openConnections) {\n if (!openDatabase2._closePending) {\n queueTask(() => {\n const event = new FDBVersionChangeEvent(\"versionchange\", {\n newVersion: null,\n oldVersion: db.version\n });\n openDatabase2.dispatchEvent(event);\n });\n }\n }\n\n // Wait for all of the events to be fired. (i.e. queue a task)\n queueTask(() => {\n // If any of the connections in openConnections are still not closed, queue a database task to\n // fire a version change event named blocked at request with db’s version and null.\n\n const anyOpen = openConnections.some(openDatabase3 => {\n return !openDatabase3._closed && !openDatabase3._closePending;\n });\n\n // If any of the connections in openConnections are still not closed, queue a database task to\n // fire a version change event named blocked at request with db’s version and null.\n if (anyOpen) {\n queueTask(() => {\n const event = new FDBVersionChangeEvent(\"blocked\", {\n newVersion: null,\n oldVersion: db.version\n });\n request.dispatchEvent(event);\n });\n }\n\n // Wait until all connections in openConnections are closed.\n waitForOthersClosedDelete(databases, name, openConnections, onComplete);\n });\n } catch (err) {\n onComplete(err);\n }\n });\n };\n runTaskInConnectionQueue(connectionQueues, name, deleteDBTask);\n};\n\n// https://w3c.github.io/IndexedDB/#ref-for-database-version%E2%91%A0%E2%91%A2\nconst runVersionchangeTransaction = (connection, version, request, cb) => {\n connection._runningVersionchangeTransaction = true;\n const oldVersion = connection._oldVersion = connection.version;\n\n // Let openConnections be the set of all connections, except connection, associated with db.\n const openConnections = connection._rawDatabase.connections.filter(otherDatabase => {\n return connection !== otherDatabase;\n });\n\n // For each entry of openConnections that does not have its close pending flag set to true, queue a\n // database task to fire a version change event named versionchange at entry with db’s version and version.\n for (const openDatabase2 of openConnections) {\n if (!openDatabase2._closed && !openDatabase2._closePending) {\n queueTask(() => {\n const event = new FDBVersionChangeEvent(\"versionchange\", {\n newVersion: version,\n oldVersion\n });\n openDatabase2.dispatchEvent(event);\n });\n }\n }\n\n // Wait for all of the events to be fired.\n // (i.e. queue a task)\n queueTask(() => {\n const anyOpen = openConnections.some(openDatabase3 => {\n return !openDatabase3._closed && !openDatabase3._closePending;\n });\n\n // If any of the connections in openConnections are still not closed, queue a database task to fire a version change event named blocked at request with db’s version and version.\n if (anyOpen) {\n queueTask(() => {\n const event = new FDBVersionChangeEvent(\"blocked\", {\n newVersion: version,\n oldVersion\n });\n request.dispatchEvent(event);\n });\n }\n\n // Wait until all connections in openConnections are closed.\n const waitForOthersClosed = () => {\n const anyOpen2 = openConnections.some(openDatabase2 => {\n return !openDatabase2._closed && !openDatabase2._closePending;\n });\n if (anyOpen2) {\n queueTask(waitForOthersClosed);\n return;\n }\n\n // Set the version of database to version. This change is considered part of the transaction, and so if the\n // transaction is aborted, this change is reverted.\n connection._rawDatabase.version = version;\n connection.version = version;\n\n // Get rid of this setImmediate?\n const transaction = connection.transaction(Array.from(connection.objectStoreNames), \"versionchange\");\n\n // associate the transaction with the open request for later lookup\n transaction._openRequest = request;\n\n // https://w3c.github.io/IndexedDB/#upgrade-a-database\n // Set request’s result to connection.\n request.result = connection;\n // Set request’s done flag to true.\n request.readyState = \"done\";\n // Set request’s transaction to transaction.\n request.transaction = transaction;\n transaction._rollbackLog.push(() => {\n connection._rawDatabase.version = oldVersion;\n connection.version = oldVersion;\n });\n\n // Set transaction’s state to active.\n transaction._state = \"active\";\n\n // Let didThrow be the result of firing a version change event named upgradeneeded at request with old version and version.\n const event = new FDBVersionChangeEvent(\"upgradeneeded\", {\n newVersion: version,\n oldVersion\n });\n let didThrow = false;\n try {\n request.dispatchEvent(event);\n } catch (_err) {\n didThrow = true;\n }\n const concludeUpgrade = () => {\n // If transaction’s state is active, then:\n if (transaction._state === \"active\") {\n // Set transaction’s state to inactive.\n transaction._state = \"inactive\";\n if (didThrow) {\n // If didThrow is true, run abort a transaction with transaction and a newly created \"AbortError\" DOMException.\n transaction._abort(\"AbortError\");\n }\n }\n };\n\n // The \"upgrade a database\" steps are supposed to run as a database task on the database access task source\n // (i.e. off the main thread), but since we're actually running on the main thread, we have to be tricky:\n // 1. If any `upgradeneeded` event handlers errored, abort synchronously\n // 2. Else yield to allow any microtasks to run in response to that event\n if (didThrow) {\n concludeUpgrade();\n } else {\n queueTask(concludeUpgrade);\n }\n transaction._prioritizedListeners.set(\"error\", () => {\n connection._runningVersionchangeTransaction = false;\n connection._oldVersion = undefined;\n // throw arguments[0].target.error;\n // console.log(\"error in versionchange transaction - not sure if anything needs to be done here\", e.target.error.name);\n });\n transaction._prioritizedListeners.set(\"abort\", () => {\n connection._runningVersionchangeTransaction = false;\n connection._oldVersion = undefined;\n queueTask(() => {\n // Reset transaction in a tick after onabort (upgrade-transaction-lifecycle-user-aborted.any)\n request.transaction = null;\n cb(new AbortError());\n });\n });\n transaction._prioritizedListeners.set(\"complete\", () => {\n connection._runningVersionchangeTransaction = false;\n connection._oldVersion = undefined;\n // Let other complete event handlers run before continuing\n queueTask(() => {\n // Reset transaction in a tick after oncomplete (upgrade-transaction-lifecycle-committed.any.js)\n request.transaction = null;\n if (connection._closePending) {\n cb(new AbortError());\n } else {\n cb(null);\n }\n });\n });\n };\n waitForOthersClosed();\n });\n};\n\n// https://w3c.github.io/IndexedDB/#opening\nconst openDatabase = (databases, connectionQueues, name, version, request, cb) => {\n const openDBTask = () => {\n return new Promise(resolve => {\n const onComplete = err => {\n try {\n if (err) {\n // DO THIS HERE: ensure that connection is closed by running the steps for closing a database connection before these\n // steps are aborted.\n cb(err);\n } else {\n cb(null, connection);\n }\n } finally {\n resolve();\n }\n };\n\n // Let db be the database named name in storageKey, or null otherwise.\n let db = databases.get(name);\n if (db === undefined) {\n // If db is null, let db be a new database with name `name`, version 0 (zero), and with no object stores.\n db = new Database(name, 0);\n databases.set(name, db);\n }\n\n // If version is undefined, let version be 1 if db is null, or db’s version otherwise.\n if (version === undefined) {\n version = db.version !== 0 ? db.version : 1;\n }\n\n // If db’s version is greater than version, return a newly created \"VersionError\" DOMException and abort these steps.\n if (db.version > version) {\n return onComplete(new VersionError());\n }\n\n // Let connection be a new connection to db.\n const connection = new FDBDatabase(db);\n\n // If db’s version is less than version, then:\n if (db.version < version) {\n // (run a version change transaction and resolve so that the next promise in the queue will execute)\n runVersionchangeTransaction(connection, version, request, err => {\n onComplete(err);\n });\n } else {\n onComplete(null);\n }\n });\n };\n runTaskInConnectionQueue(connectionQueues, name, openDBTask);\n};\nclass FDBFactory {\n _databases = new Map();\n // https://w3c.github.io/IndexedDB/#connection-queue\n _connectionQueues = new Map(); // promise chain as lightweight FIFO task queue\n\n // https://w3c.github.io/IndexedDB/#dom-idbfactory-cmp\n cmp(first, second) {\n validateRequiredArguments(arguments.length, 2, \"IDBFactory.cmp\");\n return cmp(first, second);\n }\n\n // https://w3c.github.io/IndexedDB/#dom-idbfactory-deletedatabase\n deleteDatabase(name) {\n validateRequiredArguments(arguments.length, 1, \"IDBFactory.deleteDatabase\");\n const request = new FDBOpenDBRequest();\n request.source = null;\n queueTask(() => {\n deleteDatabase(this._databases, this._connectionQueues, name, request, (err, oldVersion) => {\n if (err) {\n request.error = new DOMException(err.message, err.name);\n request.readyState = \"done\";\n const event = new FakeEvent(\"error\", {\n bubbles: true,\n cancelable: true\n });\n event.eventPath = [];\n request.dispatchEvent(event);\n return;\n }\n request.result = undefined;\n request.readyState = \"done\";\n const event2 = new FDBVersionChangeEvent(\"success\", {\n newVersion: null,\n oldVersion\n });\n request.dispatchEvent(event2);\n });\n });\n return request;\n }\n\n // http://www.w3.org/TR/2015/REC-IndexedDB-20150108/#widl-IDBFactory-open-IDBOpenDBRequest-DOMString-name-unsigned-long-long-version\n open(name, version) {\n validateRequiredArguments(arguments.length, 1, \"IDBFactory.open\");\n if (arguments.length > 1 && version !== undefined) {\n // Based on spec, not sure why \"MAX_SAFE_INTEGER\" instead of \"unsigned long long\", but it's needed to pass\n // tests\n version = enforceRange(version, \"MAX_SAFE_INTEGER\");\n }\n if (version === 0) {\n throw new TypeError(\"Database version cannot be 0\");\n }\n const request = new FDBOpenDBRequest();\n request.source = null;\n queueTask(() => {\n openDatabase(this._databases, this._connectionQueues, name, version, request, (err, connection) => {\n if (err) {\n request.result = undefined;\n request.readyState = \"done\";\n request.error = new DOMException(err.message, err.name);\n const event = new FakeEvent(\"error\", {\n bubbles: true,\n cancelable: true\n });\n event.eventPath = [];\n request.dispatchEvent(event);\n return;\n }\n request.result = connection;\n request.readyState = \"done\";\n const event2 = new FakeEvent(\"success\");\n event2.eventPath = [];\n request.dispatchEvent(event2);\n });\n });\n return request;\n }\n\n // https://w3c.github.io/IndexedDB/#dom-idbfactory-databases\n databases() {\n return Promise.resolve(Array.from(this._databases.entries(), ([name, database]) => {\n const activeVersionChangeConnection = database.connections.find(connection => connection._runningVersionchangeTransaction);\n // If a versionchange is in progress, report the old version. See `get-databases.any.js` test:\n // \"The result of databases() should contain the versions of databases at the time of calling,\n // regardless of versionchange transactions currently running.\"\n const version = activeVersionChangeConnection ? activeVersionChangeConnection._oldVersion : database.version;\n return {\n name,\n version\n };\n }).filter(({\n version\n }) => {\n // Ignore newly-created DBs with active versionchange transactions. See `get-databases.any.js` test:\n // \"The result of databases() should be only those databases which have been created at the\n // time of calling, regardless of versionchange transactions currently running.\"\n return version > 0;\n }));\n }\n get [Symbol.toStringTag]() {\n return \"IDBFactory\";\n }\n}\nexport default FDBFactory;",
|
|
44
|
+
"import FDBFactory from \"./FDBFactory.js\";\nconst fakeIndexedDB = new FDBFactory();\nexport default fakeIndexedDB;",
|
|
45
|
+
"import fakeIndexedDB from \"../build/esm/fakeIndexedDB.js\";\nimport FDBCursor from \"../build/esm/FDBCursor.js\";\nimport FDBCursorWithValue from \"../build/esm/FDBCursorWithValue.js\";\nimport FDBDatabase from \"../build/esm/FDBDatabase.js\";\nimport FDBFactory from \"../build/esm/FDBFactory.js\";\nimport FDBIndex from \"../build/esm/FDBIndex.js\";\nimport FDBKeyRange from \"../build/esm/FDBKeyRange.js\";\nimport FDBObjectStore from \"../build/esm/FDBObjectStore.js\";\nimport FDBOpenDBRequest from \"../build/esm/FDBOpenDBRequest.js\";\nimport FDBRecord from \"../build/esm/FDBRecord.js\";\nimport FDBRequest from \"../build/esm/FDBRequest.js\";\nimport FDBTransaction from \"../build/esm/FDBTransaction.js\";\nimport FDBVersionChangeEvent from \"../build/esm/FDBVersionChangeEvent.js\";\n\n// http://stackoverflow.com/a/33268326/786644 - works in browser, worker, and Node.js\nvar globalVar =\n typeof window !== \"undefined\"\n ? window\n : typeof WorkerGlobalScope !== \"undefined\"\n ? self\n : typeof global !== \"undefined\"\n ? global\n : Function(\"return this;\")();\n\n// Partly match the native behavior for `globalThis.indexedDB`, `globalThis.IDBCursor`, etc.\n// Per the IDL, `indexedDB` is readonly but the others are readwrite. For us, though, we want it to still\n// be overwritable with `globalThis.<global> = ...`, so we make them all readwrite.\n// https://w3c.github.io/IndexedDB/#idl-index\nconst createPropertyDescriptor = (value) => {\n return {\n value,\n enumerable: false,\n configurable: true,\n writable: true,\n };\n};\n\nObject.defineProperties(globalVar, {\n indexedDB: createPropertyDescriptor(fakeIndexedDB),\n IDBCursor: createPropertyDescriptor(FDBCursor),\n IDBCursorWithValue: createPropertyDescriptor(FDBCursorWithValue),\n IDBDatabase: createPropertyDescriptor(FDBDatabase),\n IDBFactory: createPropertyDescriptor(FDBFactory),\n IDBIndex: createPropertyDescriptor(FDBIndex),\n IDBKeyRange: createPropertyDescriptor(FDBKeyRange),\n IDBObjectStore: createPropertyDescriptor(FDBObjectStore),\n IDBOpenDBRequest: createPropertyDescriptor(FDBOpenDBRequest),\n IDBRecord: createPropertyDescriptor(FDBRecord),\n IDBRequest: createPropertyDescriptor(FDBRequest),\n IDBTransaction: createPropertyDescriptor(FDBTransaction),\n IDBVersionChangeEvent: createPropertyDescriptor(FDBVersionChangeEvent),\n});\n",
|
|
46
|
+
"/**\n * Matrix messaging integration plugin for ElizaOS.\n *\n * This plugin provides Matrix protocol integration using matrix-js-sdk.\n */\n\nimport type { IAgentRuntime, Plugin } from \"@elizaos/core\";\nimport { getConnectorAccountManager, logger } from \"@elizaos/core\";\n\nexport * from \"./accounts.js\";\n// Service\nexport { MatrixService } from \"./service.js\";\n// Types\nexport * from \"./types.js\";\n\n// Import service for plugin\nimport { createMatrixConnectorAccountProvider } from \"./connector-account-provider.js\";\nimport { MatrixService } from \"./service.js\";\nimport { MatrixWorkflowCredentialProvider } from \"./workflow-credential-provider.js\";\n\n/**\n * Matrix plugin definition.\n */\nconst matrixPlugin: Plugin = {\n name: \"matrix\",\n description: \"Matrix messaging integration plugin for ElizaOS with E2EE support\",\n\n services: [MatrixService, MatrixWorkflowCredentialProvider],\n\n actions: [],\n\n providers: [],\n\n tests: [],\n\n // Self-declared auto-enable: activate when the \"matrix\" connector is\n // configured under config.connectors. The hardcoded CONNECTOR_PLUGINS map\n // in plugin-auto-enable-engine.ts still serves as a fallback.\n autoEnable: {\n connectorKeys: [\"matrix\"],\n },\n\n init: async (_config: Record<string, string>, runtime: IAgentRuntime): Promise<void> => {\n // Register the Matrix provider with the ConnectorAccountManager.\n try {\n const manager = getConnectorAccountManager(runtime);\n manager.registerProvider(createMatrixConnectorAccountProvider(runtime));\n } catch (err) {\n logger.warn(\n {\n src: \"plugin:matrix\",\n err: err instanceof Error ? err.message : String(err),\n },\n \"Failed to register Matrix provider with ConnectorAccountManager\"\n );\n }\n\n const homeserver = runtime.getSetting(\"MATRIX_HOMESERVER\");\n const userId = runtime.getSetting(\"MATRIX_USER_ID\");\n const accessToken = runtime.getSetting(\"MATRIX_ACCESS_TOKEN\");\n\n logger.info(\"=\".repeat(60));\n logger.info(\"Matrix Plugin Configuration\");\n logger.info(\"=\".repeat(60));\n logger.info(` Homeserver: ${homeserver ? `✓ ${homeserver}` : \"✗ Missing (required)\"}`);\n logger.info(` User ID: ${userId ? `✓ ${userId}` : \"✗ Missing (required)\"}`);\n logger.info(` Access Token: ${accessToken ? \"✓ Set\" : \"✗ Missing (required)\"}`);\n logger.info(\"=\".repeat(60));\n\n // Validate required settings\n const missing: string[] = [];\n if (!homeserver) missing.push(\"MATRIX_HOMESERVER\");\n if (!userId) missing.push(\"MATRIX_USER_ID\");\n if (!accessToken) missing.push(\"MATRIX_ACCESS_TOKEN\");\n\n if (missing.length > 0) {\n logger.warn(`Matrix plugin: Missing required configuration: ${missing.join(\", \")}`);\n }\n\n // Additional optional settings\n const deviceId = runtime.getSetting(\"MATRIX_DEVICE_ID\");\n const rooms = runtime.getSetting(\"MATRIX_ROOMS\");\n const autoJoin = runtime.getSetting(\"MATRIX_AUTO_JOIN\");\n const encryption = runtime.getSetting(\"MATRIX_ENCRYPTION\");\n const requireMention = runtime.getSetting(\"MATRIX_REQUIRE_MENTION\");\n\n if (deviceId) {\n logger.info(` Device ID: ${deviceId}`);\n }\n\n if (rooms) {\n logger.info(` Auto-join Rooms: ${rooms}`);\n }\n\n if (autoJoin === \"true\") {\n logger.info(\" Auto-join Invites: ✓ Enabled\");\n }\n\n if (encryption === \"true\") {\n logger.info(\" End-to-End Encryption: ✓ Enabled\");\n }\n\n if (requireMention === \"true\") {\n logger.info(\" Require Mention: ✓ Enabled (will only respond to mentions in rooms)\");\n }\n },\n async dispose(runtime: IAgentRuntime) {\n await MatrixService.stopRuntime(runtime);\n },\n};\n\nexport default matrixPlugin;\n",
|
|
47
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport type { MatrixSettings } from \"./types.js\";\n\nexport const DEFAULT_MATRIX_ACCOUNT_ID = \"default\";\n\nexport type MatrixAccountConfig = Partial<Omit<MatrixSettings, \"rooms\" | \"accountId\">> & {\n accountId?: string;\n id?: string;\n rooms?: string[] | string;\n};\n\ntype MatrixMultiAccountConfig = MatrixAccountConfig & {\n accounts?: Record<string, MatrixAccountConfig>;\n};\n\nfunction stringSetting(runtime: IAgentRuntime, key: string): string | undefined {\n const value = runtime.getSetting(key);\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nfunction characterConfig(runtime: IAgentRuntime): MatrixMultiAccountConfig {\n const settings = runtime.character?.settings as Record<string, unknown> | undefined;\n const raw = settings?.matrix;\n return raw && typeof raw === \"object\" ? (raw as MatrixMultiAccountConfig) : {};\n}\n\nfunction parseAccountsJson(runtime: IAgentRuntime): Record<string, MatrixAccountConfig> {\n const raw = stringSetting(runtime, \"MATRIX_ACCOUNTS\");\n if (!raw) return {};\n\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (Array.isArray(parsed)) {\n return Object.fromEntries(\n parsed\n .filter((item): item is MatrixAccountConfig => Boolean(item) && typeof item === \"object\")\n .map((item) => [normalizeMatrixAccountId(item.accountId ?? item.id), item])\n );\n }\n return parsed && typeof parsed === \"object\"\n ? (parsed as Record<string, MatrixAccountConfig>)\n : {};\n } catch {\n return {};\n }\n}\n\nfunction allAccountConfigs(runtime: IAgentRuntime): Record<string, MatrixAccountConfig> {\n return {\n ...(characterConfig(runtime).accounts ?? {}),\n ...parseAccountsJson(runtime),\n };\n}\n\nfunction accountConfig(runtime: IAgentRuntime, accountId: string): MatrixAccountConfig {\n const accounts = allAccountConfigs(runtime);\n return accounts[accountId] ?? accounts[normalizeMatrixAccountId(accountId)] ?? {};\n}\n\nfunction boolValue(value: unknown, fallback = false): boolean {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.trim().toLowerCase() === \"true\";\n return fallback;\n}\n\nfunction roomsValue(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((room) => String(room).trim()).filter(Boolean);\n }\n if (typeof value === \"string\") {\n return value\n .split(\",\")\n .map((room) => room.trim())\n .filter(Boolean);\n }\n return [];\n}\n\nexport function normalizeMatrixAccountId(accountId?: unknown): string {\n if (typeof accountId !== \"string\") return DEFAULT_MATRIX_ACCOUNT_ID;\n const trimmed = accountId.trim();\n return trimmed || DEFAULT_MATRIX_ACCOUNT_ID;\n}\n\nexport function listMatrixAccountIds(runtime: IAgentRuntime): string[] {\n const ids = new Set<string>();\n const config = characterConfig(runtime);\n\n if (\n stringSetting(runtime, \"MATRIX_ACCESS_TOKEN\") ||\n (config.homeserver && config.userId && config.accessToken)\n ) {\n ids.add(DEFAULT_MATRIX_ACCOUNT_ID);\n }\n\n for (const id of Object.keys(allAccountConfigs(runtime))) {\n ids.add(normalizeMatrixAccountId(id));\n }\n\n return Array.from(ids.size ? ids : new Set([DEFAULT_MATRIX_ACCOUNT_ID])).sort((a, b) =>\n a.localeCompare(b)\n );\n}\n\nexport function resolveDefaultMatrixAccountId(runtime: IAgentRuntime): string {\n const requested =\n stringSetting(runtime, \"MATRIX_DEFAULT_ACCOUNT_ID\") ??\n stringSetting(runtime, \"MATRIX_ACCOUNT_ID\");\n if (requested) return normalizeMatrixAccountId(requested);\n\n const ids = listMatrixAccountIds(runtime);\n return ids.includes(DEFAULT_MATRIX_ACCOUNT_ID) ? DEFAULT_MATRIX_ACCOUNT_ID : ids[0];\n}\n\nexport function readMatrixAccountId(...sources: unknown[]): string | undefined {\n for (const source of sources) {\n if (!source || typeof source !== \"object\") continue;\n const record = source as Record<string, unknown>;\n const parameters =\n record.parameters && typeof record.parameters === \"object\"\n ? (record.parameters as Record<string, unknown>)\n : {};\n const data =\n record.data && typeof record.data === \"object\"\n ? (record.data as Record<string, unknown>)\n : {};\n const metadata =\n record.metadata && typeof record.metadata === \"object\"\n ? (record.metadata as Record<string, unknown>)\n : {};\n const matrix =\n data.matrix && typeof data.matrix === \"object\"\n ? (data.matrix as Record<string, unknown>)\n : {};\n const value =\n record.accountId ??\n parameters.accountId ??\n data.accountId ??\n matrix.accountId ??\n metadata.accountId;\n if (typeof value === \"string\" && value.trim()) return normalizeMatrixAccountId(value);\n }\n return undefined;\n}\n\nexport function resolveMatrixAccountSettings(\n runtime: IAgentRuntime,\n requestedAccountId?: string | null\n): MatrixSettings {\n const accountId = normalizeMatrixAccountId(\n requestedAccountId ?? resolveDefaultMatrixAccountId(runtime)\n );\n const base = characterConfig(runtime);\n const account = accountConfig(runtime, accountId);\n const allowEnv = accountId === DEFAULT_MATRIX_ACCOUNT_ID;\n\n return {\n accountId,\n homeserver:\n account.homeserver ??\n base.homeserver ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_HOMESERVER\") : undefined) ??\n \"\",\n userId:\n account.userId ??\n base.userId ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_USER_ID\") : undefined) ??\n \"\",\n accessToken:\n account.accessToken ??\n base.accessToken ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_ACCESS_TOKEN\") : undefined) ??\n \"\",\n password:\n account.password ??\n base.password ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_PASSWORD\") : undefined),\n deviceId:\n account.deviceId ??\n base.deviceId ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_DEVICE_ID\") : undefined),\n rooms: roomsValue(\n account.rooms ?? base.rooms ?? (allowEnv ? stringSetting(runtime, \"MATRIX_ROOMS\") : undefined)\n ),\n verifyAllowlist: roomsValue(\n account.verifyAllowlist ??\n base.verifyAllowlist ??\n (allowEnv ? stringSetting(runtime, \"MATRIX_VERIFY_ALLOWLIST\") : undefined)\n ),\n // boolean flags: read raw via getSetting (NOT stringSetting, which drops real booleans)\n autoJoin: boolValue(\n account.autoJoin ??\n base.autoJoin ??\n (allowEnv ? runtime.getSetting(\"MATRIX_AUTO_JOIN\") : undefined)\n ),\n encryption: boolValue(\n account.encryption ??\n base.encryption ??\n (allowEnv ? runtime.getSetting(\"MATRIX_ENCRYPTION\") : undefined)\n ),\n requireMention: boolValue(\n account.requireMention ??\n base.requireMention ??\n (allowEnv ? runtime.getSetting(\"MATRIX_REQUIRE_MENTION\") : undefined)\n ),\n personal: boolValue(\n account.personal ??\n base.personal ??\n (allowEnv ? runtime.getSetting(\"MATRIX_PERSONAL\") : undefined)\n ),\n enabled: boolValue(account.enabled ?? base.enabled, true),\n };\n}\n",
|
|
48
|
+
"/**\n * Matrix service implementation for ElizaOS.\n *\n * This service provides Matrix messaging capabilities using matrix-js-sdk.\n */\n\nimport { createCipheriv, createDecipheriv, randomBytes, scryptSync } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { chmod, mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { deserialize as v8Deserialize, serialize as v8Serialize } from \"node:v8\";\nimport {\n ChannelType,\n type Content,\n createUniqueUuid,\n type EventPayload,\n EventType,\n type HandlerCallback,\n type IAgentRuntime,\n lifeOpsPassiveConnectorsEnabled,\n logger,\n type Memory,\n type MessageConnectorChatContext,\n type MessageConnectorTarget,\n Service,\n type TargetInfo,\n type UUID,\n} from \"@elizaos/core\";\nimport * as sdk from \"matrix-js-sdk\";\nimport type { RoomMessageEventContent } from \"matrix-js-sdk/lib/@types/events\";\nimport {\n CryptoEvent,\n canAcceptVerificationRequest,\n type ShowSasCallbacks,\n VerificationPhase,\n type VerificationRequest,\n VerificationRequestEvent,\n type Verifier,\n VerifierEvent,\n} from \"matrix-js-sdk/lib/crypto-api\";\nimport {\n DEFAULT_MATRIX_ACCOUNT_ID,\n listMatrixAccountIds,\n normalizeMatrixAccountId,\n readMatrixAccountId,\n resolveDefaultMatrixAccountId,\n resolveMatrixAccountSettings,\n} from \"./accounts.js\";\nimport {\n getMatrixLocalpart,\n type IMatrixService,\n isValidMatrixRoomAlias,\n isValidMatrixRoomId,\n MATRIX_SERVICE_NAME,\n MatrixConfigurationError,\n MatrixEventTypes,\n type MatrixMessage,\n type MatrixMessageSendOptions,\n MatrixNotConnectedError,\n type MatrixRoom,\n type MatrixSendResult,\n type MatrixSettings,\n type MatrixUserInfo,\n} from \"./types.js\";\n\nfunction normalizeSearchQuery(query: string): string {\n return query.trim().toLowerCase();\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction matrixRoomSearchText(room: MatrixRoom): string {\n return [room.roomId, room.name, room.topic, room.canonicalAlias]\n .filter((value): value is string => typeof value === \"string\" && value.length > 0)\n .join(\" \")\n .toLowerCase();\n}\n\nfunction scoreMatrixRoom(room: MatrixRoom, query: string): number {\n const normalized = normalizeSearchQuery(query);\n if (!normalized) {\n return 0.4;\n }\n\n const candidates = [room.roomId, room.canonicalAlias, room.name].filter(\n (value): value is string => typeof value === \"string\" && value.length > 0\n );\n if (candidates.some((candidate) => candidate.toLowerCase() === normalized)) {\n return 1;\n }\n if (candidates.some((candidate) => candidate.toLowerCase().includes(normalized))) {\n return 0.85;\n }\n return matrixRoomSearchText(room).includes(normalized) ? 0.65 : 0;\n}\n\nfunction matrixRoomToConnectorTarget(\n room: MatrixRoom,\n score = 0.5,\n accountId = DEFAULT_MATRIX_ACCOUNT_ID\n): MessageConnectorTarget {\n const label = room.name || room.canonicalAlias || room.roomId;\n return {\n target: {\n source: MATRIX_SERVICE_NAME,\n accountId,\n channelId: room.roomId,\n },\n label,\n kind: room.isDirect ? \"user\" : \"room\",\n description:\n room.topic || `${room.memberCount} Matrix member${room.memberCount === 1 ? \"\" : \"s\"}`,\n score,\n contexts: [\"social\", \"connectors\"],\n metadata: {\n accountId,\n roomId: room.roomId,\n canonicalAlias: room.canonicalAlias,\n isEncrypted: room.isEncrypted,\n isDirect: room.isDirect,\n memberCount: room.memberCount,\n },\n };\n}\n\ntype ConnectorHookContext = {\n runtime: IAgentRuntime;\n roomId?: UUID;\n target?: TargetInfo;\n};\n\ntype ConnectorReadParams = {\n target?: TargetInfo;\n limit?: number;\n query?: string;\n};\n\ntype ConnectorMutationParams = {\n target?: TargetInfo;\n messageId?: string;\n eventId?: string;\n emoji?: string;\n};\n\ntype ConnectorRoomMembershipParams = {\n target?: TargetInfo;\n roomId?: string;\n roomIdOrAlias?: string;\n alias?: string;\n invite?: string;\n channelId?: string;\n};\n\ntype AdditiveMessageConnectorHooks = {\n fetchMessages?: (\n context: ConnectorHookContext,\n params?: ConnectorReadParams\n ) => Promise<Memory[]>;\n searchMessages?: (\n context: ConnectorHookContext,\n params: ConnectorReadParams & { query: string }\n ) => Promise<Memory[]>;\n reactHandler?: (runtime: IAgentRuntime, params: ConnectorMutationParams) => Promise<void>;\n joinHandler?: (runtime: IAgentRuntime, params: ConnectorRoomMembershipParams) => Promise<void>;\n leaveHandler?: (runtime: IAgentRuntime, params: ConnectorRoomMembershipParams) => Promise<void>;\n};\n\ntype ExtendedMessageConnectorRegistration = Parameters<\n IAgentRuntime[\"registerMessageConnector\"]\n>[0] &\n AdditiveMessageConnectorHooks;\n\ntype MatrixAccountState = {\n accountId: string;\n settings: MatrixSettings;\n client: sdk.MatrixClient;\n connected: boolean;\n syncing: boolean;\n cryptoSnapshotTimer?: ReturnType<typeof setInterval>;\n};\n\n/**\n * Serialized form of an IndexedDB database: object-store schemas plus their\n * records. v8.serialize handles the structured-clone values (typed arrays,\n * Maps, etc.) the rust-crypto store writes, so this shape round-trips losslessly.\n */\nexport type CryptoStoreSnapshot = {\n version: number;\n stores: Record<\n string,\n {\n schema: {\n keyPath: IDBObjectStore[\"keyPath\"];\n autoIncrement: boolean;\n indexes: {\n name: string;\n keyPath: IDBIndex[\"keyPath\"];\n unique: boolean;\n multiEntry: boolean;\n }[];\n };\n records: { key: IDBValidKey; value: unknown }[];\n }\n >;\n};\n\n// The matrix-js-sdk rust-crypto backend persists its entire state — device\n// identity, cross-signing, and inbound megolm sessions — in an IndexedDB\n// database named `${prefix}::matrix-sdk-crypto` when initRustCrypto({\n// useIndexedDB: true }) is used. With multiple encrypted accounts in one\n// process the prefix MUST differ per account or they collide on one store; the\n// default account keeps the SDK's default prefix so its existing persisted\n// device is unaffected.\nconst DEFAULT_CRYPTO_DB_PREFIX = \"matrix-js-sdk\";\n\nfunction cryptoDbPrefix(accountId: string): string {\n if (!accountId || accountId === DEFAULT_MATRIX_ACCOUNT_ID) {\n return DEFAULT_CRYPTO_DB_PREFIX;\n }\n const safeId = accountId.replace(/[^a-zA-Z0-9._-]/g, \"_\") || \"account\";\n return `${DEFAULT_CRYPTO_DB_PREFIX}-${safeId}`;\n}\n\nfunction cryptoDbName(accountId: string): string {\n return `${cryptoDbPrefix(accountId)}::matrix-sdk-crypto`;\n}\n\nconst CRYPTO_SNAPSHOT_INTERVAL_MS = 60 * 1000;\n// Grace period before the bot starts SAS itself, letting the initiator's start\n// win the race so the two sides don't compute the SAS over different events.\nconst VERIFICATION_START_FALLBACK_MS = 4000;\nconst ROOM_KEY_SCRYPT_SALT = \"matrix.roomKeys.v1\";\nconst ROOM_KEY_BYTES = 32;\nconst ROOM_KEY_NONCE_BYTES = 12;\n\n/**\n * Resolve the per-user state root the runtime already uses for on-disk state.\n * Matches the ELIZA_STATE_DIR convention so the encrypted\n * room-key files land next to the rest of the agent's persistent state.\n */\nfunction resolveStateDir(): string {\n return process.env.ELIZA_STATE_DIR || join(homedir(), \".local/state/eliza\");\n}\n\n/**\n * Derive the encrypted crypto-store file path for an account. The account id is\n * sanitized so an arbitrary configured id can never escape the keys directory.\n * The file holds the full serialized rust-crypto IndexedDB snapshot (device\n * identity, cross-signing, and inbound megolm sessions), not just room keys.\n */\nfunction cryptoStoreFilePath(accountId: string): string {\n const safeId = accountId.replace(/[^a-zA-Z0-9._-]/g, \"_\") || \"default\";\n return join(resolveStateDir(), \"matrix-keys\", `${safeId}.enc`);\n}\n\n/**\n * AES-256-GCM envelope matching the vault wire format\n * (`v1:<nonce_b64>:<tag_b64>:<ct_b64>`). The key is derived per-account from the\n * access token via scrypt, so the at-rest file never contains usable crypto\n * state without the live token. Operates on Buffers: the crypto-store snapshot\n * is a v8-serialized binary blob, so there is no intermediate string form.\n */\nfunction encryptCryptoStore(accessToken: string, plaintext: Buffer): string {\n const key = scryptSync(accessToken, ROOM_KEY_SCRYPT_SALT, ROOM_KEY_BYTES);\n const nonce = randomBytes(ROOM_KEY_NONCE_BYTES);\n const cipher = createCipheriv(\"aes-256-gcm\", key, nonce);\n const ct = Buffer.concat([cipher.update(plaintext), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `v1:${nonce.toString(\"base64\")}:${tag.toString(\"base64\")}:${ct.toString(\"base64\")}`;\n}\n\nfunction decryptCryptoStore(accessToken: string, ciphertext: string): Buffer {\n const parts = ciphertext.split(\":\");\n if (parts.length !== 4 || parts[0] !== \"v1\") {\n throw new Error(\"malformed crypto-store ciphertext\");\n }\n const key = scryptSync(accessToken, ROOM_KEY_SCRYPT_SALT, ROOM_KEY_BYTES);\n const nonce = Buffer.from(parts[1], \"base64\");\n const tag = Buffer.from(parts[2], \"base64\");\n const ct = Buffer.from(parts[3], \"base64\");\n const decipher = createDecipheriv(\"aes-256-gcm\", key, nonce);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(ct), decipher.final()]);\n}\n\n/**\n * Open an IndexedDB database. With a version + upgrade callback this triggers a\n * schema upgrade; without, it opens at the current version. Resolves the\n * IDBDatabase or rejects with the request error.\n */\nfunction openIndexedDb(\n name: string,\n version?: number,\n upgrade?: (db: IDBDatabase) => void\n): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const request = version ? indexedDB.open(name, version) : indexedDB.open(name);\n if (upgrade) {\n request.onupgradeneeded = (event) => upgrade((event.target as IDBOpenDBRequest).result);\n }\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction transactionDone(tx: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n tx.oncomplete = () => resolve();\n tx.onerror = () => reject(tx.error);\n tx.onabort = () => reject(tx.error);\n });\n}\n\n/**\n * Read every object store of an IndexedDB database into a serializable snapshot:\n * each store's schema (keyPath, autoIncrement, indexes) plus all of its records.\n * Pure over the global `indexedDB`, so it is unit-testable with fake-indexeddb.\n */\nexport async function snapshotDb(name: string): Promise<CryptoStoreSnapshot> {\n const db = await openIndexedDb(name);\n const snapshot: CryptoStoreSnapshot = { version: db.version, stores: {} };\n for (const storeName of [...db.objectStoreNames]) {\n const store = db.transaction(storeName, \"readonly\").objectStore(storeName);\n const records: { key: IDBValidKey; value: unknown }[] = [];\n await new Promise<void>((resolve, reject) => {\n const cursorRequest = store.openCursor();\n cursorRequest.onsuccess = () => {\n const cursor = cursorRequest.result;\n if (cursor) {\n records.push({ key: cursor.primaryKey, value: cursor.value });\n cursor.continue();\n } else {\n resolve();\n }\n };\n cursorRequest.onerror = () => reject(cursorRequest.error);\n });\n snapshot.stores[storeName] = {\n schema: {\n keyPath: store.keyPath,\n autoIncrement: store.autoIncrement,\n indexes: [...store.indexNames].map((indexName) => {\n const index = store.index(indexName);\n return {\n name: indexName,\n keyPath: index.keyPath,\n unique: index.unique,\n multiEntry: index.multiEntry,\n };\n }),\n },\n records,\n };\n }\n db.close();\n return snapshot;\n}\n\n/**\n * Recreate an IndexedDB database from a snapshot: delete any existing db, build\n * the stores + indexes in an upgrade transaction, then replay the records.\n * Keyless stores re-supply the out-of-line key; keyPath stores derive it.\n * Pure over the global `indexedDB`, so it is unit-testable with fake-indexeddb.\n */\nexport async function restoreDb(name: string, snapshot: CryptoStoreSnapshot): Promise<void> {\n await new Promise<void>((resolve) => {\n const request = indexedDB.deleteDatabase(name);\n request.onsuccess = () => resolve();\n request.onerror = () => resolve();\n request.onblocked = () => resolve();\n });\n const db = await openIndexedDb(name, snapshot.version, (upgradeDb) => {\n for (const [storeName, { schema }] of Object.entries(snapshot.stores)) {\n const store = upgradeDb.createObjectStore(storeName, {\n keyPath: schema.keyPath ?? undefined,\n autoIncrement: schema.autoIncrement,\n });\n for (const index of schema.indexes) {\n store.createIndex(index.name, index.keyPath, {\n unique: index.unique,\n multiEntry: index.multiEntry,\n });\n }\n }\n });\n for (const [storeName, { schema, records }] of Object.entries(snapshot.stores)) {\n const tx = db.transaction(storeName, \"readwrite\");\n const store = tx.objectStore(storeName);\n for (const { key, value } of records) {\n if (schema.keyPath) {\n store.put(value);\n } else {\n store.put(value, key);\n }\n }\n await transactionDone(tx);\n }\n db.close();\n}\n\nfunction normalizeConnectorLimit(limit: number | undefined, fallback = 50): number {\n if (!Number.isFinite(limit) || !limit || limit <= 0) {\n return fallback;\n }\n return Math.min(Math.floor(limit), 200);\n}\n\n/**\n * Map a raw Matrix timeline event to a MatrixMessage. Returns null for events\n * we don't surface as chat: non-text msgtypes, non-string bodies, and events\n * without a room id (this also naturally skips state events and still-encrypted\n * events whose type stays \"m.room.encrypted\").\n */\nfunction buildMatrixMessage(event: sdk.MatrixEvent, room: sdk.Room): MatrixMessage | null {\n const content = event.getContent();\n const msgType = content.msgtype;\n if (msgType !== \"m.text\") return null;\n if (typeof content.body !== \"string\") return null;\n\n const roomId = event.getRoomId();\n if (!roomId) return null;\n\n const sender = event.getSender();\n const senderMember = room.getMember(sender || \"\");\n\n const senderInfo: MatrixUserInfo = {\n userId: sender || \"\",\n displayName: senderMember?.name,\n avatarUrl: senderMember?.getMxcAvatarUrl() || undefined,\n };\n\n const relatesTo = content[\"m.relates_to\"];\n const isEdit = relatesTo?.rel_type === \"m.replace\";\n const threadId = relatesTo?.rel_type === \"m.thread\" ? relatesTo.event_id : undefined;\n const replyTo = relatesTo?.[\"m.in_reply_to\"]?.event_id;\n\n return {\n eventId: event.getId() || \"\",\n roomId,\n sender: sender || \"\",\n senderInfo,\n content: content.body,\n msgType,\n formattedBody: typeof content.formatted_body === \"string\" ? content.formatted_body : undefined,\n timestamp: event.getTs(),\n threadId,\n replyTo,\n isEdit,\n replacesEventId: isEdit ? relatesTo?.event_id : undefined,\n };\n}\n\n/**\n * Build a core Memory from a MatrixMessage, deriving deterministic ids the same\n * way the inbound dispatch path does so reads and the live message loop agree.\n */\nfunction matrixMessageToMemory(\n runtime: IAgentRuntime,\n message: Pick<\n MatrixMessage,\n \"roomId\" | \"eventId\" | \"timestamp\" | \"sender\" | \"content\" | \"replyTo\"\n >,\n channelType: ChannelType\n): Memory {\n const roomId = message.roomId;\n return {\n id: createUniqueUuid(runtime, message.eventId || `${roomId}:${message.timestamp}`),\n entityId: createUniqueUuid(runtime, message.sender || roomId),\n agentId: runtime.agentId,\n roomId: createUniqueUuid(runtime, message.roomId),\n content: {\n text: message.content,\n source: MATRIX_SERVICE_NAME,\n channelType,\n ...(message.replyTo ? { inReplyTo: createUniqueUuid(runtime, message.replyTo) } : {}),\n },\n createdAt: message.timestamp,\n };\n}\n\nasync function readStoredMessageMemories(\n runtime: IAgentRuntime,\n roomId: UUID,\n limit: number\n): Promise<Memory[]> {\n return runtime.getMemories({\n tableName: \"messages\",\n roomId,\n limit,\n orderBy: \"createdAt\",\n orderDirection: \"desc\",\n });\n}\n\n/**\n * Resolve the raw Matrix room id (e.g. \"!abc:server\") for a connector target.\n * The canonical `read_channel \"<room>\"` path sets the room only in\n * `target.channelId`; older resolved targets may instead carry the core room\n * UUID in `target.roomId`, from which the raw id is recoverable via getRoom().\n */\nasync function resolveMatrixRoomId(\n runtime: IAgentRuntime,\n target: TargetInfo | undefined\n): Promise<string> {\n return String(\n target?.channelId ??\n (target?.roomId ? (await runtime.getRoom(target.roomId))?.channelId : \"\") ??\n \"\"\n ).trim();\n}\n\n/**\n * Read recent messages across the account's joined rooms, newest-first. Uses\n * the live SDK timeline (and encrypted placeholders) per room — the same source\n * as the single-room branch — so the multi-room/recent case stays consistent.\n */\nasync function readJoinedRoomMessages(\n service: MatrixService,\n accountId: string,\n limit: number\n): Promise<Memory[]> {\n const rooms = (await service.getJoinedRooms(accountId)).slice(0, 10);\n const chunks = await Promise.all(\n rooms.map((room) => service.getRoomMessages(room.roomId, limit, accountId))\n );\n return chunks\n .flat()\n .sort((left, right) => (right.createdAt ?? 0) - (left.createdAt ?? 0))\n .slice(0, limit);\n}\n\n/**\n * Read up to `limit` messages for a connector target: resolve the target to a\n * Matrix room and read its live timeline (falling back to stored memories when\n * the live read is empty), or read across all joined rooms when the target names\n * no specific room. Shared by the fetchMessages and searchMessages hooks.\n */\nasync function readMessagesForTarget(\n service: MatrixService,\n runtime: IAgentRuntime,\n accountId: string,\n target: TargetInfo | undefined,\n limit: number\n): Promise<Memory[]> {\n const matrixRoomId = await resolveMatrixRoomId(runtime, target);\n if (!matrixRoomId) {\n return readJoinedRoomMessages(service, accountId, limit);\n }\n const live = await service.getRoomMessages(matrixRoomId, limit, accountId);\n if (live.length > 0) {\n return live;\n }\n return readStoredMessageMemories(runtime, createUniqueUuid(runtime, matrixRoomId), limit);\n}\n\nfunction filterMemoriesByQuery(memories: Memory[], query: string, limit: number): Memory[] {\n const normalized = query.trim().toLowerCase();\n if (!normalized) {\n return memories.slice(0, limit);\n }\n return memories\n .filter((memory) => {\n const text = typeof memory.content?.text === \"string\" ? memory.content.text : \"\";\n return text.toLowerCase().includes(normalized);\n })\n .slice(0, limit);\n}\n\nfunction extractMatrixSendOptions(content: Content, target: TargetInfo): MatrixMessageSendOptions {\n const data = content.data as Record<string, unknown> | undefined;\n const matrixData = (data?.matrix && typeof data.matrix === \"object\" ? data.matrix : data) as\n | Record<string, unknown>\n | undefined;\n\n return {\n threadId:\n target.threadId ||\n (typeof matrixData?.threadId === \"string\" ? matrixData.threadId : undefined),\n replyTo: typeof matrixData?.replyTo === \"string\" ? matrixData.replyTo : undefined,\n formatted: matrixData?.formatted === true,\n };\n}\n\n/**\n * Matrix messaging service for ElizaOS agents.\n */\nexport class MatrixService extends Service implements IMatrixService {\n static serviceType: string = MATRIX_SERVICE_NAME;\n\n capabilityDescription = \"Matrix messaging service for chat communication\";\n\n protected declare runtime: IAgentRuntime;\n private states = new Map<string, MatrixAccountState>();\n private defaultAccountId = DEFAULT_MATRIX_ACCOUNT_ID;\n\n /**\n * Start the Matrix service.\n */\n static async start(runtime: IAgentRuntime): Promise<MatrixService> {\n const service = new MatrixService();\n await service.initialize(runtime);\n return service;\n }\n\n /**\n * Stop the Matrix service.\n */\n static override async stopRuntime(runtime: IAgentRuntime): Promise<void> {\n const service = runtime.getService(MATRIX_SERVICE_NAME) as MatrixService | undefined;\n if (service) {\n await service.stop();\n }\n }\n\n static registerSendHandlers(\n runtime: IAgentRuntime,\n service: MatrixService,\n accountId = service.getAccountId(runtime)\n ): void {\n accountId = normalizeMatrixAccountId(accountId);\n const sendHandler = async (\n handlerRuntime: IAgentRuntime,\n target: TargetInfo,\n content: Content\n ): Promise<Memory | undefined> => {\n await service.handleSendMessage(handlerRuntime, target, content);\n return undefined;\n };\n\n if (typeof runtime.registerMessageConnector === \"function\") {\n const registration = {\n source: MATRIX_SERVICE_NAME,\n accountId,\n label: \"Matrix\",\n capabilities: [\n \"send_message\",\n \"send_thread_reply\",\n \"send_formatted_message\",\n \"react_to_message\",\n \"list_rooms\",\n \"join_room\",\n ],\n supportedTargetKinds: [\"room\", \"channel\", \"thread\", \"user\"],\n contexts: [\"social\", \"connectors\"],\n description:\n \"Send messages to joined Matrix rooms, aliases, encrypted rooms, and known direct-message rooms.\",\n metadata: {\n accountId,\n service: MATRIX_SERVICE_NAME,\n },\n sendHandler,\n resolveTargets: async (query) => {\n const rooms = await service.getJoinedRooms(accountId);\n return rooms\n .map((room) => ({ room, score: scoreMatrixRoom(room, query) }))\n .filter(({ score }) => score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, 10)\n .map(({ room, score }) => matrixRoomToConnectorTarget(room, score, accountId));\n },\n listRecentTargets: async () =>\n (await service.getJoinedRooms(accountId))\n .slice(0, 10)\n .map((room) => matrixRoomToConnectorTarget(room, 0.5, accountId)),\n listRooms: async () =>\n (await service.getJoinedRooms(accountId)).map((room) =>\n matrixRoomToConnectorTarget(room, 0.5, accountId)\n ),\n fetchMessages: async (context, params) => {\n const limit = normalizeConnectorLimit(params?.limit);\n const target = params?.target ?? context.target;\n return readMessagesForTarget(service, context.runtime, accountId, target, limit);\n },\n searchMessages: async (context, params) => {\n const limit = normalizeConnectorLimit(params?.limit);\n const target = params?.target ?? context.target;\n // Scan wider than the requested limit so the query filter has candidates.\n const messages = await readMessagesForTarget(\n service,\n context.runtime,\n accountId,\n target,\n Math.max(limit, 100)\n );\n return filterMemoriesByQuery(messages, params.query, limit);\n },\n reactHandler: async (handlerRuntime, params) => {\n const target = params.target ?? ({ source: MATRIX_SERVICE_NAME } as TargetInfo);\n const room = target.roomId ? await handlerRuntime.getRoom(target.roomId) : null;\n const roomId = String(target.channelId ?? room?.channelId ?? \"\").trim();\n const mutationParams = params as ConnectorMutationParams;\n const eventId = String(mutationParams.eventId ?? params.messageId ?? \"\").trim();\n const emoji = String(params.emoji ?? \"\").trim();\n if (!roomId || !eventId || !emoji) {\n throw new Error(\"Matrix reactHandler requires room, event id, and emoji\");\n }\n const result = await service.sendReaction(roomId, eventId, emoji, accountId);\n if (!result.success) {\n throw new Error(result.error || \"Matrix reaction failed\");\n }\n },\n joinHandler: async (_handlerRuntime, params) => {\n const membershipParams = params as ConnectorRoomMembershipParams;\n const roomIdOrAlias = String(\n membershipParams.roomIdOrAlias ??\n params.alias ??\n params.invite ??\n params.channelId ??\n params.roomId ??\n \"\"\n ).trim();\n if (!roomIdOrAlias) {\n throw new Error(\"Matrix joinHandler requires a room ID or alias\");\n }\n await service.joinRoom(roomIdOrAlias, accountId);\n },\n leaveHandler: async (handlerRuntime, params) => {\n const target = params.target ?? ({ source: MATRIX_SERVICE_NAME } as TargetInfo);\n const room = target.roomId ? await handlerRuntime.getRoom(target.roomId) : null;\n const roomId = String(\n params?.roomId ?? params?.channelId ?? target.channelId ?? room?.channelId ?? \"\"\n );\n if (!roomId) {\n throw new Error(\"Matrix leaveHandler requires a room ID\");\n }\n await service.leaveRoom(roomId, accountId);\n },\n getChatContext: async (target, context) => {\n const room = target.roomId ? await context.runtime.getRoom(target.roomId) : null;\n const channelId = String(target.channelId ?? room?.channelId ?? \"\").trim();\n const joinedRoom = (await service.getJoinedRooms(accountId)).find(\n (candidate) => candidate.roomId === channelId || candidate.canonicalAlias === channelId\n );\n if (!joinedRoom) {\n return null;\n }\n\n return {\n target: {\n source: MATRIX_SERVICE_NAME,\n accountId,\n channelId: joinedRoom.roomId,\n roomId: target.roomId,\n },\n label: joinedRoom.name || joinedRoom.canonicalAlias || joinedRoom.roomId,\n summary: joinedRoom.topic,\n metadata: {\n accountId,\n roomId: joinedRoom.roomId,\n canonicalAlias: joinedRoom.canonicalAlias,\n isEncrypted: joinedRoom.isEncrypted,\n isDirect: joinedRoom.isDirect,\n memberCount: joinedRoom.memberCount,\n },\n } satisfies MessageConnectorChatContext;\n },\n getUserContext: async (entityId, context) => {\n if (typeof context.runtime.getEntityById !== \"function\") {\n return null;\n }\n const entity = await context.runtime.getEntityById(String(entityId) as UUID);\n if (!entity) {\n return null;\n }\n return {\n entityId,\n label: entity.names?.[0],\n aliases: entity.names,\n handles: {},\n metadata: entity.metadata,\n };\n },\n } as ExtendedMessageConnectorRegistration;\n runtime.registerMessageConnector(registration);\n return;\n }\n\n runtime.registerSendHandler(MATRIX_SERVICE_NAME, sendHandler);\n }\n\n /**\n * Initialize the Matrix service.\n */\n private async initialize(runtime: IAgentRuntime): Promise<void> {\n this.runtime = runtime;\n this.defaultAccountId = normalizeMatrixAccountId(resolveDefaultMatrixAccountId(runtime));\n\n const accountIds = listMatrixAccountIds(runtime);\n for (const accountId of accountIds) {\n const settings = this.loadSettings(accountId);\n if (settings.enabled === false) {\n continue;\n }\n\n this.validateSettings(settings);\n\n const state: MatrixAccountState = {\n accountId: normalizeMatrixAccountId(settings.accountId),\n settings,\n client: sdk.createClient({\n baseUrl: settings.homeserver,\n userId: settings.userId,\n accessToken: settings.accessToken,\n deviceId: settings.deviceId,\n verificationMethods: [\"m.sas.v1\"],\n }),\n connected: false,\n syncing: false,\n };\n\n this.states.set(state.accountId, state);\n await this.initCrypto(state);\n this.startCryptoSnapshot(state);\n this.setupEventHandlers(state);\n await this.connect(state);\n MatrixService.registerSendHandlers(runtime, this, state.accountId);\n\n logger.info(`Matrix service initialized for ${settings.userId} on ${settings.homeserver}`);\n }\n\n if (this.states.size === 0) {\n const settings = this.loadSettings(this.defaultAccountId);\n this.validateSettings(settings);\n }\n }\n\n /**\n * Load settings from runtime.\n */\n private loadSettings(accountId?: string): MatrixSettings {\n return resolveMatrixAccountSettings(this.runtime, accountId);\n }\n\n /**\n * Validate the settings.\n */\n private validateSettings(settings: MatrixSettings): void {\n if (!settings.homeserver) {\n throw new MatrixConfigurationError(\"MATRIX_HOMESERVER is required\", \"MATRIX_HOMESERVER\");\n }\n\n if (!settings.userId) {\n throw new MatrixConfigurationError(\"MATRIX_USER_ID is required\", \"MATRIX_USER_ID\");\n }\n\n if (!settings.accessToken) {\n throw new MatrixConfigurationError(\"MATRIX_ACCESS_TOKEN is required\", \"MATRIX_ACCESS_TOKEN\");\n }\n }\n\n /**\n * Initialize end-to-end encryption for an account when MATRIX_ENCRYPTION is\n * enabled. Most homeservers (including Continuwuity) encrypt rooms by\n * default, so without crypto the client can neither decrypt inbound nor\n * encrypt outbound messages — it would silently drop everything.\n *\n * The rust-crypto store persists in IndexedDB. This runtime (Bun/Node) has no\n * native IndexedDB, so `fake-indexeddb/auto` installs a global one and the\n * whole crypto state — device identity, cross-signing, and inbound megolm\n * sessions — is snapshotted to an encrypted file via saveCryptoStore and\n * restored before init via restoreCryptoStore. A stable device keeps the\n * curve25519/ed25519 identity across restarts, so senders treat it as the\n * same trusted device and keep sharing room keys (including forwarded history\n * keys at join), which is what makes history decryptable.\n *\n * Non-fatal by construction: if anything in the persistence path fails we fall\n * back to an in-memory store so the Matrix connection still comes up. Never\n * throws.\n */\n private async initCrypto(state: MatrixAccountState): Promise<void> {\n if (!state.settings.encryption) {\n return;\n }\n if (typeof state.client.initRustCrypto !== \"function\") {\n logger.warn(\n \"Matrix encryption requested but initRustCrypto is unavailable in this matrix-js-sdk build; messages in encrypted rooms will be unreadable.\"\n );\n return;\n }\n let cryptoUp = false;\n try {\n await import(\"fake-indexeddb/auto\");\n await this.restoreCryptoStore(state);\n await state.client.initRustCrypto({\n useIndexedDB: true,\n cryptoDatabasePrefix: cryptoDbPrefix(state.accountId),\n });\n logger.info(\n `Matrix E2EE initialized (persistent rust-crypto via IndexedDB) for ${state.settings.userId}`\n );\n cryptoUp = true;\n } catch (err) {\n logger.warn(\n `Matrix persistent crypto init failed (${err instanceof Error ? err.message : String(err)}); falling back to in-memory crypto (device will re-key on restart).`\n );\n }\n if (!cryptoUp) {\n try {\n await state.client.initRustCrypto({ useIndexedDB: false });\n logger.info(`Matrix E2EE initialized (in-memory rust-crypto) for ${state.settings.userId}`);\n cryptoUp = true;\n } catch (err) {\n logger.warn(\n `Matrix encryption failed to initialize (${err instanceof Error ? err.message : String(err)}); encrypted rooms will be unreadable, but the Matrix connection will continue.`\n );\n }\n }\n // Cross-signing makes strict senders share keys; it must run regardless of\n // which crypto backend came up, so do it once here after either path.\n if (cryptoUp) {\n await this.ensureCrossSigning(state);\n }\n }\n\n /**\n * Self-cross-sign this device so cohort senders running \"exclude insecure\n * devices\" (MSC4153) share megolm room keys to it — the thing that makes\n * encrypted cohort messages decryptable. The device otherwise carries an empty\n * cross-signing identity and is structurally skipped by those senders.\n *\n * Works with only an access token: MSC3967 (implemented by the homeserver) lets\n * the FIRST device-signing-key upload through with no UIA, so we send auth=null\n * and soft-fail (log, never throw) if the server still demands a password we\n * don't have. Idempotent + non-fatal: the signing keys persist in the\n * snapshotted rust store, so isCrossSigningReady() short-circuits this on every\n * later boot, and any failure leaves the Matrix connection untouched.\n */\n private async ensureCrossSigning(state: MatrixAccountState): Promise<void> {\n const crypto =\n typeof state.client.getCrypto === \"function\" ? state.client.getCrypto() : undefined;\n if (!crypto) {\n return;\n }\n try {\n // Never be the side that withholds: encrypt to unverified cohort devices\n // and trust owner-cross-signed devices (both SDK defaults, set explicitly\n // so a future default change can't silently gate us).\n crypto.globalBlacklistUnverifiedDevices = false;\n crypto.setTrustCrossSignedDevices(true);\n\n if (await crypto.isCrossSigningReady()) {\n return;\n }\n\n await crypto.bootstrapCrossSigning({\n authUploadDeviceSigningKeys: async (makeRequest) => {\n // First try the no-auth upload (MSC3967). Homeservers that don't\n // implement it answer 401 with a UIA challenge; satisfy m.login.password\n // with the challenge session when MATRIX_PASSWORD is configured,\n // otherwise soft-fail so the connection is unaffected.\n try {\n return await makeRequest(null);\n } catch (err) {\n const data = (err as { data?: { session?: string; flows?: unknown } })?.data;\n if (!data?.flows) {\n throw err;\n }\n if (!state.settings.password || !data.session) {\n logger.warn(\n `Matrix cross-signing upload for ${state.settings.userId} needs password UIA but ${state.settings.password ? \"the server returned no challenge session\" : \"no MATRIX_PASSWORD is set\"}; device ${state.settings.deviceId ?? \"?\"} stays uncross-signed, so exclude-insecure-devices senders will withhold keys.`\n );\n throw err;\n }\n return await makeRequest({\n type: \"m.login.password\",\n identifier: { type: \"m.id.user\", user: state.settings.userId },\n password: state.settings.password,\n session: data.session,\n });\n }\n },\n });\n logger.info(\n `Matrix cross-signing bootstrapped for ${state.settings.userId}; senders should now share megolm keys to this device.`\n );\n await crypto.checkKeyBackupAndEnable().catch(() => {});\n } catch (err) {\n logger.warn(\n `Matrix cross-signing bootstrap skipped (${err instanceof Error ? err.message : String(err)}); cohort senders in exclude-insecure-devices mode may withhold keys until this device is verified once from an operator's Matrix client.`\n );\n }\n }\n\n /**\n * Restore the persisted rust-crypto IndexedDB store from the encrypted at-rest\n * file into the live (fake-indexeddb) global, replacing whatever is there.\n * Must run BEFORE initRustCrypto so the store is populated when the crypto\n * stack opens it.\n *\n * Strictly additive and non-fatal: any failure (missing file, corrupt data,\n * token rotation making decrypt impossible) only warns and returns, leaving an\n * empty store so the device starts fresh.\n */\n private async restoreCryptoStore(state: MatrixAccountState): Promise<void> {\n try {\n const filePath = cryptoStoreFilePath(state.accountId);\n if (!existsSync(filePath)) {\n return;\n }\n const ciphertext = await readFile(filePath, \"utf8\");\n let snapshot: CryptoStoreSnapshot;\n try {\n snapshot = v8Deserialize(decryptCryptoStore(state.settings.accessToken, ciphertext));\n } catch {\n // Corrupt file or rotated token — start fresh rather than blocking init.\n logger.warn(\n `Matrix crypto-store restore skipped for ${state.accountId}: stored state could not be decrypted (token may have rotated).`\n );\n return;\n }\n await restoreDb(cryptoDbName(state.accountId), snapshot);\n logger.info(`Matrix restored persisted crypto store for ${state.accountId}`);\n } catch (err) {\n logger.warn(\n `Matrix crypto-store restore failed for ${state.accountId}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n /**\n * Snapshot the live rust-crypto IndexedDB store and persist it, encrypted at\n * rest, so the device identity and room keys survive a process restart. The\n * snapshot contains PRIVATE device keys, so it is written 0600 and encrypted\n * under a token-derived key. Atomic (tmp + rename) so a crash mid-write can\n * never truncate the live file. Strictly additive and non-fatal: failures only\n * warn and never affect the Matrix connection.\n */\n private async saveCryptoStore(state: MatrixAccountState): Promise<void> {\n // No global IndexedDB means initCrypto fell back to the in-memory store\n // (nothing to snapshot). Skip silently rather than warn every tick.\n if (typeof indexedDB === \"undefined\") {\n return;\n }\n try {\n const snapshot = await snapshotDb(cryptoDbName(state.accountId));\n const ciphertext = encryptCryptoStore(state.settings.accessToken, v8Serialize(snapshot));\n const filePath = cryptoStoreFilePath(state.accountId);\n const tmpPath = `${filePath}.${randomBytes(6).toString(\"hex\")}.tmp`;\n await mkdir(join(resolveStateDir(), \"matrix-keys\"), { recursive: true, mode: 0o700 });\n await writeFile(tmpPath, ciphertext, { mode: 0o600 });\n // mode on writeFile only applies on create; chmod enforces 0o600 even when\n // an existing temp name somehow had looser permissions.\n await chmod(tmpPath, 0o600);\n await rename(tmpPath, filePath);\n } catch (err) {\n logger.warn(\n `Matrix crypto-store save failed for ${state.accountId}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n /**\n * Start the periodic crypto-store snapshot for an account. The interval is\n * unref'd so it never keeps the process alive on its own, and its handle is\n * stored on the account state so stop() can clear it.\n */\n private startCryptoSnapshot(state: MatrixAccountState): void {\n if (!state.settings.encryption) {\n return;\n }\n const timer = setInterval(() => {\n void this.saveCryptoStore(state);\n }, CRYPTO_SNAPSHOT_INTERVAL_MS);\n timer.unref?.();\n state.cryptoSnapshotTimer = timer;\n }\n\n /**\n * Set up event handlers for the Matrix client.\n */\n private setupEventHandlers(state: MatrixAccountState): void {\n // Sync events\n state.client.on(sdk.ClientEvent.Sync, (syncState) => {\n if (syncState === \"PREPARED\") {\n state.syncing = true;\n logger.info(\"Matrix sync complete\");\n this.runtime.emitEvent(MatrixEventTypes.SYNC_COMPLETE, {\n runtime: this.runtime,\n accountId: state.accountId,\n } as EventPayload);\n }\n });\n\n // Room timeline events (messages)\n state.client.on(sdk.RoomEvent.Timeline, (event, room, toStartOfTimeline) => {\n if (toStartOfTimeline) return;\n if (event.getSender() === state.settings.userId) return;\n\n // In E2EE rooms the event surfaces as m.room.encrypted until the crypto\n // stack decrypts it. If decryption is still pending, wait for the\n // Decrypted event before dispatching; otherwise dispatch immediately.\n if (event.isEncrypted() && event.getType() === \"m.room.encrypted\") {\n event.once(sdk.MatrixEventEvent.Decrypted, () => {\n if (event.getType() === \"m.room.message\") {\n this.handleRoomMessage(state, event, room);\n } else if (event.isDecryptionFailure()) {\n logger.warn(\n `Matrix could not decrypt event ${event.getId()} in ${event.getRoomId()} — the sender has not shared the megolm key with this device yet.`\n );\n }\n });\n return;\n }\n\n if (event.getType() !== \"m.room.message\") return;\n this.handleRoomMessage(state, event, room);\n });\n\n // Room membership events\n state.client.on(sdk.RoomMemberEvent.Membership, (event, member) => {\n if (member.userId !== state.settings.userId) return;\n\n if (member.membership === \"invite\" && state.settings.autoJoin) {\n const roomId = event.getRoomId();\n if (roomId) {\n logger.info(`Auto-joining room ${roomId}`);\n state.client.joinRoom(roomId).catch((err) => {\n logger.error(`Failed to auto-join room: ${err.message}`);\n });\n }\n }\n });\n\n this.setupVerificationAutoAccept(state);\n }\n\n /**\n * Let allow-listed users verify this device via SAS (emoji) verification from\n * their own Matrix client. On homeservers where the bot can't self-cross-sign\n * (no MSC3967 + no password), this is how senders come to trust the device and\n * start sharing megolm keys to it — and the verifying user's client also\n * gossips the room keys it already holds, backfilling history.\n *\n * Fail-closed: with no MATRIX_VERIFY_ALLOWLIST nothing is accepted, so this is\n * inert unless explicitly configured. The verified trust persists in the\n * snapshotted crypto store, so it is a one-time action per user.\n */\n private setupVerificationAutoAccept(state: MatrixAccountState): void {\n const crypto = state.client.getCrypto();\n if (!crypto || state.settings.verifyAllowlist.length === 0) {\n return;\n }\n state.client.on(CryptoEvent.VerificationRequestReceived, (request) => {\n void this.handleVerificationRequest(state, request);\n });\n }\n\n private async handleVerificationRequest(\n state: MatrixAccountState,\n request: VerificationRequest\n ): Promise<void> {\n const other = request.otherUserId;\n if (!state.settings.verifyAllowlist.includes(other)) {\n logger.warn(`Matrix rejecting verification request from non-allowlisted ${other}`);\n await request.cancel().catch(() => {});\n return;\n }\n logger.info(`Matrix auto-accepting SAS verification from ${other}`);\n try {\n if (canAcceptVerificationRequest(request)) {\n await request.accept();\n }\n const verifier = request.verifier ?? (await this.awaitVerifier(request));\n if (!verifier) {\n await request.cancel().catch(() => {});\n return;\n }\n verifier.on(VerifierEvent.ShowSas, (callbacks: ShowSasCallbacks) => {\n logger.info(`Matrix auto-confirming SAS with ${other}`);\n void callbacks.confirm().catch(() => {});\n });\n await verifier.verify();\n logger.info(\n `Matrix device verification with ${other} complete; megolm keys should now flow.`\n );\n } catch (err) {\n logger.warn(\n `Matrix verification with ${other} failed or was cancelled (${err instanceof Error ? err.message : String(err)}).`\n );\n }\n }\n\n /**\n * Wait for the verifier to materialize. The bot is a pure responder: the\n * initiator (e.g. Element) sends the m.key.verification.start, which creates\n * the verifier on our side. We only start SAS ourselves as a fallback, after a\n * short grace period, for the rare initiator that waits for the responder to\n * start — starting eagerly would race the initiator's start (\"glare\") and the\n * two sides would compute the SAS over different start events, failing the\n * match. Resolves undefined if the request is cancelled or completes first.\n */\n private awaitVerifier(request: VerificationRequest): Promise<Verifier | undefined> {\n return new Promise((resolve) => {\n let fallbackTimer: ReturnType<typeof setTimeout> | undefined;\n const settle = (value: Verifier | undefined) => {\n if (fallbackTimer) clearTimeout(fallbackTimer);\n request.off(VerificationRequestEvent.Change, onChange);\n resolve(value);\n };\n const onChange = () => {\n if (request.verifier) {\n settle(request.verifier);\n } else if (\n request.phase === VerificationPhase.Cancelled ||\n request.phase === VerificationPhase.Done\n ) {\n settle(undefined);\n } else if (request.phase === VerificationPhase.Ready && !fallbackTimer) {\n fallbackTimer = setTimeout(() => {\n if (!request.verifier) {\n request.startVerification(\"m.sas.v1\").then(settle, () => settle(undefined));\n }\n }, VERIFICATION_START_FALLBACK_MS);\n }\n };\n request.on(VerificationRequestEvent.Change, onChange);\n onChange();\n });\n }\n\n /**\n * Handle an incoming room message.\n */\n private handleRoomMessage(\n state: MatrixAccountState,\n event: sdk.MatrixEvent,\n room: sdk.Room | undefined\n ): void {\n if (!room) return;\n\n const message = buildMatrixMessage(event, room);\n if (!message) return;\n\n const roomId = message.roomId;\n\n // Check mention requirement. Skipped in 1:1 DMs: a direct message is\n // inherently addressed to the bot, so requiring an @mention there would\n // make it ignore the user. Group rooms still honor the gate.\n const isDirectRoom = room.getJoinedMemberCount() <= 2;\n if (state.settings.requireMention && !isDirectRoom) {\n const localpart = getMatrixLocalpart(state.settings.userId);\n const mentionPattern = new RegExp(`@?${escapeRegExp(localpart)}`, \"i\");\n if (!mentionPattern.test(message.content)) {\n return;\n }\n }\n\n const matrixRoom: MatrixRoom = {\n roomId,\n name: room.name,\n topic: room.currentState.getStateEvents(\"m.room.topic\", \"\")?.getContent()?.topic,\n canonicalAlias: room.getCanonicalAlias() || undefined,\n isEncrypted: room.hasEncryptionStateEvent(),\n isDirect:\n state.client\n .getAccountData(sdk.EventType.Direct)\n ?.getContent()\n ?.[message.sender || \"\"]?.includes(roomId) || false,\n memberCount: room.getJoinedMemberCount(),\n };\n\n logger.debug(\n `Matrix message from ${message.senderInfo.displayName || message.sender} in ${room.name || roomId}: ${message.content.slice(0, 50)}...`\n );\n\n // Plugin-local event (kept for backward compatibility — other code may\n // listen for the MatrixMessage/MatrixRoom payload).\n this.runtime.emitEvent(MatrixEventTypes.MESSAGE_RECEIVED, {\n message,\n room: matrixRoom,\n runtime: this.runtime,\n accountId: state.accountId,\n } as EventPayload);\n\n // Drive the core message loop so the agent actually reads and replies.\n void this.dispatchToAgent(state, message, matrixRoom).catch((err) =>\n logger.error(\n `Matrix dispatchToAgent failed: ${err instanceof Error ? err.message : String(err)}`\n )\n );\n }\n\n /**\n * Feed an inbound Matrix message into the core message loop and wire a\n * callback that posts the agent's reply back to the same room. Mirrors the\n * connector pattern used by plugin-discord: emit EventType.MESSAGE_RECEIVED\n * with a core Memory and a HandlerCallback. The bootstrap message handler\n * runs the agent, decides whether to respond, and invokes the callback.\n */\n private async dispatchToAgent(\n state: MatrixAccountState,\n message: MatrixMessage,\n room: MatrixRoom\n ): Promise<void> {\n const roomId = room.roomId;\n const entityId = createUniqueUuid(this.runtime, message.sender || roomId);\n const coreRoomId = createUniqueUuid(this.runtime, roomId);\n const worldId = createUniqueUuid(this.runtime, roomId);\n // Member count is the reliable DM signal (m.direct account data is often\n // unset for a bot) and matches the mention-gate check in handleRoomMessage.\n const channelType = room.memberCount <= 2 ? ChannelType.DM : ChannelType.GROUP;\n const displayName = message.senderInfo.displayName || message.sender || \"Matrix user\";\n\n await this.runtime.ensureConnection({\n entityId,\n roomId: coreRoomId,\n roomName: room.name || roomId,\n userName: displayName,\n name: displayName,\n source: MATRIX_SERVICE_NAME,\n channelId: roomId,\n type: channelType,\n worldId,\n worldName: room.name,\n // Preserve the raw Matrix user id for role / allowlist checks.\n userId: (message.sender || roomId) as UUID,\n metadata: { accountId: state.accountId },\n });\n\n const coreMessage = matrixMessageToMemory(this.runtime, message, channelType);\n\n // Auto-reply is gated (default off, matching plugin-discord/telegram) so the\n // agent never speaks unprompted; passive LifeOps mode also suppresses it.\n // When gated off, the inbound message is still persisted to memory.\n const autoReplyRaw = this.runtime.getSetting(\"MATRIX_AUTO_REPLY\");\n const autoReply =\n !lifeOpsPassiveConnectorsEnabled(this.runtime) &&\n (autoReplyRaw === true || autoReplyRaw === \"true\");\n\n if (!autoReply) {\n try {\n await this.runtime.createMemory(coreMessage, \"messages\");\n } catch (err) {\n logger.warn(\n `Matrix inbound memory persist failed: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n try {\n await this.runtime.emitEvent(EventType.MESSAGE_RECEIVED, {\n runtime: this.runtime,\n message: coreMessage,\n source: MATRIX_SERVICE_NAME,\n });\n } catch (err) {\n logger.warn(\n `Matrix inbound event emit failed: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return;\n }\n\n if (!this.runtime.messageService) {\n logger.error(\"Matrix: runtime.messageService is unavailable; cannot process inbound message\");\n return;\n }\n\n const callback: HandlerCallback = async (responseContent: Content) => {\n const text = typeof responseContent.text === \"string\" ? responseContent.text.trim() : \"\";\n if (!text) {\n return [];\n }\n const result = await this.sendMessage(text, {\n accountId: state.accountId,\n roomId,\n threadId: message.threadId,\n replyTo: message.eventId,\n });\n if (!result.success) {\n logger.warn(`Matrix reply send failed in ${roomId}: ${result.error}`);\n return [];\n }\n const outbound: Memory = {\n id: createUniqueUuid(this.runtime, result.eventId ?? `${roomId}:reply:${Date.now()}`),\n entityId: this.runtime.agentId,\n agentId: this.runtime.agentId,\n roomId: coreRoomId,\n content: {\n text,\n source: MATRIX_SERVICE_NAME,\n channelType,\n inReplyTo: coreMessage.id,\n },\n createdAt: Date.now(),\n };\n try {\n await this.runtime.createMemory(outbound, \"messages\");\n } catch (err) {\n logger.warn(\n `Matrix outbound memory persist failed: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n return [outbound];\n };\n\n // Canonical dispatch: the core message loop runs through\n // messageService.handleMessage (mirrors plugin-discord/telegram), not a\n // bare EventType.MESSAGE_RECEIVED emit, which has no default handler.\n await this.runtime.messageService.handleMessage(this.runtime, coreMessage, callback);\n }\n\n /**\n * Connect to Matrix.\n */\n private async connect(state: MatrixAccountState): Promise<void> {\n await state.client.startClient({ initialSyncLimit: 10 });\n state.connected = true;\n\n // Wait for initial sync\n await new Promise<void>((resolve) => {\n const listener = (syncState: string) => {\n if (syncState === \"PREPARED\") {\n state.client.removeListener(sdk.ClientEvent.Sync, listener);\n resolve();\n }\n };\n state.client.on(sdk.ClientEvent.Sync, listener);\n });\n\n // Join configured rooms\n for (const room of state.settings.rooms) {\n try {\n await this.joinRoom(room, state.accountId);\n } catch (err) {\n logger.warn(`Failed to join room ${room}: ${err}`);\n }\n }\n }\n\n /**\n * Shutdown the service.\n */\n async stop(): Promise<void> {\n for (const state of this.states.values()) {\n if (state.cryptoSnapshotTimer) {\n clearInterval(state.cryptoSnapshotTimer);\n state.cryptoSnapshotTimer = undefined;\n }\n // Best-effort final flush so crypto state accumulated since the last tick\n // survives the restart. Non-fatal: saveCryptoStore swallows its own\n // failures. Guarded on encryption so a non-encrypted account doesn't\n // touch the (possibly absent) IndexedDB global.\n if (state.settings.encryption) {\n await this.saveCryptoStore(state);\n }\n state.client.stopClient();\n state.connected = false;\n state.syncing = false;\n }\n logger.info(\"Matrix service stopped\");\n }\n\n // ============================================================================\n // Public Interface\n // ============================================================================\n\n isConnected(): boolean {\n const legacy = this as { connected?: boolean; syncing?: boolean };\n const states = this.states ?? new Map<string, MatrixAccountState>();\n if (states.size === 0 && typeof legacy.connected === \"boolean\") {\n return legacy.connected && (legacy.syncing ?? true);\n }\n return Array.from(states.values()).some((state) => state.connected && state.syncing);\n }\n\n getAccountId(runtime?: IAgentRuntime): string {\n const legacy = this as { settings?: MatrixSettings };\n const states = this.states ?? new Map<string, MatrixAccountState>();\n if (states.size === 0 && legacy.settings?.accountId) {\n return normalizeMatrixAccountId(legacy.settings.accountId);\n }\n return normalizeMatrixAccountId(\n this.defaultAccountId !== DEFAULT_MATRIX_ACCOUNT_ID\n ? this.defaultAccountId\n : runtime\n ? resolveDefaultMatrixAccountId(runtime)\n : this.defaultAccountId\n );\n }\n\n getUserId(): string {\n return this.getState().settings.userId;\n }\n\n getHomeserver(): string {\n return this.getState().settings.homeserver;\n }\n\n async getJoinedRooms(accountId?: string): Promise<MatrixRoom[]> {\n const state = this.getState(accountId);\n const rooms = state.client.getRooms();\n return rooms\n .filter((room) => room.getMyMembership() === \"join\")\n .map((room) => ({\n roomId: room.roomId,\n name: room.name,\n topic: room.currentState.getStateEvents(\"m.room.topic\", \"\")?.getContent()?.topic,\n canonicalAlias: room.getCanonicalAlias() || undefined,\n isEncrypted: room.hasEncryptionStateEvent(),\n isDirect: false,\n memberCount: room.getJoinedMemberCount(),\n }));\n }\n\n /**\n * Read recent messages straight from the SDK's live room timeline (kept in\n * sync by the RoomEvent.Timeline listener), newest-first. Unlike the agent's\n * own memory DB, this surfaces room activity the agent never persisted —\n * e.g. a busy room where the bot was never mentioned.\n */\n async getRoomMessages(\n matrixRoomId: string,\n limit: number,\n accountId?: string\n ): Promise<Memory[]> {\n const state = this.getState(accountId);\n const room = state.client.getRoom(matrixRoomId);\n if (!room) {\n return [];\n }\n\n const channelType = room.getJoinedMemberCount() <= 2 ? ChannelType.DM : ChannelType.GROUP;\n const events = room.getLiveTimeline().getEvents();\n const out: Memory[] = [];\n for (let i = events.length - 1; i >= 0 && out.length < limit; i -= 1) {\n const event = events[i];\n const message = buildMatrixMessage(event, room);\n if (message) {\n const memory = matrixMessageToMemory(this.runtime, message, channelType);\n memory.content.name = message.senderInfo.displayName || message.sender;\n out.push(memory);\n continue;\n }\n // Faithfully surface an encrypted message the agent can't read, so the\n // agent reports real encrypted activity (who/when) rather than treating the\n // room as empty. Two shapes must both be caught: a still-undecrypted event\n // keeps wire type \"m.room.encrypted\", but once decryption has FAILED the SDK\n // flips getType() to \"m.room.message\" with a \"m.bad.encrypted\" body and only\n // isDecryptionFailure() stays true — the original bug was checking type\n // alone, so failed-decrypt events fell through and the room looked empty.\n if (event.getType() === \"m.room.encrypted\" || event.isDecryptionFailure()) {\n const sender = event.getSender() || \"unknown\";\n const placeholder = matrixMessageToMemory(\n this.runtime,\n {\n eventId: event.getId() || \"\",\n roomId: matrixRoomId,\n sender,\n content:\n \"🔒 [end-to-end encrypted message this device can't read — its device isn't cross-signed, so senders withhold the decryption keys. This needs a one-time device verification (or the account password) to unblock; it is NOT a sync or pagination issue.]\",\n timestamp: event.getTs(),\n },\n channelType\n );\n placeholder.content.name = room.getMember(sender)?.name || sender;\n out.push(placeholder);\n }\n }\n return out;\n }\n\n async sendMessage(text: string, options?: MatrixMessageSendOptions): Promise<MatrixSendResult> {\n const state = this.getState(options?.accountId);\n if (!state.connected || !state.syncing) {\n throw new MatrixNotConnectedError();\n }\n\n const roomId = options?.roomId;\n if (!roomId?.trim()) {\n return { success: false, error: \"Room ID is required\" };\n }\n\n // Resolve room ID from alias if needed\n let resolvedRoomId = roomId.trim();\n if (isValidMatrixRoomAlias(resolvedRoomId)) {\n const resolved = await state.client.getRoomIdForAlias(resolvedRoomId);\n resolvedRoomId = resolved.room_id;\n }\n\n // Build content\n const content: {\n body: string;\n format?: \"org.matrix.custom.html\";\n formatted_body?: string;\n msgtype: sdk.MsgType.Text;\n \"m.relates_to\"?: {\n event_id?: string;\n rel_type?: sdk.RelationType.Thread;\n \"m.in_reply_to\"?: {\n event_id: string;\n };\n };\n } = {\n msgtype: sdk.MsgType.Text,\n body: text,\n };\n\n if (options?.formatted) {\n content.format = \"org.matrix.custom.html\";\n content.formatted_body = text;\n }\n\n // Handle reply/thread\n if (options?.threadId || options?.replyTo) {\n content[\"m.relates_to\"] = {};\n\n if (options.threadId) {\n content[\"m.relates_to\"].rel_type = sdk.RelationType.Thread;\n content[\"m.relates_to\"].event_id = options.threadId;\n }\n\n if (options.replyTo) {\n content[\"m.relates_to\"][\"m.in_reply_to\"] = {\n event_id: options.replyTo,\n };\n }\n }\n\n const response = await state.client.sendMessage(\n resolvedRoomId,\n content as RoomMessageEventContent\n );\n const eventId = response.event_id;\n\n this.runtime.emitEvent(MatrixEventTypes.MESSAGE_SENT, {\n roomId: resolvedRoomId,\n eventId,\n content: text,\n runtime: this.runtime,\n accountId: state.accountId,\n } as EventPayload);\n\n return {\n success: true,\n eventId,\n roomId: resolvedRoomId,\n };\n }\n\n async sendReaction(\n roomId: string,\n eventId: string,\n emoji: string,\n accountId?: string\n ): Promise<MatrixSendResult> {\n const state = this.getState(accountId);\n if (!state.connected || !state.syncing) {\n throw new MatrixNotConnectedError();\n }\n const normalizedRoomId = roomId.trim();\n const normalizedEventId = eventId.trim();\n const normalizedEmoji = emoji.trim();\n if (!normalizedRoomId || !normalizedEventId || !normalizedEmoji) {\n return { success: false, error: \"Room ID, event ID, and emoji are required\" };\n }\n\n const content = {\n \"m.relates_to\": {\n rel_type: sdk.RelationType.Annotation as const,\n event_id: normalizedEventId,\n key: normalizedEmoji,\n },\n };\n\n const response = await state.client.sendEvent(\n normalizedRoomId,\n sdk.EventType.Reaction,\n content\n );\n\n return {\n success: true,\n eventId: response.event_id,\n roomId: normalizedRoomId,\n };\n }\n\n async joinRoom(roomIdOrAlias: string, accountId?: string): Promise<string> {\n const state = this.getState(accountId);\n if (!state.connected || !state.syncing) {\n throw new MatrixNotConnectedError();\n }\n const normalizedRoomIdOrAlias = roomIdOrAlias.trim();\n if (!normalizedRoomIdOrAlias) {\n throw new Error(\"Matrix room ID or alias is required\");\n }\n\n const response = await state.client.joinRoom(normalizedRoomIdOrAlias);\n const roomId = response.roomId;\n\n logger.info(`Joined room ${roomId}`);\n this.runtime.emitEvent(MatrixEventTypes.ROOM_JOINED, {\n room: { roomId },\n runtime: this.runtime,\n accountId: state.accountId,\n } as EventPayload);\n\n return roomId;\n }\n\n async leaveRoom(roomId: string, accountId?: string): Promise<void> {\n const state = this.getState(accountId);\n if (!state.connected || !state.syncing) {\n throw new MatrixNotConnectedError();\n }\n const normalizedRoomId = roomId.trim();\n if (!normalizedRoomId) {\n throw new Error(\"Matrix room ID is required\");\n }\n\n await state.client.leave(normalizedRoomId);\n logger.info(`Left room ${normalizedRoomId}`);\n this.runtime.emitEvent(MatrixEventTypes.ROOM_LEFT, {\n roomId: normalizedRoomId,\n runtime: this.runtime,\n accountId: state.accountId,\n } as EventPayload);\n }\n\n async sendTyping(\n roomId: string,\n typing: boolean,\n timeout: number = 30000,\n accountId?: string\n ): Promise<void> {\n const state = this.getState(accountId);\n if (!state.connected || !state.syncing) {\n return;\n }\n\n await state.client.sendTyping(roomId, typing, timeout);\n }\n\n async sendReadReceipt(roomId: string, eventId: string, accountId?: string): Promise<void> {\n const state = this.getState(accountId);\n if (!state.connected || !state.syncing) {\n return;\n }\n\n await state.client.sendReadReceipt(new sdk.MatrixEvent({ event_id: eventId, room_id: roomId }));\n }\n\n async sendRoomMessage(roomIdOrAlias: string, content: Content): Promise<void> {\n const text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n if (!text) {\n return;\n }\n await this.sendMessage(text, {\n accountId: readMatrixAccountId(content) ?? this.getAccountId(),\n roomId: roomIdOrAlias,\n });\n }\n\n async sendDirectMessage(roomIdOrAlias: string, content: Content): Promise<void> {\n await this.sendRoomMessage(roomIdOrAlias, content);\n }\n\n private async handleSendMessage(\n runtime: IAgentRuntime,\n target: TargetInfo,\n content: Content\n ): Promise<void> {\n const requestedAccountId = normalizeMatrixAccountId(\n target.accountId ?? readMatrixAccountId(content, target) ?? this.getAccountId()\n );\n this.getState(requestedAccountId);\n\n const text = typeof content.text === \"string\" ? content.text.trim() : \"\";\n if (!text) {\n return;\n }\n\n const room = target.roomId ? await runtime.getRoom(target.roomId) : null;\n const roomIdOrAlias = String(\n target.channelId ||\n room?.channelId ||\n (typeof target.roomId === \"string\" &&\n (isValidMatrixRoomId(target.roomId) || isValidMatrixRoomAlias(target.roomId))\n ? target.roomId\n : \"\")\n ).trim();\n\n if (!roomIdOrAlias) {\n throw new Error(\"Matrix target is missing a room ID or alias\");\n }\n\n await this.sendMessage(text, {\n accountId: requestedAccountId,\n roomId: roomIdOrAlias,\n ...extractMatrixSendOptions(content, target),\n });\n }\n\n private getState(accountId = this.defaultAccountId): MatrixAccountState {\n const normalized = normalizeMatrixAccountId(accountId);\n const states = this.states ?? new Map<string, MatrixAccountState>();\n const state = states.get(normalized);\n if (state) {\n return state;\n }\n\n const legacy = this as {\n settings?: MatrixSettings;\n client?: sdk.MatrixClient;\n connected?: boolean;\n syncing?: boolean;\n };\n if (legacy.settings) {\n return {\n accountId: normalizeMatrixAccountId(legacy.settings.accountId ?? normalized),\n settings: legacy.settings,\n client: legacy.client ?? ({} as sdk.MatrixClient),\n connected: legacy.connected ?? true,\n syncing: legacy.syncing ?? true,\n };\n }\n\n throw new Error(`Matrix account '${normalized}' is not available in this service instance`);\n }\n}\n",
|
|
49
|
+
"/**\n * Type definitions for the Matrix plugin.\n */\n\nimport type { IAgentRuntime, Service } from \"@elizaos/core\";\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Maximum message length for Matrix */\nexport const MAX_MATRIX_MESSAGE_LENGTH = 4000;\n\n/** Service name constant */\nexport const MATRIX_SERVICE_NAME = \"matrix\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/** Event types emitted by the Matrix plugin */\nexport enum MatrixEventTypes {\n MESSAGE_RECEIVED = \"MATRIX_MESSAGE_RECEIVED\",\n MESSAGE_SENT = \"MATRIX_MESSAGE_SENT\",\n ROOM_JOINED = \"MATRIX_ROOM_JOINED\",\n ROOM_LEFT = \"MATRIX_ROOM_LEFT\",\n INVITE_RECEIVED = \"MATRIX_INVITE_RECEIVED\",\n REACTION_RECEIVED = \"MATRIX_REACTION_RECEIVED\",\n TYPING_RECEIVED = \"MATRIX_TYPING_RECEIVED\",\n SYNC_COMPLETE = \"MATRIX_SYNC_COMPLETE\",\n CONNECTION_READY = \"MATRIX_CONNECTION_READY\",\n CONNECTION_LOST = \"MATRIX_CONNECTION_LOST\",\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/** Configuration settings for the Matrix plugin */\nexport interface MatrixSettings {\n /** Connector account identifier for this Matrix bot instance */\n accountId?: string;\n /** Matrix homeserver URL */\n homeserver: string;\n /** Matrix user ID (@user:homeserver) */\n userId: string;\n /** Access token for authentication */\n accessToken: string;\n /**\n * Account password — only used to satisfy user-interactive auth when\n * self-cross-signing on homeservers that require it for the device-signing-key\n * upload (i.e. no MSC3967). Absent ⇒ cross-signing is attempted token-only and\n * skipped if the server demands a password.\n */\n password?: string;\n /** Device ID for this session */\n deviceId?: string;\n /** Rooms to auto-join */\n rooms: string[];\n /** Whether to auto-accept invites */\n autoJoin: boolean;\n /** Enable end-to-end encryption */\n encryption: boolean;\n /** Require mention to respond in rooms */\n requireMention: boolean;\n /**\n * Matrix user IDs allowed to verify this device via SAS (emoji) verification.\n * When one of them starts a verification from their own client, the bot auto-\n * accepts and auto-confirms, so their client then shares megolm room keys to\n * this now-trusted device. Fail-closed: empty ⇒ no verification is accepted.\n */\n verifyAllowlist: string[];\n /**\n * Whether this account is the HUMAN owner's personal account (acting as the\n * user) rather than the agent's own identity. A personal account is exposed as\n * an OWNER connector behind the owner_binding access gate (acting as the user\n * requires a verified binding); the default account — the agent's own Matrix\n * identity — is an AGENT connector with the open gate (acting as the bot is\n * frictionless).\n */\n personal: boolean;\n /** Whether this configuration is enabled */\n enabled: boolean;\n}\n\n// ============================================================================\n// Message Types\n// ============================================================================\n\n/** Information about a Matrix user */\nexport interface MatrixUserInfo {\n /** Matrix user ID (@user:homeserver) */\n userId: string;\n /** Display name */\n displayName?: string;\n /** Avatar URL */\n avatarUrl?: string;\n}\n\n/** Represents a Matrix room */\nexport interface MatrixRoom {\n /** Room ID (!room:homeserver) */\n roomId: string;\n /** Room name */\n name?: string;\n /** Room topic */\n topic?: string;\n /** Room alias (#alias:homeserver) */\n canonicalAlias?: string;\n /** Whether room is encrypted */\n isEncrypted: boolean;\n /** Whether this is a direct message room */\n isDirect: boolean;\n /** Member count */\n memberCount: number;\n}\n\n/** Represents a Matrix message */\nexport interface MatrixMessage {\n /** Event ID */\n eventId: string;\n /** Room ID */\n roomId: string;\n /** Sender user ID */\n sender: string;\n /** Sender info */\n senderInfo: MatrixUserInfo;\n /** Message content */\n content: string;\n /** Message type (m.text, m.image, etc.) */\n msgType: string;\n /** Formatted body (HTML) */\n formattedBody?: string;\n /** Timestamp */\n timestamp: number;\n /** Thread root event ID */\n threadId?: string;\n /** Reply-to event ID */\n replyTo?: string;\n /** Whether this is an edit */\n isEdit: boolean;\n /** Original event ID if this is an edit */\n replacesEventId?: string;\n}\n\n/** Options for sending a message */\nexport interface MatrixMessageSendOptions {\n /** Connector account identifier */\n accountId?: string;\n /** Room ID or alias to send to */\n roomId?: string;\n /** Event ID to reply to */\n replyTo?: string;\n /** Thread root event ID */\n threadId?: string;\n /** Format as HTML */\n formatted?: boolean;\n /** Media URL to attach */\n mediaUrl?: string;\n}\n\n/** Result from sending a message */\nexport interface MatrixSendResult {\n /** Whether the send succeeded */\n success: boolean;\n /** Event ID of the sent message */\n eventId?: string;\n /** Room ID */\n roomId?: string;\n /** Error message if failed */\n error?: string;\n}\n\n// ============================================================================\n// Service Interface\n// ============================================================================\n\n/** Interface for the Matrix service */\nexport interface IMatrixService extends Service {\n /** Check if the service is connected */\n isConnected(): boolean;\n\n /** Get the user ID */\n getUserId(): string;\n\n /** Get the homeserver URL */\n getHomeserver(): string;\n\n /** Get joined rooms */\n getJoinedRooms(): Promise<MatrixRoom[]>;\n\n /** Send a message */\n sendMessage(text: string, options?: MatrixMessageSendOptions): Promise<MatrixSendResult>;\n\n /** Send a reaction */\n sendReaction(roomId: string, eventId: string, emoji: string): Promise<MatrixSendResult>;\n\n /** Join a room */\n joinRoom(roomIdOrAlias: string): Promise<string>;\n\n /** Leave a room */\n leaveRoom(roomId: string): Promise<void>;\n\n /** Send typing indicator */\n sendTyping(roomId: string, typing: boolean, timeout?: number): Promise<void>;\n\n /** Send read receipt */\n sendReadReceipt(roomId: string, eventId: string): Promise<void>;\n}\n\n// ============================================================================\n// Event Payloads\n// ============================================================================\n\n/** Payload for MESSAGE_RECEIVED event */\nexport interface MatrixMessageReceivedPayload {\n message: MatrixMessage;\n room: MatrixRoom;\n runtime: IAgentRuntime;\n}\n\n/** Payload for MESSAGE_SENT event */\nexport interface MatrixMessageSentPayload {\n roomId: string;\n eventId: string;\n content: string;\n}\n\n/** Payload for ROOM_JOINED event */\nexport interface MatrixRoomJoinedPayload {\n room: MatrixRoom;\n}\n\n/** Payload for INVITE_RECEIVED event */\nexport interface MatrixInviteReceivedPayload {\n roomId: string;\n inviter: string;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a string is a valid Matrix user ID.\n */\nexport function isValidMatrixUserId(userId: string): boolean {\n return /^@[^:]+:.+$/.test(userId);\n}\n\n/**\n * Check if a string is a valid Matrix room ID.\n */\nexport function isValidMatrixRoomId(roomId: string): boolean {\n return /^![^:]+:.+$/.test(roomId);\n}\n\n/**\n * Check if a string is a valid Matrix room alias.\n */\nexport function isValidMatrixRoomAlias(alias: string): boolean {\n return /^#[^:]+:.+$/.test(alias);\n}\n\n/**\n * Extract the localpart from a Matrix ID.\n */\nexport function getMatrixLocalpart(matrixId: string): string {\n const match = matrixId.match(/^[@#!]([^:]+):/);\n return match ? match[1] : matrixId;\n}\n\n/**\n * Extract the server part from a Matrix ID.\n */\nexport function getMatrixServerpart(matrixId: string): string {\n const match = matrixId.match(/:(.+)$/);\n return match ? match[1] : \"\";\n}\n\n/**\n * Get the best display name for a Matrix user.\n */\nexport function getMatrixUserDisplayName(user: MatrixUserInfo): string {\n return user.displayName || getMatrixLocalpart(user.userId);\n}\n\n/**\n * Convert a media URL to an HTTP URL via homeserver.\n */\nexport function matrixMxcToHttp(mxcUrl: string, homeserver: string): string | undefined {\n if (!mxcUrl.startsWith(\"mxc://\")) {\n return undefined;\n }\n const [serverName, mediaId] = mxcUrl.slice(6).split(\"/\");\n if (!serverName || !mediaId) {\n return undefined;\n }\n const base = homeserver.replace(/\\/$/, \"\");\n return `${base}/_matrix/media/v3/download/${serverName}/${mediaId}`;\n}\n\n// ============================================================================\n// Custom Errors\n// ============================================================================\n\n/** Base error class for Matrix plugin errors */\nexport class MatrixPluginError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MatrixPluginError\";\n }\n}\n\n/** Error when the Matrix service is not initialized */\nexport class MatrixServiceNotInitializedError extends MatrixPluginError {\n constructor(message: string = \"Matrix service is not initialized\") {\n super(message);\n this.name = \"MatrixServiceNotInitializedError\";\n }\n}\n\n/** Error when the Matrix client is not connected */\nexport class MatrixNotConnectedError extends MatrixPluginError {\n constructor(message: string = \"Matrix client is not connected\") {\n super(message);\n this.name = \"MatrixNotConnectedError\";\n }\n}\n\n/** Error when there is a configuration problem */\nexport class MatrixConfigurationError extends MatrixPluginError {\n settingName?: string;\n\n constructor(message: string, settingName?: string) {\n super(message);\n this.name = \"MatrixConfigurationError\";\n this.settingName = settingName;\n }\n}\n\n/** Error when an API call fails */\nexport class MatrixApiError extends MatrixPluginError {\n errcode?: string;\n\n constructor(message: string, errcode?: string) {\n super(message);\n this.name = \"MatrixApiError\";\n this.errcode = errcode;\n }\n}\n",
|
|
50
|
+
"/**\n * Matrix ConnectorAccountManager provider.\n *\n * Adapts the multi-account resolution helpers in `accounts.ts` to the\n * `ConnectorAccountProvider` contract from\n * `@elizaos/core/connectors/account-manager`.\n *\n * Source of truth for accounts is character settings (`character.settings.matrix`)\n * + MATRIX_ACCOUNTS JSON env var + single-account env vars (MATRIX_HOMESERVER,\n * MATRIX_USER_ID, MATRIX_ACCESS_TOKEN). AccountKey is `<homeserver>/<userId>`\n * by convention. Role is derived from the account's `personal` flag: the agent's\n * own Matrix identity is an `AGENT` account behind the `open` gate (acting as the\n * bot is frictionless), while an account flagged `personal: true` — the human\n * owner's account the agent acts THROUGH — is an `OWNER` account behind the\n * `owner_binding` gate (acting as the user requires a verified binding). A Matrix\n * access token authenticates a user either way; what differs is whose identity it\n * is. E2EE keys are scoped per account by the matrix client and are NOT shared.\n */\n\nimport type {\n ConnectorAccount,\n ConnectorAccountManager,\n ConnectorAccountPatch,\n ConnectorAccountProvider,\n IAgentRuntime,\n} from \"@elizaos/core\";\nimport {\n DEFAULT_MATRIX_ACCOUNT_ID,\n listMatrixAccountIds,\n normalizeMatrixAccountId,\n resolveMatrixAccountSettings,\n} from \"./accounts.js\";\nimport type { MatrixSettings } from \"./types.js\";\n\nexport const MATRIX_PROVIDER_ID = \"matrix\";\n\nfunction accountKey(settings: MatrixSettings): string {\n // Convention: <homeserver>/<userId>; falls back to the configured accountId.\n if (settings.homeserver && settings.userId) {\n return `${settings.homeserver}/${settings.userId}`;\n }\n return normalizeMatrixAccountId(settings.accountId);\n}\n\nfunction toConnectorAccount(settings: MatrixSettings): ConnectorAccount {\n const now = Date.now();\n const configured = Boolean(settings.homeserver && settings.userId && settings.accessToken);\n // The agent's own identity (default) is an open AGENT account; the human\n // owner's personal account is an OWNER account gated on a verified binding so\n // \"act as the user\" can't fire until the user has proven the account is theirs.\n const personal = settings.personal === true;\n return {\n id: normalizeMatrixAccountId(settings.accountId),\n provider: MATRIX_PROVIDER_ID,\n label: settings.userId || settings.accountId,\n role: personal ? \"OWNER\" : \"AGENT\",\n purpose: personal ? [\"messaging\", \"reading\"] : [\"messaging\"],\n accessGate: personal ? \"owner_binding\" : \"open\",\n status: settings.enabled !== false && configured ? \"connected\" : \"disabled\",\n externalId: accountKey(settings),\n displayHandle: settings.userId || undefined,\n createdAt: now,\n updatedAt: now,\n metadata: {\n homeserver: settings.homeserver ?? \"\",\n userId: settings.userId ?? \"\",\n deviceId: settings.deviceId ?? \"\",\n encryption: settings.encryption ?? false,\n autoJoin: settings.autoJoin ?? false,\n personal,\n },\n };\n}\n\nexport function createMatrixConnectorAccountProvider(\n runtime: IAgentRuntime\n): ConnectorAccountProvider {\n return {\n provider: MATRIX_PROVIDER_ID,\n label: \"Matrix\",\n listAccounts: async (_manager: ConnectorAccountManager): Promise<ConnectorAccount[]> => {\n const ids = listMatrixAccountIds(runtime);\n if (ids.length === 0) {\n return [\n toConnectorAccount(resolveMatrixAccountSettings(runtime, DEFAULT_MATRIX_ACCOUNT_ID)),\n ];\n }\n return ids.map((id) => toConnectorAccount(resolveMatrixAccountSettings(runtime, id)));\n },\n createAccount: async (input: ConnectorAccountPatch, _manager: ConnectorAccountManager) => {\n return {\n ...input,\n provider: MATRIX_PROVIDER_ID,\n role: input.role ?? \"AGENT\",\n purpose: input.purpose ?? [\"messaging\"],\n accessGate: input.accessGate ?? \"open\",\n status: input.status ?? \"pending\",\n };\n },\n patchAccount: async (\n _accountId: string,\n patch: ConnectorAccountPatch,\n _manager: ConnectorAccountManager\n ) => {\n return { ...patch, provider: MATRIX_PROVIDER_ID };\n },\n deleteAccount: async (_accountId: string, _manager: ConnectorAccountManager) => {\n // Provider-layer deletion returns cleanly; runtime credentials live in character\n // settings; deletion of those is out of band.\n },\n };\n}\n",
|
|
51
|
+
"import { type IAgentRuntime, Service } from \"@elizaos/core\";\n\n// Inlined to avoid adding @elizaos/plugin-workflow as a compile-time dependency.\n// The runtime duck-types the service — only the serviceType string and resolve() shape matter.\nconst WORKFLOW_CREDENTIAL_PROVIDER_TYPE = \"workflow_credential_provider\";\ntype CredentialProviderResult =\n | { status: \"credential_data\"; data: Record<string, unknown> }\n | { status: \"needs_auth\"; authUrl: string }\n | null;\n\nconst SUPPORTED = [\"matrixApi\"];\n\nexport class MatrixWorkflowCredentialProvider extends Service {\n static override readonly serviceType = WORKFLOW_CREDENTIAL_PROVIDER_TYPE;\n override capabilityDescription = \"Supplies Matrix credentials to the workflow plugin.\";\n\n static async start(runtime: IAgentRuntime): Promise<MatrixWorkflowCredentialProvider> {\n return new MatrixWorkflowCredentialProvider(runtime);\n }\n\n async stop(): Promise<void> {}\n\n async resolve(_userId: string, credType: string): Promise<CredentialProviderResult> {\n if (credType !== \"matrixApi\") return null;\n const accessToken = this.runtime.getSetting(\"MATRIX_ACCESS_TOKEN\") as string | undefined;\n const homeserver = this.runtime.getSetting(\"MATRIX_HOMESERVER\") as string | undefined;\n if (!accessToken?.trim() || !homeserver?.trim()) return null;\n return {\n status: \"credential_data\",\n data: { accessToken: accessToken.trim(), homeserverUrl: homeserver.trim() },\n };\n }\n\n checkCredentialTypes(credTypes: string[]): { supported: string[]; unsupported: string[] } {\n return {\n supported: credTypes.filter((t) => SUPPORTED.includes(t)),\n unsupported: credTypes.filter((t) => !SUPPORTED.includes(t)),\n };\n }\n}\n"
|
|
52
|
+
],
|
|
53
|
+
"mappings": "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",
|
|
54
|
+
"debugId": "FBDBF44969C9B46A64756E2164756E21",
|
|
55
|
+
"names": []
|
|
56
|
+
}
|