velocious 1.0.601 → 1.0.602

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.
Files changed (55) hide show
  1. package/README.md +3 -3
  2. package/build/database/live-query.js +4 -1
  3. package/build/database/operation.js +9 -0
  4. package/build/database/record/index.js +50 -2
  5. package/build/database/record-changes.js +18 -4
  6. package/build/src/database/live-query.d.ts +5 -0
  7. package/build/src/database/live-query.d.ts.map +1 -1
  8. package/build/src/database/live-query.js +4 -2
  9. package/build/src/database/operation.d.ts +5 -0
  10. package/build/src/database/operation.d.ts.map +1 -1
  11. package/build/src/database/operation.js +9 -1
  12. package/build/src/database/record/index.d.ts +36 -0
  13. package/build/src/database/record/index.d.ts.map +1 -1
  14. package/build/src/database/record/index.js +43 -3
  15. package/build/src/database/record-changes.d.ts +9 -1
  16. package/build/src/database/record-changes.d.ts.map +1 -1
  17. package/build/src/database/record-changes.js +18 -5
  18. package/build/src/sync/local-mutation-log.d.ts +7 -0
  19. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  20. package/build/src/sync/local-mutation-log.js +17 -1
  21. package/build/src/sync/sync-api-client-types.d.ts +8 -4
  22. package/build/src/sync/sync-api-client-types.d.ts.map +1 -1
  23. package/build/src/sync/sync-api-client-types.js +3 -3
  24. package/build/src/sync/sync-client-types.d.ts +25 -0
  25. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  26. package/build/src/sync/sync-client-types.js +6 -1
  27. package/build/src/sync/sync-client.d.ts +43 -1
  28. package/build/src/sync/sync-client.d.ts.map +1 -1
  29. package/build/src/sync/sync-client.js +187 -37
  30. package/build/src/sync/sync-realtime-bridge.js +2 -2
  31. package/build/src/sync/sync-scope-store.d.ts +15 -1
  32. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  33. package/build/src/sync/sync-scope-store.js +31 -4
  34. package/build/src/tenants/tenant-handle.d.ts +81 -0
  35. package/build/src/tenants/tenant-handle.d.ts.map +1 -1
  36. package/build/src/tenants/tenant-handle.js +143 -1
  37. package/build/sync/local-mutation-log.js +17 -0
  38. package/build/sync/sync-api-client-types.js +2 -2
  39. package/build/sync/sync-client-types.js +5 -0
  40. package/build/sync/sync-client.js +198 -38
  41. package/build/sync/sync-realtime-bridge.js +1 -1
  42. package/build/sync/sync-scope-store.js +32 -3
  43. package/build/tenants/tenant-handle.js +165 -0
  44. package/package.json +1 -1
  45. package/src/database/live-query.js +4 -1
  46. package/src/database/operation.js +9 -0
  47. package/src/database/record/index.js +50 -2
  48. package/src/database/record-changes.js +18 -4
  49. package/src/sync/local-mutation-log.js +17 -0
  50. package/src/sync/sync-api-client-types.js +2 -2
  51. package/src/sync/sync-client-types.js +5 -0
  52. package/src/sync/sync-client.js +198 -38
  53. package/src/sync/sync-realtime-bridge.js +1 -1
  54. package/src/sync/sync-scope-store.js +32 -3
  55. package/src/tenants/tenant-handle.js +165 -0
package/README.md CHANGED
@@ -15,8 +15,8 @@
15
15
  * Controllers and views for HTTP endpoints
16
16
  * Frontend-model transport for creating, updating, querying, and subscribing to query-filtered lifecycle events over HTTP/WebSocket, with structured per-attribute validation error responses and one-budget WebSocket startup controls (see [docs/frontend-models.md](docs/frontend-models.md) and [docs/websocket-channels.md](docs/websocket-channels.md))
17
17
  * Client-side offline sync mutation logs and frontend-model optimistic queueing primitives (see the [shared-resource sync developer guide](docs/shared-resource-sync-guide.md) and [offline sync architecture](docs/offline-sync.md))
18
- * Declarative client sync scopes with per-scope cursors, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery whose per-recipient authorization hook receives the complete persisted sync envelope, and `sync`/`pull` progress reporting for "X of Y" import screens (see [docs/sync-client.md](docs/sync-client.md) and [docs/offline-sync.md](docs/offline-sync.md))
19
- * Reactive `useLiveQuery(Model.where(...))` queries that stay current from committed local model changes across local writes, pulls, and realtime (see [docs/live-queries.md](docs/live-queries.md))
18
+ * Declarative client sync scopes with per-scope cursors, automatic mutation tracking, opt-in durable base-version conflict replay, realtime delivery, and immutable-handle project clients whose queues, scopes, cursors, receipts, conflicts, pulls, and reconnect catch-up stay in one physical tenant database (see [docs/sync-client.md](docs/sync-client.md) and [docs/offline-sync.md](docs/offline-sync.md))
19
+ * Reactive `useLiveQuery(Model.where(...))` queries for default databases plus immutable-handle tenant live-query sources whose committed events and refreshes stay on the captured physical tenant (see [docs/live-queries.md](docs/live-queries.md))
20
20
  * Server-side sync envelope replay orchestration for app-owned sync receivers, including allowlisted authoritative values for conflict resolution (see [docs/sync-envelope-replay-service.md](docs/sync-envelope-replay-service.md))
21
21
  * Self-sustaining sync feeds: upstream imports triggered by the changes pull itself, with framework-owned coalescing and throttling (see [docs/sync-upstream-imports.md](docs/sync-upstream-imports.md))
22
22
  * AwesomeTasks-shaped offline sync proof using routed resources, domain commands, signed offline grants, and peer-forwarded mutations (see the [developer guide](docs/shared-resource-sync-guide.md) and [proof](docs/awesome-tasks-offline-sync-proof.md))
@@ -2687,7 +2687,7 @@ Tenant lifecycle commands print start and final counts, report each completed te
2687
2687
 
2688
2688
  `afterMigrateTenant` hooks run inside the active default and tenant database connection scope for the tenant being migrated.
2689
2689
 
2690
- At runtime, the apartment-style `Tenant` façade (`velocious/build/src/tenants/tenant.js`) is the single entry point: `Tenant.with(tenant, callback)` / `Tenant.current()` to switch into and read a Node async context, `Tenant.handle(tenant)` to deeply capture immutable application and physical database identity for overlapping browser/native work, `Tenant.each({identifier, callback, parallel?, filter?})` to run a callback within every provider-listed tenant, and `Tenant.drop({identifier, tenant})` (plus the `db:tenants:drop` CLI command) to drop a tenant's database through the provider's `dropDatabase` hook. SQLite handles additionally expose framework-owned `open`, `flush`, `close`, `delete`, `inspect`, and `withPin` lifecycle methods; `frontendTenantSqlite.maxOpenHandles` bounds resident identities and clean, idle, unpinned handles are evicted least-recently-used. `Tenant.handle(...).databaseOperation(...)` and `.transaction(...)` use bounded pool-owned checkouts and pin model/query/write/association/preload/audit/attachment/raw work to the captured database even if a later UI project switch changes ambient tenant state. `Model.usingTenant(tenant)` uses the same safe core and adds eager helpers plus general `databaseOperation`/`transaction` model callbacks; eager records preserve legacy ambient Node follow-up semantics, while browser/native follow-up database work belongs inside the callback APIs. Inactive identifiers, mixed physical tenants, unsupported/cyclic descriptors, and expired operations fail closed. `Tenant.with` and `Tenant.each` retain their connection-establishing and model-initializing ambient behavior for Node request/job flows. `Tenant.aggregateAcross({identifier, aggregates, keyColumns, subquery, tenants?, filter?})` runs one aggregate over the same table across many tenant databases and returns the merged result — grouping tenants by server and using a single cross-database `UNION ALL` where the driver supports two-part `` `database`.`table` `` references (MySQL/MariaDB) or one query per tenant otherwise (PostgreSQL/SQLite/MSSQL).
2690
+ At runtime, the apartment-style `Tenant` façade (`velocious/build/src/tenants/tenant.js`) is the single entry point: `Tenant.with(tenant, callback)` / `Tenant.current()` to switch into and read a Node async context, `Tenant.handle(tenant)` to deeply capture immutable application and physical database identity for overlapping browser/native work, `Tenant.each({identifier, callback, parallel?, filter?})` to run a callback within every provider-listed tenant, and `Tenant.drop({identifier, tenant})` (plus the `db:tenants:drop` CLI command) to drop a tenant's database through the provider's `dropDatabase` hook. SQLite handles additionally expose framework-owned `open`, `flush`, `close`, `delete`, `inspect`, and `withPin` lifecycle methods; `frontendTenantSqlite.maxOpenHandles` bounds resident identities and clean, idle, unpinned handles are evicted least-recently-used. `Tenant.handle(...).databaseOperation(...)` and `.transaction(...)` use bounded pool-owned checkouts and pin model/query/write/association/preload/audit/attachment/raw work to the captured database even if a later UI project switch changes ambient tenant state. The handle also builds tenant-bound live-query sources, exposes an opaque physical identity for filtered record-change subscriptions, and binds project `SyncClient` instances. `Model.usingTenant(tenant)` uses the same safe core and adds eager helpers plus general `databaseOperation`/`transaction` model callbacks; eager records preserve legacy ambient Node follow-up semantics, while browser/native follow-up database work belongs inside the callback APIs. Inactive identifiers, mixed physical tenants, unsupported/cyclic descriptors, expired operations, unscoped tenant event subscriptions, and stale/cross-tenant sync state fail closed. `Tenant.with` and `Tenant.each` retain their connection-establishing and model-initializing ambient behavior for Node request/job flows. `Tenant.aggregateAcross({identifier, aggregates, keyColumns, subquery, tenants?, filter?})` runs one aggregate over the same table across many tenant databases and returns the merged result — grouping tenants by server and using a single cross-database `UNION ALL` where the driver supports two-part `` `database`.`table` `` references (MySQL/MariaDB) or one query per tenant otherwise (PostgreSQL/SQLite/MSSQL).
2691
2691
 
2692
2692
  `SchemaCloner` adds a missing auto-increment column and its separate source unique index in one schema alteration, including on MySQL/MariaDB where an auto-increment column must be keyed when it is created.
2693
2693
 
@@ -16,6 +16,7 @@ import restArgsError from "../utils/rest-args-error.js"
16
16
  * @template T
17
17
  * @typedef {object} LiveQuerySource
18
18
  * @property {() => RecordModelClass} getModelClass - Root model class the query reads.
19
+ * @property {(modelClass: RecordModelClass) => string} [databaseIdentityForModel] - Captured physical identity for an observed model.
19
20
  * @property {() => Promise<T[]>} toArray - Runs the query and resolves the current rows.
20
21
  */
21
22
 
@@ -117,7 +118,9 @@ class LiveQuery {
117
118
  this._started = true
118
119
 
119
120
  for (const modelClass of this._modelClasses) {
120
- this._unsubscribes.push(recordChanges.subscribe(modelClass, this._onRecordChange))
121
+ const databaseIdentity = this._query.databaseIdentityForModel?.(modelClass)
122
+
123
+ this._unsubscribes.push(recordChanges.subscribe(modelClass, this._onRecordChange, {databaseIdentity}))
121
124
  }
122
125
 
123
126
  this._run()
@@ -127,6 +127,7 @@ export default class VelociousDatabaseOperation {
127
127
  this.assertActive()
128
128
  this.assertModel(record.getModelClass())
129
129
  record.bindDatabaseOperation(this)
130
+ record.captureDatabaseIdentity(this.databaseIdentity())
130
131
 
131
132
  return record
132
133
  }
@@ -203,6 +204,14 @@ export default class VelociousDatabaseOperation {
203
204
  return `${this._databaseIdentifier}:${this._configurationReuseKey}`
204
205
  }
205
206
 
207
+ /**
208
+ * Returns the tenant schema generation captured when this operation started.
209
+ * @returns {string | undefined} - Captured schema generation.
210
+ */
211
+ schemaGeneration() {
212
+ return this._schemaGeneration
213
+ }
214
+
206
215
  /**
207
216
  * Initializes a model through this operation's captured connection.
208
217
  * @param {typeof import("./record/index.js").default} ModelClass - Model class.
@@ -3618,6 +3618,29 @@ class VelociousDatabaseRecord {
3618
3618
  return this
3619
3619
  }
3620
3620
 
3621
+ /**
3622
+ * Captures and validates the physical database identity that owns this record.
3623
+ * @param {string} databaseIdentity - Opaque operation/connection identity.
3624
+ * @returns {this} This record.
3625
+ */
3626
+ captureDatabaseIdentity(databaseIdentity) {
3627
+ if (this._databaseIdentity && this._databaseIdentity !== databaseIdentity) {
3628
+ throw new Error("Record belongs to a different physical tenant database")
3629
+ }
3630
+
3631
+ this._databaseIdentity = databaseIdentity
3632
+
3633
+ return this
3634
+ }
3635
+
3636
+ /**
3637
+ * Returns the captured physical database identity.
3638
+ * @returns {string | undefined} Captured physical database identity.
3639
+ */
3640
+ databaseIdentity() {
3641
+ return this._databaseIdentity
3642
+ }
3643
+
3621
3644
  /**
3622
3645
  * Releases this record from a completed eager-helper operation while
3623
3646
  * preserving the legacy ambient follow-up behavior of `usingTenant` finders.
@@ -3742,7 +3765,27 @@ class VelociousDatabaseRecord {
3742
3765
  if (this._databaseOperation) return this._databaseOperation.connection()
3743
3766
  if (this.__connection) return this.__connection
3744
3767
 
3745
- return this.getModelClass().connection()
3768
+ const connection = this.getModelClass().connection()
3769
+
3770
+ if (this._databaseIdentity) this.captureDatabaseIdentity(this._databaseIdentityForConnection(connection))
3771
+
3772
+ return connection
3773
+ }
3774
+
3775
+ /**
3776
+ * Resolves the identity of an already selected concrete connection.
3777
+ * @param {import("../drivers/base.js").default} connection - Concrete connection.
3778
+ * @returns {string} Physical database identity.
3779
+ */
3780
+ _databaseIdentityForConnection(connection) {
3781
+ const modelClass = this.getModelClass()
3782
+ const databaseIdentifier = modelClass.getDatabaseIdentifier()
3783
+ const reuseKey = modelClass
3784
+ ._getConfiguration()
3785
+ .getDatabasePool(databaseIdentifier)
3786
+ .getConnectionConfigurationReuseKey(connection)
3787
+
3788
+ return `${databaseIdentifier}:${reuseKey}`
3746
3789
  }
3747
3790
 
3748
3791
  /**
@@ -3993,9 +4036,14 @@ class VelociousDatabaseRecord {
3993
4036
  if (!recordChanges.hasListeners(modelClass)) return
3994
4037
 
3995
4038
  const record = this
4039
+ const databaseIdentity = this._databaseOperation
4040
+ ? this._databaseOperation.databaseIdentity()
4041
+ : this._databaseIdentityForConnection(this._connection())
4042
+
4043
+ this.captureDatabaseIdentity(databaseIdentity)
3996
4044
 
3997
4045
  await this._connection().afterCommit(() => {
3998
- recordChanges.emit({modelClass, operation, record})
4046
+ recordChanges.emit({databaseIdentity, modelClass, operation, record})
3999
4047
  })
4000
4048
  }
4001
4049
 
@@ -14,6 +14,7 @@ import EventEmitter from "../utils/event-emitter.js"
14
14
  * RecordChangeEvent type.
15
15
  * @typedef {object} RecordChangeEvent
16
16
  * @property {RecordModelClass} modelClass - Model class whose row changed.
17
+ * @property {string} databaseIdentity - Opaque physical database identity where the commit occurred.
17
18
  * @property {RecordChangeOperation} operation - The committed operation.
18
19
  * @property {InstanceType<RecordModelClass>} record - The committed record instance.
19
20
  */
@@ -49,15 +50,25 @@ class RecordChanges {
49
50
  * Subscribes a listener to committed changes of a model class.
50
51
  * @param {RecordModelClass} modelClass - Model class to observe.
51
52
  * @param {RecordChangeListener} listener - Listener called with each change event.
53
+ * @param {{databaseIdentity?: string}} [options] - Captured physical identity filter.
52
54
  * @returns {() => void} Unsubscribe callback.
53
55
  */
54
- subscribe(modelClass, listener) {
56
+ subscribe(modelClass, listener, {databaseIdentity} = {}) {
57
+ if (modelClass.hasTenantDatabaseIdentifierResolver() && !databaseIdentity) {
58
+ throw new Error(`Tenant-scoped record-change subscriptions for ${modelClass.getModelName()} require a captured databaseIdentity`)
59
+ }
60
+
55
61
  const eventName = modelClass.getModelName()
62
+ const subscribedListener = databaseIdentity
63
+ ? (/** @type {RecordChangeEvent} */ event) => {
64
+ if (event.databaseIdentity === databaseIdentity) listener(event)
65
+ }
66
+ : listener
56
67
 
57
- this._emitter.on(eventName, listener)
68
+ this._emitter.on(eventName, subscribedListener)
58
69
 
59
70
  return () => {
60
- this._emitter.off(eventName, listener)
71
+ this._emitter.off(eventName, subscribedListener)
61
72
  }
62
73
  }
63
74
 
@@ -81,7 +92,10 @@ class RecordChanges {
81
92
  */
82
93
  emit(event) {
83
94
  if (this._batchDepth > 0) {
84
- this._bufferedEvents.set(event.modelClass.getModelName(), event)
95
+ const modelName = event.modelClass.getModelName()
96
+ const eventKey = `${modelName.length}:${modelName}:${event.databaseIdentity}`
97
+
98
+ this._bufferedEvents.set(eventKey, event)
85
99
 
86
100
  return
87
101
  }
@@ -4,6 +4,10 @@ export type LiveQuerySource<T> = {
4
4
  * - Root model class the query reads.
5
5
  */
6
6
  getModelClass: () => RecordModelClass;
7
+ /**
8
+ * - Captured physical identity for an observed model.
9
+ */
10
+ databaseIdentityForModel?: (modelClass: RecordModelClass) => string;
7
11
  /**
8
12
  * - Runs the query and resolves the current rows.
9
13
  */
@@ -33,6 +37,7 @@ export type LiveQueryState<T> = {
33
37
  * @template T
34
38
  * @typedef {object} LiveQuerySource
35
39
  * @property {() => RecordModelClass} getModelClass - Root model class the query reads.
40
+ * @property {(modelClass: RecordModelClass) => string} [databaseIdentityForModel] - Captured physical identity for an observed model.
36
41
  * @property {() => Promise<T[]>} toArray - Runs the query and resolves the current rows.
37
42
  */
38
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"live-query.d.ts","sourceRoot":"","sources":["../../../src/database/live-query.js"],"names":[],"mappings":"AASG,YAAsD,gBAAgB,GAA5D,cAAc,mBAAmB,EAAE,OAAO,CAAkB;AAOtE,YAAkB,eAAe,CADvB,CAAC,IAEX;;;;IAAmC,aAAa,EAArC,MAAM,gBAAgB,CACjC;;;;IAA+B,OAAO,EAA3B,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAC/B;CAAA,CAAA;AAKE,YAAkB,cAAc,CADtB,CAAC,IAEX;;;;IAAgB,OAAO,EAAZ,CAAC,EAAE,CACd;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAAyB,KAAK,EAAnB,KAAK,GAAG,IAAI,CACzB;CAAA,CAAA;AArBD;;4EAE4E;AAE5E;;;;;;;;GAQG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,cAAM,SAAS,CAFF,CAAC;IAiBV,iCAAiC;IAC5B,MAAM,EADA,eAAe,CAAC,CAAC,CAAC;IAG7B,iCAAiC;IAC5B,aAAa,EADP,gBAAgB,EAAE;IAG7B,gCAAgC;IAC3B,MAAM,EADA,cAAc,CAAC,CAAC,CAAC;IAG5B;;iCAE6B;IACxB,UAAU,EADL,GAAG,CAAC,MAAM,IAAI,CAAC;IAGzB;;mCAE+B;IAC1B,aAAa,EADR,KAAK,CAAC,MAAM,IAAI,CAAC;IAG3B,qBAAqB;IAChB,UAAU,EADJ,MAAM;IAGjB,sBAAsB;IACjB,OAAO,EADD,OAAO;IAGlB,sBAAsB;IACjB,QAAQ,EADF,OAAO;IAGlB,sBAAsB;IACjB,aAAa,EADP,OAAO;IAGlB;;sCAEkC;IAC7B,eAAe,EADV,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG9B;;qDAEiD;IAC5C,YAAY,EADP,CAAC,MAAM,IAAI,CAAC,GAAG;QAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAC;IAK7C;;4BAEwB;IACnB,eAAe,EADV,MAAM,IAAI;IA3DtB;;;;;;OAMG;IACH,YAAY,EAAC,KAAK,EAAE,GAAG,QAAQ,EAAC,EAJ7B;QAAiC,KAAK,EAA9B,eAAe,CAAC,CAAC,CAAC,CAC1B;QAAkC,MAAM,AAAxC,CACA,EADQ,gBAAgB,EAAE,CAC1B;QAAsB,QAAQ,AAA9B,CACF,EADU,MAAM,CAChB;KAC+B,EAwD/B;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAYhB;IAED;;;;OAIG;IACH,QAAQ,IAFK,cAAc,CAAC,CAAC,CAAC,CAI7B;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAHP,MAAM,IAGC,GAFL,MAAM,IAAI,CAQtB;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAehB;IAED;;;;OAIG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;OAIG;IACH,qBAAqB,IAFR,IAAI,CAYhB;IAED;;;;;OAKG;IACH,IAAI,IAFS,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAHJ,cAAc,CAAC,CAAC,CAGZ,GAFF,IAAI,CAQhB;CACF;eAEc,SAAS"}
1
+ {"version":3,"file":"live-query.d.ts","sourceRoot":"","sources":["../../../src/database/live-query.js"],"names":[],"mappings":"AASG,YAAsD,gBAAgB,GAA5D,cAAc,mBAAmB,EAAE,OAAO,CAAkB;AAOtE,YAAkB,eAAe,CADvB,CAAC,IAEX;;;;IAAmC,aAAa,EAArC,MAAM,gBAAgB,CACjC;;;;IAAsD,wBAAwB,AAA9E,CACA,EADW,CAAC,UAAU,EAAE,gBAAgB,KAAK,MAAM,CACnD;;;;IAA+B,OAAO,EAA3B,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAC/B;CAAA,CAAA;AAKE,YAAkB,cAAc,CADtB,CAAC,IAEX;;;;IAAgB,OAAO,EAAZ,CAAC,EAAE,CACd;;;;IAAoB,OAAO,EAAhB,OAAO,CAClB;;;;IAAyB,KAAK,EAAnB,KAAK,GAAG,IAAI,CACzB;CAAA,CAAA;AAtBD;;4EAE4E;AAE5E;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;;;GAYG;AACH,cAAM,SAAS,CAFF,CAAC;IAiBV,iCAAiC;IAC5B,MAAM,EADA,eAAe,CAAC,CAAC,CAAC;IAG7B,iCAAiC;IAC5B,aAAa,EADP,gBAAgB,EAAE;IAG7B,gCAAgC;IAC3B,MAAM,EADA,cAAc,CAAC,CAAC,CAAC;IAG5B;;iCAE6B;IACxB,UAAU,EADL,GAAG,CAAC,MAAM,IAAI,CAAC;IAGzB;;mCAE+B;IAC1B,aAAa,EADR,KAAK,CAAC,MAAM,IAAI,CAAC;IAG3B,qBAAqB;IAChB,UAAU,EADJ,MAAM;IAGjB,sBAAsB;IACjB,OAAO,EADD,OAAO;IAGlB,sBAAsB;IACjB,QAAQ,EADF,OAAO;IAGlB,sBAAsB;IACjB,aAAa,EADP,OAAO;IAGlB;;sCAEkC;IAC7B,eAAe,EADV,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAG9B;;qDAEiD;IAC5C,YAAY,EADP,CAAC,MAAM,IAAI,CAAC,GAAG;QAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAA;KAAC;IAK7C;;4BAEwB;IACnB,eAAe,EADV,MAAM,IAAI;IA3DtB;;;;;;OAMG;IACH,YAAY,EAAC,KAAK,EAAE,GAAG,QAAQ,EAAC,EAJ7B;QAAiC,KAAK,EAA9B,eAAe,CAAC,CAAC,CAAC,CAC1B;QAAkC,MAAM,AAAxC,CACA,EADQ,gBAAgB,EAAE,CAC1B;QAAsB,QAAQ,AAA9B,CACF,EADU,MAAM,CAChB;KAC+B,EAwD/B;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAchB;IAED;;;;OAIG;IACH,QAAQ,IAFK,cAAc,CAAC,CAAC,CAAC,CAI7B;IAED;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAHP,MAAM,IAGC,GAFL,MAAM,IAAI,CAQtB;IAED;;;OAGG;IACH,KAAK,IAFQ,IAAI,CAehB;IAED;;;;OAIG;IACG,WAAW,IAFJ,OAAO,CAAC,IAAI,CAAC,CAWzB;IAED;;;;OAIG;IACH,qBAAqB,IAFR,IAAI,CAYhB;IAED;;;;;OAKG;IACH,IAAI,IAFS,OAAO,CAAC,IAAI,CAAC,CAwBzB;IAED;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAHJ,cAAc,CAAC,CAAC,CAGZ,GAFF,IAAI,CAQhB;CACF;eAEc,SAAS"}
@@ -12,6 +12,7 @@ import restArgsError from "../utils/rest-args-error.js";
12
12
  * @template T
13
13
  * @typedef {object} LiveQuerySource
14
14
  * @property {() => RecordModelClass} getModelClass - Root model class the query reads.
15
+ * @property {(modelClass: RecordModelClass) => string} [databaseIdentityForModel] - Captured physical identity for an observed model.
15
16
  * @property {() => Promise<T[]>} toArray - Runs the query and resolves the current rows.
16
17
  */
17
18
  /**
@@ -97,7 +98,8 @@ class LiveQuery {
97
98
  return;
98
99
  this._started = true;
99
100
  for (const modelClass of this._modelClasses) {
100
- this._unsubscribes.push(recordChanges.subscribe(modelClass, this._onRecordChange));
101
+ const databaseIdentity = this._query.databaseIdentityForModel?.(modelClass);
102
+ this._unsubscribes.push(recordChanges.subscribe(modelClass, this._onRecordChange, { databaseIdentity }));
101
103
  }
102
104
  this._run();
103
105
  }
@@ -208,4 +210,4 @@ class LiveQuery {
208
210
  }
209
211
  }
210
212
  export default LiveQuery;
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9saXZlLXF1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUV2QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7NEVBRTRFO0FBRTVFOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sU0FBUztJQUNiOzs7Ozs7T0FNRztJQUNILFlBQVksRUFBQyxLQUFLLEVBQUUsR0FBRyxRQUFRLEVBQUM7UUFDOUIsTUFBTSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxXQUFXLEVBQUMsR0FBRyxRQUFRLENBQUE7UUFFbkQsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTFCLElBQUksQ0FBQyxLQUFLO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO1FBRTFELGlDQUFpQztRQUNqQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUVuQixpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQTtRQUV0RCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFDLENBQUE7UUFFdkQ7O3FDQUU2QjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFFM0I7O3VDQUUrQjtRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQTtRQUV2QixxQkFBcUI7UUFD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Q0FBQTtZQUNyRyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVKLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFBO1FBQ3JDLEtBQUssY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLGNBQWM7Z0JBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFDMUUsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLGNBQWMsQ0FBQTtJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFNBQVMsQ0FBQyxLQUFLO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFFbkIsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ25ELFFBQVEsRUFBRSxDQUFBO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRjtBQUVELGVBQWUsU0FBUyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBkZWJvdW5jZUZ1bmN0aW9uIGZyb20gXCJkZWJvdW5jZVwiXG5cbmltcG9ydCByZWNvcmRDaGFuZ2VzIGZyb20gXCIuL3JlY29yZC1jaGFuZ2VzLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuXG4vKipcbiAqIFJlY29yZE1vZGVsQ2xhc3MgdHlwZS5cbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gUmVjb3JkTW9kZWxDbGFzcyAqL1xuXG4vKipcbiAqIFRoZSBtaW5pbWFsIHF1ZXJ5IGNvbnRyYWN0IGEgbGl2ZSBxdWVyeSBuZWVkczogYSByb290IG1vZGVsIGNsYXNzIHRvIG9ic2VydmVcbiAqIGZvciBjb21taXR0ZWQgY2hhbmdlcyBhbmQgYSB3YXkgdG8gcnVuIHRoZSBxdWVyeSBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHJvd3MuXG4gKiBgTW9kZWwud2hlcmUoey4uLn0pYCAoYSBtb2RlbC1jbGFzcyBxdWVyeSkgc2F0aXNmaWVzIHRoaXMgZGlyZWN0bHkuXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTGl2ZVF1ZXJ5U291cmNlXG4gKiBAcHJvcGVydHkgeygpID0+IFJlY29yZE1vZGVsQ2xhc3N9IGdldE1vZGVsQ2xhc3MgLSBSb290IG1vZGVsIGNsYXNzIHRoZSBxdWVyeSByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxUW10+fSB0b0FycmF5IC0gUnVucyB0aGUgcXVlcnkgYW5kIHJlc29sdmVzIHRoZSBjdXJyZW50IHJvd3MuXG4gKi9cblxuLyoqXG4gKiBMaXZlUXVlcnlTdGF0ZSB0eXBlLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpdmVRdWVyeVN0YXRlXG4gKiBAcHJvcGVydHkge1RbXX0gcmVzdWx0cyAtIEN1cnJlbnQgcXVlcnkgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9hZGluZyAtIFdoZXRoZXIgdGhlIGluaXRpYWwgcmVzdWx0cyBhcmUgc3RpbGwgbG9hZGluZy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3IgfCBudWxsfSBlcnJvciAtIFRoZSBsYXN0IHJ1biBlcnJvciwgb3IgbnVsbCB3aGVuIHRoZSBsYXN0IHJ1biBzdWNjZWVkZWQuXG4gKi9cblxuLyoqXG4gKiBBIHJlYWN0aXZlIHF1ZXJ5IGNvbnRyb2xsZXI6IGZldGNoZXMgb25jZSwgc3Vic2NyaWJlcyB0byBjb21taXR0ZWQgY2hhbmdlcyBvZlxuICogaXRzIG1vZGVsIGNsYXNzKGVzKSwgYW5kIHJlLXJ1bnMgd2hlbmV2ZXIgYSB3YXRjaGVkIG1vZGVsIGNoYW5nZXMuIFJlLXJ1bnMgYXJlXG4gKiBjb2FsZXNjZWQgKG1pY3JvdGFzayBieSBkZWZhdWx0LCBvciBhIHRyYWlsaW5nIGRlYm91bmNlKSBhbmQgcHJvdGVjdGVkIGFnYWluc3RcbiAqIHN0YWxlIHJlc3BvbnNlcyBieSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyByZXF1ZXN0IGlkLCBzbyBhbiBpbi1mbGlnaHQgcnVuXG4gKiBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgY2hhbmdlIG5ldmVyIG92ZXJ3cml0ZXMgZnJlc2hlciByZXN1bHRzLiBGcmFtZXdvcmstbGV2ZWxcbiAqIGFuZCBSZWFjdC1mcmVlIHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhbmQgd3JhcHBlZCBieSBgdXNlTGl2ZVF1ZXJ5YC5cbiAqXG4gKiBDb3N0IG1vZGVsOiBpbnZhbGlkYXRpb24gaXMgYnkgbW9kZWwgY2xhc3MuIEEgY2hhbmdlIHRvIG1vZGVsIE0gc2NoZWR1bGVzIG9uZVxuICogcmUtcnVuIG9mIGV2ZXJ5IGxpdmUgcXVlcnkgb2JzZXJ2aW5nIE0gKG5vIHBlci1jb25kaXRpb24gbWF0Y2hpbmcpOyBhIGJhdGNoIG9mXG4gKiBjaGFuZ2VzIGNvYWxlc2NlcyBpbnRvIGEgc2luZ2xlIHJlLXJ1bi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBsaXZlIHF1ZXJ5IGNvbnRyb2xsZXIgZm9yIGEgcXVlcnkgc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U291cmNlPFQ+fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgc291cmNlIHByb3ZpZGluZyBtb2RlbCBjbGFzcyBhbmQgYHRvQXJyYXlgLlxuICAgKiBAcGFyYW0ge1JlY29yZE1vZGVsQ2xhc3NbXX0gW2FyZ3MubW9kZWxzXSAtIE1vZGVsIGNsYXNzZXMgdG8gb2JzZXJ2ZS4gRGVmYXVsdHMgdG8gYFtxdWVyeS5nZXRNb2RlbENsYXNzKCldYDsgcGFzcyB0aGlzIHRvIGFsc28gcmVhY3QgdG8gam9pbmVkIG1vZGVscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlYm91bmNlXSAtIFRyYWlsaW5nIGRlYm91bmNlIGluIG1zIGZvciByZS1ydW5zLiBEZWZhdWx0cyB0byBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtxdWVyeSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgY29uc3Qge2RlYm91bmNlLCBtb2RlbHMsIC4uLnVua25vd25BcmdzfSA9IHJlc3RBcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHVua25vd25BcmdzKVxuXG4gICAgaWYgKCFxdWVyeSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcXVlcnkgZ2l2ZW4gdG8gTGl2ZVF1ZXJ5XCIpXG5cbiAgICAvKiogQHR5cGUge0xpdmVRdWVyeVNvdXJjZTxUPn0gKi9cbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5XG5cbiAgICAvKiogQHR5cGUge1JlY29yZE1vZGVsQ2xhc3NbXX0gKi9cbiAgICB0aGlzLl9tb2RlbENsYXNzZXMgPSBtb2RlbHMgPz8gW3F1ZXJ5LmdldE1vZGVsQ2xhc3MoKV1cblxuICAgIC8qKiBAdHlwZSB7TGl2ZVF1ZXJ5U3RhdGU8VD59ICovXG4gICAgdGhpcy5fc3RhdGUgPSB7ZXJyb3I6IG51bGwsIGxvYWRpbmc6IHRydWUsIHJlc3VsdHM6IFtdfVxuXG4gICAgLyoqXG4gICAgICogU3RhdGUtY2hhbmdlIGxpc3RlbmVycyBub3RpZmllZCBhZnRlciBldmVyeSBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgICAqIEB0eXBlIHtTZXQ8KCkgPT4gdm9pZD59ICovXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQtY2hhbmdlIHVuc3Vic2NyaWJlIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIGBzdGFydGAuXG4gICAgICogQHR5cGUge0FycmF5PCgpID0+IHZvaWQ+fSAqL1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSAwXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSBmb3IgdGhlIGN1cnJlbnRseSBpbi1mbGlnaHQgcnVuLCBvciBudWxsIHdoZW4gaWRsZS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYSBjb2FsZXNjZWQgcmUtcnVuOiBhIHRyYWlsaW5nIGRlYm91bmNlIHdoZW4gY29uZmlndXJlZCwgZWxzZSBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICAgKiBAdHlwZSB7KCgpID0+IHZvaWQpICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gICAgdGhpcy5fc2NoZWR1bGVSdW4gPSB0eXBlb2YgZGVib3VuY2UgPT09IFwibnVtYmVyXCJcbiAgICAgID8gZGVib3VuY2VGdW5jdGlvbigoKSA9PiB0aGlzLl9ydW4oKSwgZGVib3VuY2UpXG4gICAgICA6ICgpID0+IHRoaXMuX3NjaGVkdWxlTWljcm90YXNrUnVuKClcblxuICAgIC8qKlxuICAgICAqIFJlY29yZC1jaGFuZ2UgbGlzdGVuZXIgc2NoZWR1bGluZyBhIHJlLXJ1biB3aGlsZSB0aGUgY29udHJvbGxlciBpcyBvcGVuLlxuICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfSAqL1xuICAgIHRoaXMuX29uUmVjb3JkQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jbG9zZWQpIHRoaXMuX3NjaGVkdWxlUnVuKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZWNvcmQgY2hhbmdlcyBhbmQgcnVucyB0aGUgaW5pdGlhbCBxdWVyeS4gSWRlbXBvdGVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkIHx8IHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiB0aGlzLl9tb2RlbENsYXNzZXMpIHtcbiAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlcy5wdXNoKHJlY29yZENoYW5nZXMuc3Vic2NyaWJlKG1vZGVsQ2xhc3MsIHRoaXMuX29uUmVjb3JkQ2hhbmdlKSlcbiAgICB9XG5cbiAgICB0aGlzLl9ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSByZWZlcmVuY2Ugb25seSBjaGFuZ2VzIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMsXG4gICAqIHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgUmVhY3QgZXh0ZXJuYWwtc3RvcmUgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdGF0ZTxUPn0gQ3VycmVudCBsaXZlLXF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGxpc3RlbmVyIG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIFN0YXRlLWNoYW5nZSBsaXN0ZW5lci5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSByZWNvcmQgY2hhbmdlcywgZHJvcHMgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgZnVydGhlciBydW5zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVyblxuXG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCB1bnN1YnNjcmliZSBvZiB0aGlzLl91bnN1YnNjcmliZXMpIHtcbiAgICAgIHVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICB0aGlzLl91bnN1YnNjcmliZXMgPSBbXVxuICAgIHRoaXMuX2xpc3RlbmVycy5jbGVhcigpXG5cbiAgICBpZiAodGhpcy5fc2NoZWR1bGVSdW4uY2xlYXIpIHRoaXMuX3NjaGVkdWxlUnVuLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYW55IHNjaGVkdWxlZCBvciBpbi1mbGlnaHQgcnVuIHNvIGNhbGxlcnMgKHRlc3RzKSBjYW4gb2JzZXJ2ZSBzZXR0bGVkXG4gICAqIHJlc3VsdHMuIEJvdW5kZWQgc28gYSBjb250aW51b3VzIGNoYW5nZSBzdHJlYW0gY2Fubm90IGxvb3AgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3aGVuU2V0dGxlZCgpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDEwMDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm5cbiAgICAgIGlmICghdGhpcy5fcnVuU2NoZWR1bGVkICYmICF0aGlzLl9ydW5uaW5nUHJvbWlzZSkgcmV0dXJuXG5cbiAgICAgIGlmICh0aGlzLl9ydW5uaW5nUHJvbWlzZSkgYXdhaXQgdGhpcy5fcnVubmluZ1Byb21pc2VcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIG1pY3JvdGFzay1jb2FsZXNjZWQgcmUtcnVuLCBjb2xsYXBzaW5nIGEgc3luY2hyb25vdXMgYnVyc3Qgb2ZcbiAgICogY2hhbmdlIGV2ZW50cyBpbnRvIGEgc2luZ2xlIHJ1bi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2NoZWR1bGVNaWNyb3Rhc2tSdW4oKSB7XG4gICAgaWYgKHRoaXMuX3J1blNjaGVkdWxlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSB0cnVlXG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoIXRoaXMuX2Nsb3NlZCkgdGhpcy5fcnVuKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHF1ZXJ5IGFuZCBhcHBsaWVzIGl0cyByZXN1bHRzIHVubGVzcyBhIG5ld2VyIHJ1biBzdXBlcnNlZGVkIGl0IG9yIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjbG9zZWQuIEEgcnVuIGVycm9yIHN1cmZhY2VzIGluIHN0YXRlICh3aXRoIHRoZSBwcmV2aW91c1xuICAgKiByZXN1bHRzIGtlcHQpIHJhdGhlciB0aGFuIHJlamVjdGluZyBhIGJhY2tncm91bmQgcHJvbWlzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfcnVuKCkge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5fcmVxdWVzdElkXG4gICAgY29uc3QgcnVubmluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuX3F1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgcmVxdWVzdElkICE9PSB0aGlzLl9yZXF1ZXN0SWQpIHJldHVyblxuXG4gICAgICAgIHRoaXMuX3NldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGluZzogZmFsc2UsIHJlc3VsdHN9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCByZXF1ZXN0SWQgIT09IHRoaXMuX3JlcXVlc3RJZCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoe2Vycm9yOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLCBsb2FkaW5nOiBmYWxzZSwgcmVzdWx0czogdGhpcy5fc3RhdGUucmVzdWx0c30pXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBydW5uaW5nUHJvbWlzZVxuICAgIHZvaWQgcnVubmluZ1Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcnVubmluZ1Byb21pc2UgPT09IHJ1bm5pbmdQcm9taXNlKSB0aGlzLl9ydW5uaW5nUHJvbWlzZSA9IG51bGxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJ1bm5pbmdQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHN0YXRlIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U3RhdGU8VD59IHN0YXRlIC0gTmV4dCBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlXG5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXIoKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXZlUXVlcnlcbiJdfQ==
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGl2ZS1xdWVyeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kYXRhYmFzZS9saXZlLXF1ZXJ5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUV2QyxPQUFPLGFBQWEsTUFBTSxxQkFBcUIsQ0FBQTtBQUMvQyxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUV2RDs7NEVBRTRFO0FBRTVFOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFNBQVM7SUFDYjs7Ozs7O09BTUc7SUFDSCxZQUFZLEVBQUMsS0FBSyxFQUFFLEdBQUcsUUFBUSxFQUFDO1FBQzlCLE1BQU0sRUFBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLEdBQUcsV0FBVyxFQUFDLEdBQUcsUUFBUSxDQUFBO1FBRW5ELGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUUxQixJQUFJLENBQUMsS0FBSztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtRQUUxRCxpQ0FBaUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUE7UUFFbkIsaUNBQWlDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7UUFFdEQsZ0NBQWdDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBQyxDQUFBO1FBRXZEOztxQ0FFNkI7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTNCOzt1Q0FFK0I7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFFdkIscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFBO1FBRW5CLHNCQUFzQjtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtRQUVwQixzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7UUFFckIsc0JBQXNCO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1FBRTFCOzswQ0FFa0M7UUFDbEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7UUFFM0I7O3lEQUVpRDtRQUNqRCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sUUFBUSxLQUFLLFFBQVE7WUFDOUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLENBQUM7WUFDL0MsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1FBRXRDOztnQ0FFd0I7UUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQTtRQUN4QyxDQUFDLENBQUE7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUTtZQUFFLE9BQU07UUFFekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7UUFFcEIsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUMsVUFBVSxDQUFDLENBQUE7WUFFM0UsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3hHLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDYixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDcEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxTQUFTLENBQUMsUUFBUTtRQUNoQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUU3QixPQUFPLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ2xDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBQ0gsSUFBSSxJQUFJLENBQUMsT0FBTztZQUFFLE9BQU07UUFFeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUE7UUFFbkIsS0FBSyxNQUFNLFdBQVcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsV0FBVyxFQUFFLENBQUE7UUFDZixDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUV2QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUE7SUFDeEQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsV0FBVztRQUNmLEtBQUssSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMvQyxJQUFJLElBQUksQ0FBQyxPQUFPO2dCQUFFLE9BQU07WUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZTtnQkFBRSxPQUFNO1lBRXhELElBQUksSUFBSSxDQUFDLGVBQWU7Z0JBQUUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFBO1lBRXBELE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzFFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHFCQUFxQjtRQUNuQixJQUFJLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTTtRQUU5QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQTtRQUV6QixjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFBO1lBRTFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7UUFDaEMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFJO1FBQ0YsTUFBTSxTQUFTLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFBO1FBQ25DLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDakMsSUFBSSxDQUFDO2dCQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtnQkFFM0MsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsVUFBVTtvQkFBRSxPQUFNO2dCQUV6RCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7WUFDeEQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFNBQVMsS0FBSyxJQUFJLENBQUMsVUFBVTtvQkFBRSxPQUFNO2dCQUV6RCxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUMsS0FBSyxFQUFFLG9CQUFvQixDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBQ3JHLENBQUM7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRUosSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUE7UUFDckMsS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUM1QixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssY0FBYztnQkFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQTtRQUMxRSxDQUFDLENBQUMsQ0FBQTtRQUVGLE9BQU8sY0FBYyxDQUFBO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtRQUVuQixLQUFLLE1BQU0sUUFBUSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDbkQsUUFBUSxFQUFFLENBQUE7UUFDWixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBRUQsZUFBZSxTQUFTLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IGRlYm91bmNlRnVuY3Rpb24gZnJvbSBcImRlYm91bmNlXCJcblxuaW1wb3J0IHJlY29yZENoYW5nZXMgZnJvbSBcIi4vcmVjb3JkLWNoYW5nZXMuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4uL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKlxuICogUmVjb3JkTW9kZWxDbGFzcyB0eXBlLlxuICogQHR5cGVkZWYge3R5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBSZWNvcmRNb2RlbENsYXNzICovXG5cbi8qKlxuICogVGhlIG1pbmltYWwgcXVlcnkgY29udHJhY3QgYSBsaXZlIHF1ZXJ5IG5lZWRzOiBhIHJvb3QgbW9kZWwgY2xhc3MgdG8gb2JzZXJ2ZVxuICogZm9yIGNvbW1pdHRlZCBjaGFuZ2VzIGFuZCBhIHdheSB0byBydW4gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgcm93cy5cbiAqIGBNb2RlbC53aGVyZSh7Li4ufSlgIChhIG1vZGVsLWNsYXNzIHF1ZXJ5KSBzYXRpc2ZpZXMgdGhpcyBkaXJlY3RseS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMaXZlUXVlcnlTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkTW9kZWxDbGFzc30gZ2V0TW9kZWxDbGFzcyAtIFJvb3QgbW9kZWwgY2xhc3MgdGhlIHF1ZXJ5IHJlYWRzLlxuICogQHByb3BlcnR5IHsobW9kZWxDbGFzczogUmVjb3JkTW9kZWxDbGFzcykgPT4gc3RyaW5nfSBbZGF0YWJhc2VJZGVudGl0eUZvck1vZGVsXSAtIENhcHR1cmVkIHBoeXNpY2FsIGlkZW50aXR5IGZvciBhbiBvYnNlcnZlZCBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxUW10+fSB0b0FycmF5IC0gUnVucyB0aGUgcXVlcnkgYW5kIHJlc29sdmVzIHRoZSBjdXJyZW50IHJvd3MuXG4gKi9cblxuLyoqXG4gKiBMaXZlUXVlcnlTdGF0ZSB0eXBlLlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExpdmVRdWVyeVN0YXRlXG4gKiBAcHJvcGVydHkge1RbXX0gcmVzdWx0cyAtIEN1cnJlbnQgcXVlcnkgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbG9hZGluZyAtIFdoZXRoZXIgdGhlIGluaXRpYWwgcmVzdWx0cyBhcmUgc3RpbGwgbG9hZGluZy5cbiAqIEBwcm9wZXJ0eSB7RXJyb3IgfCBudWxsfSBlcnJvciAtIFRoZSBsYXN0IHJ1biBlcnJvciwgb3IgbnVsbCB3aGVuIHRoZSBsYXN0IHJ1biBzdWNjZWVkZWQuXG4gKi9cblxuLyoqXG4gKiBBIHJlYWN0aXZlIHF1ZXJ5IGNvbnRyb2xsZXI6IGZldGNoZXMgb25jZSwgc3Vic2NyaWJlcyB0byBjb21taXR0ZWQgY2hhbmdlcyBvZlxuICogaXRzIG1vZGVsIGNsYXNzKGVzKSwgYW5kIHJlLXJ1bnMgd2hlbmV2ZXIgYSB3YXRjaGVkIG1vZGVsIGNoYW5nZXMuIFJlLXJ1bnMgYXJlXG4gKiBjb2FsZXNjZWQgKG1pY3JvdGFzayBieSBkZWZhdWx0LCBvciBhIHRyYWlsaW5nIGRlYm91bmNlKSBhbmQgcHJvdGVjdGVkIGFnYWluc3RcbiAqIHN0YWxlIHJlc3BvbnNlcyBieSBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyByZXF1ZXN0IGlkLCBzbyBhbiBpbi1mbGlnaHQgcnVuXG4gKiBzdXBlcnNlZGVkIGJ5IGEgbmV3ZXIgY2hhbmdlIG5ldmVyIG92ZXJ3cml0ZXMgZnJlc2hlciByZXN1bHRzLiBGcmFtZXdvcmstbGV2ZWxcbiAqIGFuZCBSZWFjdC1mcmVlIHNvIGl0IGNhbiBiZSB1bml0IHRlc3RlZCBhbmQgd3JhcHBlZCBieSBgdXNlTGl2ZVF1ZXJ5YC5cbiAqXG4gKiBDb3N0IG1vZGVsOiBpbnZhbGlkYXRpb24gaXMgYnkgbW9kZWwgY2xhc3MuIEEgY2hhbmdlIHRvIG1vZGVsIE0gc2NoZWR1bGVzIG9uZVxuICogcmUtcnVuIG9mIGV2ZXJ5IGxpdmUgcXVlcnkgb2JzZXJ2aW5nIE0gKG5vIHBlci1jb25kaXRpb24gbWF0Y2hpbmcpOyBhIGJhdGNoIG9mXG4gKiBjaGFuZ2VzIGNvYWxlc2NlcyBpbnRvIGEgc2luZ2xlIHJlLXJ1bi5cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cbmNsYXNzIExpdmVRdWVyeSB7XG4gIC8qKlxuICAgKiBCdWlsZHMgYSBsaXZlIHF1ZXJ5IGNvbnRyb2xsZXIgZm9yIGEgcXVlcnkgc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U291cmNlPFQ+fSBhcmdzLnF1ZXJ5IC0gUXVlcnkgc291cmNlIHByb3ZpZGluZyBtb2RlbCBjbGFzcyBhbmQgYHRvQXJyYXlgLlxuICAgKiBAcGFyYW0ge1JlY29yZE1vZGVsQ2xhc3NbXX0gW2FyZ3MubW9kZWxzXSAtIE1vZGVsIGNsYXNzZXMgdG8gb2JzZXJ2ZS4gRGVmYXVsdHMgdG8gYFtxdWVyeS5nZXRNb2RlbENsYXNzKCldYDsgcGFzcyB0aGlzIHRvIGFsc28gcmVhY3QgdG8gam9pbmVkIG1vZGVscy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlYm91bmNlXSAtIFRyYWlsaW5nIGRlYm91bmNlIGluIG1zIGZvciByZS1ydW5zLiBEZWZhdWx0cyB0byBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtxdWVyeSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgY29uc3Qge2RlYm91bmNlLCBtb2RlbHMsIC4uLnVua25vd25BcmdzfSA9IHJlc3RBcmdzXG5cbiAgICByZXN0QXJnc0Vycm9yKHVua25vd25BcmdzKVxuXG4gICAgaWYgKCFxdWVyeSkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcXVlcnkgZ2l2ZW4gdG8gTGl2ZVF1ZXJ5XCIpXG5cbiAgICAvKiogQHR5cGUge0xpdmVRdWVyeVNvdXJjZTxUPn0gKi9cbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5XG5cbiAgICAvKiogQHR5cGUge1JlY29yZE1vZGVsQ2xhc3NbXX0gKi9cbiAgICB0aGlzLl9tb2RlbENsYXNzZXMgPSBtb2RlbHMgPz8gW3F1ZXJ5LmdldE1vZGVsQ2xhc3MoKV1cblxuICAgIC8qKiBAdHlwZSB7TGl2ZVF1ZXJ5U3RhdGU8VD59ICovXG4gICAgdGhpcy5fc3RhdGUgPSB7ZXJyb3I6IG51bGwsIGxvYWRpbmc6IHRydWUsIHJlc3VsdHM6IFtdfVxuXG4gICAgLyoqXG4gICAgICogU3RhdGUtY2hhbmdlIGxpc3RlbmVycyBub3RpZmllZCBhZnRlciBldmVyeSBzdGF0ZSB0cmFuc2l0aW9uLlxuICAgICAqIEB0eXBlIHtTZXQ8KCkgPT4gdm9pZD59ICovXG4gICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IFNldCgpXG5cbiAgICAvKipcbiAgICAgKiBSZWNvcmQtY2hhbmdlIHVuc3Vic2NyaWJlIGNhbGxiYWNrcyByZWdpc3RlcmVkIG9uIGBzdGFydGAuXG4gICAgICogQHR5cGUge0FycmF5PCgpID0+IHZvaWQ+fSAqL1xuICAgIHRoaXMuX3Vuc3Vic2NyaWJlcyA9IFtdXG5cbiAgICAvKiogQHR5cGUge251bWJlcn0gKi9cbiAgICB0aGlzLl9yZXF1ZXN0SWQgPSAwXG5cbiAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgdGhpcy5fY2xvc2VkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2VcblxuICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgLyoqXG4gICAgICogUHJvbWlzZSBmb3IgdGhlIGN1cnJlbnRseSBpbi1mbGlnaHQgcnVuLCBvciBudWxsIHdoZW4gaWRsZS5cbiAgICAgKiBAdHlwZSB7UHJvbWlzZTx2b2lkPiB8IG51bGx9ICovXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBudWxsXG5cbiAgICAvKipcbiAgICAgKiBTY2hlZHVsZXMgYSBjb2FsZXNjZWQgcmUtcnVuOiBhIHRyYWlsaW5nIGRlYm91bmNlIHdoZW4gY29uZmlndXJlZCwgZWxzZSBtaWNyb3Rhc2sgY29hbGVzY2luZy5cbiAgICAgKiBAdHlwZSB7KCgpID0+IHZvaWQpICYge2NsZWFyPzogKCkgPT4gdm9pZH19ICovXG4gICAgdGhpcy5fc2NoZWR1bGVSdW4gPSB0eXBlb2YgZGVib3VuY2UgPT09IFwibnVtYmVyXCJcbiAgICAgID8gZGVib3VuY2VGdW5jdGlvbigoKSA9PiB0aGlzLl9ydW4oKSwgZGVib3VuY2UpXG4gICAgICA6ICgpID0+IHRoaXMuX3NjaGVkdWxlTWljcm90YXNrUnVuKClcblxuICAgIC8qKlxuICAgICAqIFJlY29yZC1jaGFuZ2UgbGlzdGVuZXIgc2NoZWR1bGluZyBhIHJlLXJ1biB3aGlsZSB0aGUgY29udHJvbGxlciBpcyBvcGVuLlxuICAgICAqIEB0eXBlIHsoKSA9PiB2b2lkfSAqL1xuICAgIHRoaXMuX29uUmVjb3JkQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jbG9zZWQpIHRoaXMuX3NjaGVkdWxlUnVuKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyB0byByZWNvcmQgY2hhbmdlcyBhbmQgcnVucyB0aGUgaW5pdGlhbCBxdWVyeS4gSWRlbXBvdGVudC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGFydCgpIHtcbiAgICBpZiAodGhpcy5fY2xvc2VkIHx8IHRoaXMuX3N0YXJ0ZWQpIHJldHVyblxuXG4gICAgdGhpcy5fc3RhcnRlZCA9IHRydWVcblxuICAgIGZvciAoY29uc3QgbW9kZWxDbGFzcyBvZiB0aGlzLl9tb2RlbENsYXNzZXMpIHtcbiAgICAgIGNvbnN0IGRhdGFiYXNlSWRlbnRpdHkgPSB0aGlzLl9xdWVyeS5kYXRhYmFzZUlkZW50aXR5Rm9yTW9kZWw/Lihtb2RlbENsYXNzKVxuXG4gICAgICB0aGlzLl91bnN1YnNjcmliZXMucHVzaChyZWNvcmRDaGFuZ2VzLnN1YnNjcmliZShtb2RlbENsYXNzLCB0aGlzLl9vblJlY29yZENoYW5nZSwge2RhdGFiYXNlSWRlbnRpdHl9KSlcbiAgICB9XG5cbiAgICB0aGlzLl9ydW4oKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUuIFRoZSByZWZlcmVuY2Ugb25seSBjaGFuZ2VzIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMsXG4gICAqIHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgUmVhY3QgZXh0ZXJuYWwtc3RvcmUgc25hcHNob3QuXG4gICAqIEByZXR1cm5zIHtMaXZlUXVlcnlTdGF0ZTxUPn0gQ3VycmVudCBsaXZlLXF1ZXJ5IHN0YXRlLlxuICAgKi9cbiAgZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBhIGxpc3RlbmVyIG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkfSBsaXN0ZW5lciAtIFN0YXRlLWNoYW5nZSBsaXN0ZW5lci5cbiAgICogQHJldHVybnMgeygpID0+IHZvaWR9IFVuc3Vic2NyaWJlIGNhbGxiYWNrLlxuICAgKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgdGhpcy5fbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbmVyKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgZnJvbSByZWNvcmQgY2hhbmdlcywgZHJvcHMgbGlzdGVuZXJzLCBhbmQgcHJldmVudHMgZnVydGhlciBydW5zLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLl9jbG9zZWQpIHJldHVyblxuXG4gICAgdGhpcy5fY2xvc2VkID0gdHJ1ZVxuXG4gICAgZm9yIChjb25zdCB1bnN1YnNjcmliZSBvZiB0aGlzLl91bnN1YnNjcmliZXMpIHtcbiAgICAgIHVuc3Vic2NyaWJlKClcbiAgICB9XG5cbiAgICB0aGlzLl91bnN1YnNjcmliZXMgPSBbXVxuICAgIHRoaXMuX2xpc3RlbmVycy5jbGVhcigpXG5cbiAgICBpZiAodGhpcy5fc2NoZWR1bGVSdW4uY2xlYXIpIHRoaXMuX3NjaGVkdWxlUnVuLmNsZWFyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBBd2FpdHMgYW55IHNjaGVkdWxlZCBvciBpbi1mbGlnaHQgcnVuIHNvIGNhbGxlcnMgKHRlc3RzKSBjYW4gb2JzZXJ2ZSBzZXR0bGVkXG4gICAqIHJlc3VsdHMuIEJvdW5kZWQgc28gYSBjb250aW51b3VzIGNoYW5nZSBzdHJlYW0gY2Fubm90IGxvb3AgZm9yZXZlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3aGVuU2V0dGxlZCgpIHtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDEwMDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5fY2xvc2VkKSByZXR1cm5cbiAgICAgIGlmICghdGhpcy5fcnVuU2NoZWR1bGVkICYmICF0aGlzLl9ydW5uaW5nUHJvbWlzZSkgcmV0dXJuXG5cbiAgICAgIGlmICh0aGlzLl9ydW5uaW5nUHJvbWlzZSkgYXdhaXQgdGhpcy5fcnVubmluZ1Byb21pc2VcblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHF1ZXVlTWljcm90YXNrKCgpID0+IHJlc29sdmUodW5kZWZpbmVkKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjaGVkdWxlcyBhIG1pY3JvdGFzay1jb2FsZXNjZWQgcmUtcnVuLCBjb2xsYXBzaW5nIGEgc3luY2hyb25vdXMgYnVyc3Qgb2ZcbiAgICogY2hhbmdlIGV2ZW50cyBpbnRvIGEgc2luZ2xlIHJ1bi5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2NoZWR1bGVNaWNyb3Rhc2tSdW4oKSB7XG4gICAgaWYgKHRoaXMuX3J1blNjaGVkdWxlZCkgcmV0dXJuXG5cbiAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSB0cnVlXG5cbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB0aGlzLl9ydW5TY2hlZHVsZWQgPSBmYWxzZVxuXG4gICAgICBpZiAoIXRoaXMuX2Nsb3NlZCkgdGhpcy5fcnVuKClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHF1ZXJ5IGFuZCBhcHBsaWVzIGl0cyByZXN1bHRzIHVubGVzcyBhIG5ld2VyIHJ1biBzdXBlcnNlZGVkIGl0IG9yIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjbG9zZWQuIEEgcnVuIGVycm9yIHN1cmZhY2VzIGluIHN0YXRlICh3aXRoIHRoZSBwcmV2aW91c1xuICAgKiByZXN1bHRzIGtlcHQpIHJhdGhlciB0aGFuIHJlamVjdGluZyBhIGJhY2tncm91bmQgcHJvbWlzZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBfcnVuKCkge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9ICsrdGhpcy5fcmVxdWVzdElkXG4gICAgY29uc3QgcnVubmluZ1Byb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuX3F1ZXJ5LnRvQXJyYXkoKVxuXG4gICAgICAgIGlmICh0aGlzLl9jbG9zZWQgfHwgcmVxdWVzdElkICE9PSB0aGlzLl9yZXF1ZXN0SWQpIHJldHVyblxuXG4gICAgICAgIHRoaXMuX3NldFN0YXRlKHtlcnJvcjogbnVsbCwgbG9hZGluZzogZmFsc2UsIHJlc3VsdHN9KVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nsb3NlZCB8fCByZXF1ZXN0SWQgIT09IHRoaXMuX3JlcXVlc3RJZCkgcmV0dXJuXG5cbiAgICAgICAgdGhpcy5fc2V0U3RhdGUoe2Vycm9yOiAvKiogQHR5cGUge0Vycm9yfSAqLyAoZXJyb3IpLCBsb2FkaW5nOiBmYWxzZSwgcmVzdWx0czogdGhpcy5fc3RhdGUucmVzdWx0c30pXG4gICAgICB9XG4gICAgfSkoKVxuXG4gICAgdGhpcy5fcnVubmluZ1Byb21pc2UgPSBydW5uaW5nUHJvbWlzZVxuICAgIHZvaWQgcnVubmluZ1Byb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcnVubmluZ1Byb21pc2UgPT09IHJ1bm5pbmdQcm9taXNlKSB0aGlzLl9ydW5uaW5nUHJvbWlzZSA9IG51bGxcbiAgICB9KVxuXG4gICAgcmV0dXJuIHJ1bm5pbmdQcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgdGhlIHN0YXRlIGFuZCBub3RpZmllcyBsaXN0ZW5lcnMuXG4gICAqIEBwYXJhbSB7TGl2ZVF1ZXJ5U3RhdGU8VD59IHN0YXRlIC0gTmV4dCBzdGF0ZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBfc2V0U3RhdGUoc3RhdGUpIHtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlXG5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20odGhpcy5fbGlzdGVuZXJzKSkge1xuICAgICAgbGlzdGVuZXIoKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMaXZlUXVlcnlcbiJdfQ==
@@ -110,6 +110,11 @@ export default class VelociousDatabaseOperation {
110
110
  * @returns {string} - Physical database identity.
111
111
  */
112
112
  databaseIdentity(): string;
113
+ /**
114
+ * Returns the tenant schema generation captured when this operation started.
115
+ * @returns {string | undefined} - Captured schema generation.
116
+ */
117
+ schemaGeneration(): string | undefined;
113
118
  /**
114
119
  * Initializes a model through this operation's captured connection.
115
120
  * @param {typeof import("./record/index.js").default} ModelClass - Model class.
@@ -1 +1 @@
1
- {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/database/operation.js"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,2BAA2B,CAAA;AAE3D;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAetC,OAAO;IACP,cAAc;IACd,sBAAsB;IACtB,sBAAsB;IACtB,mBAAmB;IACnB,6BAA6B;IAC7B,mBAAmB;IACnB,iBAAiB;IACjB,OAAO;IACZ,8GAA8G;IACzG,kBAAkB,EADZ,OAAO,CAAC,cAAc,mBAAmB,EAAE,OAAO,EAAE,cAAc,mBAAmB,EAAE,OAAO,CAAC;IAErG,WAAW;IAzBlB;;;;;;;;;;;;OAYG;IACH,YAAY,EAAC,aAAa,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,UAAU,EAAE,kBAAkB,EAAE,4BAAmC,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAC,EAV5K;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAAuB,4BAA4B,AAAnD,CACA,EADQ,OAAO,CACf;QAA6E,qBAAqB,AAAlG,CACA,EADQ,OAAO,2BAA2B,EAAE,yBAAyB,CACrE;QAAqB,qBAAqB,EAAlC,MAAM,CACd;QAAkD,UAAU,EAApD,OAAO,mBAAmB,EAAE,OAAO,CAC3C;QAAqB,kBAAkB,EAA/B,MAAM,CACd;QAAqB,KAAK,EAAlB,MAAM,CACd;QAAsB,gBAAgB,AAAtC,CACA,EADQ,MAAM,CACd;QAAiC,MAAM,EAA/B,MAAM,GAAG,SAAS,CAC5B;KAC8K,EAiB9K;IAED;;;;;OAKG;IACH,QAAQ,CAJkD,EAAE,SAA9C,cAAc,mBAAmB,EAAE,OAAW,EAInD,UAAU,EAHR,EAGQ,GAFN,OAAO,8BAA8B,EAAE,OAAO,CAAC,EAAE,CAAC,CAU9D;IAED;;;;;;;OAOG;IACH,UAAU,CAJgD,EAAE,SAA9C,cAAc,mBAAmB,EAAE,OAAW,EAIjD,UAAU,EAHV,EAGU,GAFR,EAAE,CAqCd;IAED;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAHX,cAAc,mBAAmB,EAAE,OAGxB,GAFT,IAAI,CAYhB;IAED;;;;;OAKG;IACH,UAAU,CAJyC,KAAK,SAA1C,OAAO,mBAAmB,EAAE,OAAc,EAI7C,MAAM,EAHN,KAGM,GAFJ,KAAK,CAQjB;IAED;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAHf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAGV,GAFb,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;OAIG;IACG,YAAY,CAAC,QAAQ,EAHhB,CAAC,OAAO,EAAE;QAAC,SAAS,EAAE,0BAA0B,CAAA;KAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAGzD,GAFd,OAAO,CAAC,IAAI,CAAC,CAKzB;IAED;;;;;OAKG;IACG,WAAW,CAJJ,CAAC,EAII,QAAQ,EAHf,MAAM,OAAO,CAAC,CAAC,CAGA,GAFb,OAAO,CAAC,CAAC,CAAC,CAMtB;IAED;;;OAGG;IACH,UAAU,IAFG,OAAO,mBAAmB,EAAE,OAAO,CAY/C;IAED;;;OAGG;IACH,MAAM,IAFO,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAI/C;IAED;;;OAGG;IACH,kBAAkB,IAFL,MAAM,CAIlB;IAED;;;OAGG;IACH,gBAAgB,IAFH,MAAM,CAIlB;IAED;;;;OAIG;IACG,sBAAsB,CAAC,UAAU,EAH5B,cAAc,mBAAmB,EAAE,OAGP,GAF1B,OAAO,CAAC,IAAI,CAAC,CAczB;IAED;;;OAGG;IACH,YAAY,IAFC,IAAI,CAkBhB;IAED;;;OAGG;IACH,QAAQ,IAFK,IAAI,CAIhB;CACF"}
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/database/operation.js"],"names":[],"mappings":"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"}
@@ -116,6 +116,7 @@ export default class VelociousDatabaseOperation {
116
116
  this.assertActive();
117
117
  this.assertModel(record.getModelClass());
118
118
  record.bindDatabaseOperation(this);
119
+ record.captureDatabaseIdentity(this.databaseIdentity());
119
120
  return record;
120
121
  }
121
122
  /**
@@ -180,6 +181,13 @@ export default class VelociousDatabaseOperation {
180
181
  databaseIdentity() {
181
182
  return `${this._databaseIdentifier}:${this._configurationReuseKey}`;
182
183
  }
184
+ /**
185
+ * Returns the tenant schema generation captured when this operation started.
186
+ * @returns {string | undefined} - Captured schema generation.
187
+ */
188
+ schemaGeneration() {
189
+ return this._schemaGeneration;
190
+ }
183
191
  /**
184
192
  * Initializes a model through this operation's captured connection.
185
193
  * @param {typeof import("./record/index.js").default} ModelClass - Model class.
@@ -223,4 +231,4 @@ export default class VelociousDatabaseOperation {
223
231
  this._active = false;
224
232
  }
225
233
  }
226
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL29wZXJhdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUUzRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSw0QkFBNEIsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBQztRQUM3SyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcscUJBQXFCLElBQUksYUFBYSxDQUFDLDRCQUE0QixDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzdILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQTtRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUE7UUFDN0MsSUFBSSxDQUFDLDZCQUE2QixHQUFHLDRCQUE0QixDQUFBO1FBQ2pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUE7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFBO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ3JCLDhHQUE4RztRQUM5RyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksbUJBQW1CLENBQUM7WUFDekMsVUFBVTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSztT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QUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO0lBQ3RCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgT3BlcmF0aW9uQ29ubmVjdGlvbiBmcm9tIFwiLi9vcGVyYXRpb24tY29ubmVjdGlvbi5qc1wiXG5cbi8qKlxuICogRXhwbGljaXQgb3duZXIgZm9yIG1vZGVsIHdvcmsgcGVyZm9ybWVkIG9uIG9uZSBwaW5uZWQgdHJhbnNhY3Rpb25hbFxuICogY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVsb2Npb3VzRGF0YWJhc2VPcGVyYXRpb24ge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcGVyYXRpb24gb3duZXJzaGlwLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gT3duaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZW5mb3JjZUN1cnJlbnRUZW5hbnRSZXVzZUtleV0gLSBXaGV0aGVyIGFtYmllbnQgdGVuYW50IGNoYW5nZXMgaW52YWxpZGF0ZSB0aGlzIGxlZ2FjeSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5EYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfSBbYXJncy5kYXRhYmFzZUNvbmZpZ3VyYXRpb25dIC0gQ2FwdHVyZWQgcmVzb2x2ZWQgcGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY29uZmlndXJhdGlvblJldXNlS2V5IC0gUGh5c2ljYWwgZGF0YWJhc2UgY29uZmlndXJhdGlvbiBrZXkgY2FwdHVyZWQgYXQgY2hlY2tvdXQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gYXJncy5jb25uZWN0aW9uIC0gUGlubmVkIHBoeXNpY2FsIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmRhdGFiYXNlSWRlbnRpZmllciAtIFNpbmd1bGFyIGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBhcmdzLm93bmVyIC0gT3BhcXVlIHBvb2wgbGVhc2Ugb3duZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zY2hlbWFHZW5lcmF0aW9uXSAtIFRlbmFudCBzY2hlbWEgZ2VuZXJhdGlvbiBvd25pbmcgcmVjb3JkIG1ldGFkYXRhLlxuICAgKiBAcGFyYW0ge29iamVjdCB8IHVuZGVmaW5lZH0gYXJncy50ZW5hbnQgLSBUZW5hbnQgZGVzY3JpcHRvciBjYXB0dXJlZCBieSB0aGUgb3duaW5nIGhhbmRsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBkYXRhYmFzZUNvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb25SZXVzZUtleSwgY29ubmVjdGlvbiwgZGF0YWJhc2VJZGVudGlmaWVyLCBlbmZvcmNlQ3VycmVudFRlbmFudFJldXNlS2V5ID0gdHJ1ZSwgb3duZXIsIHNjaGVtYUdlbmVyYXRpb24sIHRlbmFudH0pIHtcbiAgICB0aGlzLl9hY3RpdmUgPSB0cnVlXG4gICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgICB0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb24gPSBkYXRhYmFzZUNvbmZpZ3VyYXRpb24gfHwgY29uZmlndXJhdGlvbi5yZXNvbHZlRGF0YWJhc2VDb25maWd1cmF0aW9uKGRhdGFiYXNlSWRlbnRpZmllciwgdGVuYW50KVxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25SZXVzZUtleSA9IGNvbmZpZ3VyYXRpb25SZXVzZUtleVxuICAgIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllciA9IGRhdGFiYXNlSWRlbnRpZmllclxuICAgIHRoaXMuX2VuZm9yY2VDdXJyZW50VGVuYW50UmV1c2VLZXkgPSBlbmZvcmNlQ3VycmVudFRlbmFudFJldXNlS2V5XG4gICAgdGhpcy5fcGh5c2ljYWxDb25uZWN0aW9uID0gY29ubmVjdGlvblxuICAgIHRoaXMuX3NjaGVtYUdlbmVyYXRpb24gPSBzY2hlbWFHZW5lcmF0aW9uXG4gICAgdGhpcy5fdGVuYW50ID0gdGVuYW50XG4gICAgLyoqIEB0eXBlIHtXZWFrTWFwPHR5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCB0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59ICovXG4gICAgdGhpcy5fYm91bmRNb2RlbENsYXNzZXMgPSBuZXcgV2Vha01hcCgpXG4gICAgdGhpcy5fY29ubmVjdGlvbiA9IG5ldyBPcGVyYXRpb25Db25uZWN0aW9uKHtcbiAgICAgIGNvbm5lY3Rpb24sXG4gICAgICBvcGVyYXRpb246IHRoaXMsXG4gICAgICBvd25lclxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvcGVyYXRpb24tYm91bmQgbW9kZWwgcXVlcnkvY3JlYXRlIHNjb3BlLlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBNQ1xuICAgKiBAcGFyYW0ge01DfSBNb2RlbENsYXNzIC0gTW9kZWwgY2xhc3MgdG8gYmluZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdDxNQz59IC0gT3BlcmF0aW9uLWJvdW5kIHNjb3BlLlxuICAgKi9cbiAgZm9yTW9kZWwoTW9kZWxDbGFzcykge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcbiAgICB0aGlzLmFzc2VydE1vZGVsKE1vZGVsQ2xhc3MpXG5cbiAgICByZXR1cm4gdGhpcy5tb2RlbENsYXNzKE1vZGVsQ2xhc3MpLl9uZXdRdWVyeSh7XG4gICAgICBkcml2ZXI6IHRoaXMuY29ubmVjdGlvbigpLFxuICAgICAgb3BlcmF0aW9uOiB0aGlzXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbW9kZWwtY2xhc3MgdmlldyB3aG9zZSBzY2hlbWEgbWV0YWRhdGEgaXMgYm91bmQgdG8gdGhpcyBwaHlzaWNhbFxuICAgKiBkYXRhYmFzZSBnZW5lcmF0aW9uLiBDb25zdHJ1Y3Rpb24gc3RpbGwgcHJvZHVjZXMgdGhlIGFwcGxpY2F0aW9uJ3Mgb3JpZ2luYWxcbiAgICogbW9kZWwgY2xhc3MsIHNvIGxpZmVjeWNsZSBjYWxsYmFja3MgYW5kIG1vZGVsIHJlZ2lzdHJpZXMgcmV0YWluIGNsYXNzIGlkZW50aXR5LlxuICAgKiBAdGVtcGxhdGUge3R5cGVvZiBpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBNQ1xuICAgKiBAcGFyYW0ge01DfSBNb2RlbENsYXNzIC0gQ2Fub25pY2FsIG1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7TUN9IC0gT3BlcmF0aW9uLWJvdW5kIG1vZGVsIGNsYXNzLlxuICAgKi9cbiAgbW9kZWxDbGFzcyhNb2RlbENsYXNzKSB7XG4gICAgaWYgKCF0aGlzLl9zY2hlbWFHZW5lcmF0aW9uKSByZXR1cm4gTW9kZWxDbGFzc1xuXG4gICAgY29uc3QgY2Fub25pY2FsTW9kZWxDbGFzcyA9IC8qKiBAdHlwZSB7TUN9ICovIChNb2RlbENsYXNzLl9yZWNvcmRNZXRhZGF0YU1vZGVsQ2xhc3MgfHwgTW9kZWxDbGFzcylcblxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fYm91bmRNb2RlbENsYXNzZXMuZ2V0KGNhbm9uaWNhbE1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiAvKiogQHR5cGUge01DfSAqLyAoZXhpc3RpbmcpXG5cbiAgICBjb25zdCBkYXRhYmFzZUlkZW50aXR5ID0gdGhpcy5kYXRhYmFzZUlkZW50aXR5KClcbiAgICBjb25zdCBtZXRhZGF0YUtleSA9IGAke2RhdGFiYXNlSWRlbnRpdHkubGVuZ3RofToke2RhdGFiYXNlSWRlbnRpdHl9OiR7dGhpcy5fc2NoZW1hR2VuZXJhdGlvbn1gXG4gICAgY29uc3QgbWV0YWRhdGFQcm9wZXJ0aWVzID0gY2Fub25pY2FsTW9kZWxDbGFzcy5yZWNvcmRNZXRhZGF0YVByb3BlcnR5TmFtZXMoKVxuICAgIGNvbnN0IGJvdW5kTW9kZWxDbGFzcyA9IG5ldyBQcm94eShjYW5vbmljYWxNb2RlbENsYXNzLCB7XG4gICAgICBjb25zdHJ1Y3Q6ICh0YXJnZXQsIGFyZ3MsIG5ld1RhcmdldCkgPT4gUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpLFxuICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcIl9yZWNvcmRNZXRhZGF0YU1vZGVsQ2xhc3NcIikgcmV0dXJuIHRhcmdldFxuICAgICAgICBpZiAocHJvcGVydHkgPT09IFwiX3JlY29yZE1ldGFkYXRhQmluZGVyXCIpIHJldHVybiAoLyoqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gKi8gdGFyZ2V0TW9kZWxDbGFzcykgPT4gdGhpcy5tb2RlbENsYXNzKHRhcmdldE1vZGVsQ2xhc3MpXG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfcmVjb3JkTWV0YWRhdGFPcGVyYXRpb25cIikgcmV0dXJuIHRoaXNcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBtZXRhZGF0YVByb3BlcnRpZXMuaGFzKHByb3BlcnR5KSkgcmV0dXJuIHRhcmdldC5yZWNvcmRNZXRhZGF0YVZhbHVlKG1ldGFkYXRhS2V5LCBwcm9wZXJ0eSlcblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpXG4gICAgICB9LFxuICAgICAgc2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09IFwic3RyaW5nXCIgJiYgbWV0YWRhdGFQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB0YXJnZXQuc2V0UmVjb3JkTWV0YWRhdGFWYWx1ZShtZXRhZGF0YUtleSwgcHJvcGVydHksIHZhbHVlKVxuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLl9ib3VuZE1vZGVsQ2xhc3Nlcy5zZXQoY2Fub25pY2FsTW9kZWxDbGFzcywgYm91bmRNb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7TUN9ICovIChib3VuZE1vZGVsQ2xhc3MpXG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBhIG1vZGVsIGJlbG9uZ3MgdG8gdGhpcyBvcGVyYXRpb24ncyBjb25maWd1cmF0aW9uIGFuZCBkYXRhYmFzZS5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIHZlcmlmeS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRNb2RlbChNb2RlbENsYXNzKSB7XG4gICAgaWYgKE1vZGVsQ2xhc3MuX2dldENvbmZpZ3VyYXRpb24oKSAhPT0gdGhpcy5fY29uZmlndXJhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke01vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKCl9IGJlbG9uZ3MgdG8gYW5vdGhlciBWZWxvY2lvdXMgY29uZmlndXJhdGlvbmApXG4gICAgfVxuXG4gICAgY29uc3QgbW9kZWxEYXRhYmFzZUlkZW50aWZpZXIgPSBNb2RlbENsYXNzLmdldERhdGFiYXNlSWRlbnRpZmllcih7dGVuYW50OiB0aGlzLl90ZW5hbnR9KVxuXG4gICAgaWYgKG1vZGVsRGF0YWJhc2VJZGVudGlmaWVyICE9PSB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSB1c2VzIGRhdGFiYXNlICR7SlNPTi5zdHJpbmdpZnkobW9kZWxEYXRhYmFzZUlkZW50aWZpZXIpfSwgbm90IG9wZXJhdGlvbiBkYXRhYmFzZSAke0pTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcil9YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgYSBsb2FkZWQgb3IgYnVpbHQgcmVjb3JkIHRvIHRoaXMgb3BlcmF0aW9uLlxuICAgKiBAdGVtcGxhdGUge2ltcG9ydChcIi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsXG4gICAqIEBwYXJhbSB7TW9kZWx9IHJlY29yZCAtIFJlY29yZCB0byBiaW5kLlxuICAgKiBAcmV0dXJucyB7TW9kZWx9IC0gQm91bmQgcmVjb3JkLlxuICAgKi9cbiAgYmluZFJlY29yZChyZWNvcmQpIHtcbiAgICB0aGlzLmFzc2VydEFjdGl2ZSgpXG4gICAgdGhpcy5hc3NlcnRNb2RlbChyZWNvcmQuZ2V0TW9kZWxDbGFzcygpKVxuICAgIHJlY29yZC5iaW5kRGF0YWJhc2VPcGVyYXRpb24odGhpcylcblxuICAgIHJldHVybiByZWNvcmRcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBvd25lZCBieSB0aGUgY3VycmVudCBvcGVyYXRpb24gdHJhbnNhY3Rpb24gZnJhbWUuXG4gICAqIEBwYXJhbSB7KCkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJlZ2lzdHJhdGlvbiBvciBleGVjdXRpb24uXG4gICAqL1xuICBhc3luYyBhZnRlckNvbW1pdChjYWxsYmFjaykge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24oKS5hZnRlckNvbW1pdChjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBndWFyZCBvd25lZCBieSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi9zYXZlcG9pbnQgZnJhbWUuXG4gICAqIEBwYXJhbSB7KGNvbnRleHQ6IHtvcGVyYXRpb246IFZlbG9jaW91c0RhdGFiYXNlT3BlcmF0aW9ufSkgPT4gdm9pZCB8IFByb21pc2U8dm9pZD59IGNhbGxiYWNrIC0gR3VhcmQgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIGFmdGVyIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGFzeW5jIGJlZm9yZUNvbW1pdChjYWxsYmFjaykge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcbiAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24oKS5iZWZvcmVDb21taXQoKCkgPT4gY2FsbGJhY2soe29wZXJhdGlvbjogdGhpc30pKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBuZXN0ZWQgb3BlcmF0aW9uIHRyYW5zYWN0aW9uL3NhdmVwb2ludC5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+fSBjYWxsYmFjayAtIENhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxUPn0gLSBDYWxsYmFjayByZXN1bHQuXG4gICAqL1xuICBhc3luYyB0cmFuc2FjdGlvbihjYWxsYmFjaykge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcblxuICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbm5lY3Rpb24oKS50cmFuc2FjdGlvbihjYWxsYmFjaylcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWxpYmVyYXRlbHkgZXhwb3NlZCBvcGVyYXRpb24gY29ubmVjdGlvbiBmYWNhZGUgZm9yIHJhdyBTUUwuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSAtIE9wZXJhdGlvbi1ib3VuZCBjb25uZWN0aW9uLlxuICAgKi9cbiAgY29ubmVjdGlvbigpIHtcbiAgICB0aGlzLmFzc2VydEFjdGl2ZSgpXG5cbiAgICAvKipcbiAgICAgKiBOYXJyb3dzIHRoZSBQcm94eSBmYWNhZGUgdG8gdGhlIGNvbXBsZXRlIGRyaXZlciBzdXJmYWNlIHRoYXQgaXQgZm9yd2FyZHMuXG4gICAgICogQHR5cGUge2ltcG9ydChcIi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9XG4gICAgICovXG4gICAgY29uc3QgY29ubmVjdGlvbkZhY2FkZSA9IC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59ICovICh0aGlzLl9jb25uZWN0aW9uKVxuXG4gICAgcmV0dXJuIGNvbm5lY3Rpb25GYWNhZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5hbnQgZGVzY3JpcHRvciBjYXB0dXJlZCBieSB0aGUgaW1tdXRhYmxlIGhhbmRsZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSAtIENhcHR1cmVkIHRlbmFudCBkZXNjcmlwdG9yLlxuICAgKi9cbiAgdGVuYW50KCkge1xuICAgIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkfSAqLyAodGhpcy5fdGVuYW50KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxvZ2ljYWwgZGF0YWJhc2UgaWRlbnRpZmllciBvd25lZCBieSB0aGlzIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBEYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKi9cbiAgZGF0YWJhc2VJZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgc3RhYmxlIHBoeXNpY2FsLWRhdGFiYXNlIGlkZW50aXR5IHN1aXRhYmxlIGZvciBvcGVyYXRpb24tYXdhcmUgY2FjaGVzLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFBoeXNpY2FsIGRhdGFiYXNlIGlkZW50aXR5LlxuICAgKi9cbiAgZGF0YWJhc2VJZGVudGl0eSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyfToke3RoaXMuX2NvbmZpZ3VyYXRpb25SZXVzZUtleX1gXG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYSBtb2RlbCB0aHJvdWdoIHRoaXMgb3BlcmF0aW9uJ3MgY2FwdHVyZWQgY29ubmVjdGlvbi5cbiAgICogQHBhcmFtIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgYXN5bmMgZW5zdXJlTW9kZWxJbml0aWFsaXplZChNb2RlbENsYXNzKSB7XG4gICAgdGhpcy5hc3NlcnRBY3RpdmUoKVxuXG4gICAgY29uc3QgYm91bmRNb2RlbENsYXNzID0gdGhpcy5tb2RlbENsYXNzKE1vZGVsQ2xhc3MpXG5cbiAgICBpZiAoYm91bmRNb2RlbENsYXNzLmlzSW5pdGlhbGl6ZWQoKSkgdGhpcy5hc3NlcnRNb2RlbChNb2RlbENsYXNzKVxuXG4gICAgYXdhaXQgYm91bmRNb2RlbENsYXNzLmVuc3VyZUluaXRpYWxpemVkKHtcbiAgICAgIGNvbmZpZ3VyYXRpb246IHRoaXMuX2NvbmZpZ3VyYXRpb24sXG4gICAgICBjb25uZWN0aW9uOiB0aGlzLmNvbm5lY3Rpb24oKVxuICAgIH0pXG4gICAgdGhpcy5hc3NlcnRNb2RlbChNb2RlbENsYXNzKVxuICB9XG5cbiAgLyoqXG4gICAqIFJhaXNlcyB3aGVuIGFuIG9wZXJhdGlvbiBoYW5kbGUgaGFzIGxlZnQgaXRzIGNhbGxiYWNrLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGFzc2VydEFjdGl2ZSgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2ZSkgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2Ugb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWRcIilcblxuICAgIGNvbnN0IHBvb2wgPSB0aGlzXG4gICAgICAuX2NvbmZpZ3VyYXRpb25cbiAgICAgIC5nZXREYXRhYmFzZVBvb2wodGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKVxuICAgIGNvbnN0IGNhcHR1cmVkUmV1c2VLZXkgPSBwb29sLmdldENvbmZpZ3VyYXRpb25SZXVzZUtleSh0aGlzLl9kYXRhYmFzZUNvbmZpZ3VyYXRpb24pXG4gICAgY29uc3QgY29ubmVjdGlvblJldXNlS2V5ID0gcG9vbC5nZXRDb25uZWN0aW9uQ29uZmlndXJhdGlvblJldXNlS2V5KHRoaXMuX3BoeXNpY2FsQ29ubmVjdGlvbilcblxuICAgIGlmIChjYXB0dXJlZFJldXNlS2V5ICE9PSB0aGlzLl9jb25maWd1cmF0aW9uUmV1c2VLZXkgfHwgY29ubmVjdGlvblJldXNlS2V5ICE9PSB0aGlzLl9jb25maWd1cmF0aW9uUmV1c2VLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YWJhc2Ugb3BlcmF0aW9uIGZvciAke0pTT04uc3RyaW5naWZ5KHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcil9IGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgcGh5c2ljYWwgZGF0YWJhc2UgdGhhbiBpdHMgY2FwdHVyZWQgdGVuYW50IGhhbmRsZWApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2VuZm9yY2VDdXJyZW50VGVuYW50UmV1c2VLZXkgJiYgcG9vbC5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkoKSAhPT0gdGhpcy5fY29uZmlndXJhdGlvblJldXNlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFiYXNlIG9wZXJhdGlvbiBmb3IgJHtKU09OLnN0cmluZ2lmeSh0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpfSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHBoeXNpY2FsIGRhdGFiYXNlIHRoYW4gdGhlIGN1cnJlbnQgdGVuYW50IGNvbnRleHRgKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBpcmVzIHRoZSBvcGVyYXRpb24gYW5kIGFsbCBzY29wZXMvcmVjb3JkcyBib3VuZCB0byBpdC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjb21wbGV0ZSgpIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZVxuICB9XG59XG4iXX0=
234
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RhdGFiYXNlL29wZXJhdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSwyQkFBMkIsQ0FBQTtBQUUzRDs7O0dBR0c7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxZQUFZLEVBQUMsYUFBYSxFQUFFLHFCQUFxQixFQUFFLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSw0QkFBNEIsR0FBRyxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBQztRQUM3SyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQTtRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQTtRQUNuQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcscUJBQXFCLElBQUksYUFBYSxDQUFDLDRCQUE0QixDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQzdILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxxQkFBcUIsQ0FBQTtRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUE7UUFDN0MsSUFBSSxDQUFDLDZCQUE2QixHQUFHLDRCQUE0QixDQUFBO1FBQ2pFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVLENBQUE7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFBO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFBO1FBQ3JCLDhHQUE4RztRQUM5RyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksbUJBQW1CLENBQUM7WUFDekMsVUFBVTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSztT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SUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7WUFDMUcsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMkVBQTJFLENBQUMsQ0FBQTtRQUNoSyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IE9wZXJhdGlvbkNvbm5lY3Rpb24gZnJvbSBcIi4vb3BlcmF0aW9uLWNvbm5lY3Rpb24uanNcIlxuXG4vKipcbiAqIEV4cGxpY2l0IG93bmVyIGZvciBtb2RlbCB3b3JrIHBlcmZvcm1lZCBvbiBvbmUgcGlubmVkIHRyYW5zYWN0aW9uYWxcbiAqIGNvbm5lY3Rpb24uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZlbG9jaW91c0RhdGFiYXNlT3BlcmF0aW9uIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3BlcmF0aW9uIG93bmVyc2hpcC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIE93bmluZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmVuZm9yY2VDdXJyZW50VGVuYW50UmV1c2VLZXldIC0gV2hldGhlciBhbWJpZW50IHRlbmFudCBjaGFuZ2VzIGludmFsaWRhdGUgdGhpcyBsZWdhY3kgb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX0gW2FyZ3MuZGF0YWJhc2VDb25maWd1cmF0aW9uXSAtIENhcHR1cmVkIHJlc29sdmVkIHBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmNvbmZpZ3VyYXRpb25SZXVzZUtleSAtIFBoeXNpY2FsIGRhdGFiYXNlIGNvbmZpZ3VyYXRpb24ga2V5IGNhcHR1cmVkIGF0IGNoZWNrb3V0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29ubmVjdGlvbiAtIFBpbm5lZCBwaHlzaWNhbCBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5kYXRhYmFzZUlkZW50aWZpZXIgLSBTaW5ndWxhciBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0ge3N5bWJvbH0gYXJncy5vd25lciAtIE9wYXF1ZSBwb29sIGxlYXNlIG93bmVyLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc2NoZW1hR2VuZXJhdGlvbl0gLSBUZW5hbnQgc2NoZW1hIGdlbmVyYXRpb24gb3duaW5nIHJlY29yZCBtZXRhZGF0YS5cbiAgICogQHBhcmFtIHtvYmplY3QgfCB1bmRlZmluZWR9IGFyZ3MudGVuYW50IC0gVGVuYW50IGRlc2NyaXB0b3IgY2FwdHVyZWQgYnkgdGhlIG93bmluZyBoYW5kbGUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbiwgZGF0YWJhc2VDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uUmV1c2VLZXksIGNvbm5lY3Rpb24sIGRhdGFiYXNlSWRlbnRpZmllciwgZW5mb3JjZUN1cnJlbnRUZW5hbnRSZXVzZUtleSA9IHRydWUsIG93bmVyLCBzY2hlbWFHZW5lcmF0aW9uLCB0ZW5hbnR9KSB7XG4gICAgdGhpcy5fYWN0aXZlID0gdHJ1ZVxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5fZGF0YWJhc2VDb25maWd1cmF0aW9uID0gZGF0YWJhc2VDb25maWd1cmF0aW9uIHx8IGNvbmZpZ3VyYXRpb24ucmVzb2x2ZURhdGFiYXNlQ29uZmlndXJhdGlvbihkYXRhYmFzZUlkZW50aWZpZXIsIHRlbmFudClcbiAgICB0aGlzLl9jb25maWd1cmF0aW9uUmV1c2VLZXkgPSBjb25maWd1cmF0aW9uUmV1c2VLZXlcbiAgICB0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIgPSBkYXRhYmFzZUlkZW50aWZpZXJcbiAgICB0aGlzLl9lbmZvcmNlQ3VycmVudFRlbmFudFJldXNlS2V5ID0gZW5mb3JjZUN1cnJlbnRUZW5hbnRSZXVzZUtleVxuICAgIHRoaXMuX3BoeXNpY2FsQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb25cbiAgICB0aGlzLl9zY2hlbWFHZW5lcmF0aW9uID0gc2NoZW1hR2VuZXJhdGlvblxuICAgIHRoaXMuX3RlbmFudCA9IHRlbmFudFxuICAgIC8qKiBAdHlwZSB7V2Vha01hcDx0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgdHlwZW9mIGltcG9ydChcIi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQ+fSAqL1xuICAgIHRoaXMuX2JvdW5kTW9kZWxDbGFzc2VzID0gbmV3IFdlYWtNYXAoKVxuICAgIHRoaXMuX2Nvbm5lY3Rpb24gPSBuZXcgT3BlcmF0aW9uQ29ubmVjdGlvbih7XG4gICAgICBjb25uZWN0aW9uLFxuICAgICAgb3BlcmF0aW9uOiB0aGlzLFxuICAgICAgb3duZXJcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb3BlcmF0aW9uLWJvdW5kIG1vZGVsIHF1ZXJ5L2NyZWF0ZSBzY29wZS5cbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTUNcbiAgICogQHBhcmFtIHtNQ30gTW9kZWxDbGFzcyAtIE1vZGVsIGNsYXNzIHRvIGJpbmQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHQ8TUM+fSAtIE9wZXJhdGlvbi1ib3VuZCBzY29wZS5cbiAgICovXG4gIGZvck1vZGVsKE1vZGVsQ2xhc3MpIHtcbiAgICB0aGlzLmFzc2VydEFjdGl2ZSgpXG4gICAgdGhpcy5hc3NlcnRNb2RlbChNb2RlbENsYXNzKVxuXG4gICAgcmV0dXJuIHRoaXMubW9kZWxDbGFzcyhNb2RlbENsYXNzKS5fbmV3UXVlcnkoe1xuICAgICAgZHJpdmVyOiB0aGlzLmNvbm5lY3Rpb24oKSxcbiAgICAgIG9wZXJhdGlvbjogdGhpc1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG1vZGVsLWNsYXNzIHZpZXcgd2hvc2Ugc2NoZW1hIG1ldGFkYXRhIGlzIGJvdW5kIHRvIHRoaXMgcGh5c2ljYWxcbiAgICogZGF0YWJhc2UgZ2VuZXJhdGlvbi4gQ29uc3RydWN0aW9uIHN0aWxsIHByb2R1Y2VzIHRoZSBhcHBsaWNhdGlvbidzIG9yaWdpbmFsXG4gICAqIG1vZGVsIGNsYXNzLCBzbyBsaWZlY3ljbGUgY2FsbGJhY2tzIGFuZCBtb2RlbCByZWdpc3RyaWVzIHJldGFpbiBjbGFzcyBpZGVudGl0eS5cbiAgICogQHRlbXBsYXRlIHt0eXBlb2YgaW1wb3J0KFwiLi9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gTUNcbiAgICogQHBhcmFtIHtNQ30gTW9kZWxDbGFzcyAtIENhbm9uaWNhbCBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge01DfSAtIE9wZXJhdGlvbi1ib3VuZCBtb2RlbCBjbGFzcy5cbiAgICovXG4gIG1vZGVsQ2xhc3MoTW9kZWxDbGFzcykge1xuICAgIGlmICghdGhpcy5fc2NoZW1hR2VuZXJhdGlvbikgcmV0dXJuIE1vZGVsQ2xhc3NcblxuICAgIGNvbnN0IGNhbm9uaWNhbE1vZGVsQ2xhc3MgPSAvKiogQHR5cGUge01DfSAqLyAoTW9kZWxDbGFzcy5fcmVjb3JkTWV0YWRhdGFNb2RlbENsYXNzIHx8IE1vZGVsQ2xhc3MpXG5cbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2JvdW5kTW9kZWxDbGFzc2VzLmdldChjYW5vbmljYWxNb2RlbENsYXNzKVxuXG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gLyoqIEB0eXBlIHtNQ30gKi8gKGV4aXN0aW5nKVxuXG4gICAgY29uc3QgZGF0YWJhc2VJZGVudGl0eSA9IHRoaXMuZGF0YWJhc2VJZGVudGl0eSgpXG4gICAgY29uc3QgbWV0YWRhdGFLZXkgPSBgJHtkYXRhYmFzZUlkZW50aXR5Lmxlbmd0aH06JHtkYXRhYmFzZUlkZW50aXR5fToke3RoaXMuX3NjaGVtYUdlbmVyYXRpb259YFxuICAgIGNvbnN0IG1ldGFkYXRhUHJvcGVydGllcyA9IGNhbm9uaWNhbE1vZGVsQ2xhc3MucmVjb3JkTWV0YWRhdGFQcm9wZXJ0eU5hbWVzKClcbiAgICBjb25zdCBib3VuZE1vZGVsQ2xhc3MgPSBuZXcgUHJveHkoY2Fub25pY2FsTW9kZWxDbGFzcywge1xuICAgICAgY29uc3RydWN0OiAodGFyZ2V0LCBhcmdzLCBuZXdUYXJnZXQpID0+IFJlZmxlY3QuY29uc3RydWN0KHRhcmdldCwgYXJncywgbmV3VGFyZ2V0KSxcbiAgICAgIGdldDogKHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSA9PiB7XG4gICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJfcmVjb3JkTWV0YWRhdGFNb2RlbENsYXNzXCIpIHJldHVybiB0YXJnZXRcbiAgICAgICAgaWYgKHByb3BlcnR5ID09PSBcIl9yZWNvcmRNZXRhZGF0YUJpbmRlclwiKSByZXR1cm4gKC8qKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcIi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9ICovIHRhcmdldE1vZGVsQ2xhc3MpID0+IHRoaXMubW9kZWxDbGFzcyh0YXJnZXRNb2RlbENsYXNzKVxuICAgICAgICBpZiAocHJvcGVydHkgPT09IFwiX3JlY29yZE1ldGFkYXRhT3BlcmF0aW9uXCIpIHJldHVybiB0aGlzXG4gICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkgPT09IFwic3RyaW5nXCIgJiYgbWV0YWRhdGFQcm9wZXJ0aWVzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiB0YXJnZXQucmVjb3JkTWV0YWRhdGFWYWx1ZShtZXRhZGF0YUtleSwgcHJvcGVydHkpXG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKVxuICAgICAgfSxcbiAgICAgIHNldDogKHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSBcInN0cmluZ1wiICYmIG1ldGFkYXRhUHJvcGVydGllcy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgICAgdGFyZ2V0LnNldFJlY29yZE1ldGFkYXRhVmFsdWUobWV0YWRhdGFLZXksIHByb3BlcnR5LCB2YWx1ZSlcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcilcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5fYm91bmRNb2RlbENsYXNzZXMuc2V0KGNhbm9uaWNhbE1vZGVsQ2xhc3MsIGJvdW5kTW9kZWxDbGFzcylcblxuICAgIHJldHVybiAvKiogQHR5cGUge01DfSAqLyAoYm91bmRNb2RlbENsYXNzKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgYSBtb2RlbCBiZWxvbmdzIHRvIHRoaXMgb3BlcmF0aW9uJ3MgY29uZmlndXJhdGlvbiBhbmQgZGF0YWJhc2UuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcyB0byB2ZXJpZnkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0TW9kZWwoTW9kZWxDbGFzcykge1xuICAgIGlmIChNb2RlbENsYXNzLl9nZXRDb25maWd1cmF0aW9uKCkgIT09IHRoaXMuX2NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtNb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpfSBiZWxvbmdzIHRvIGFub3RoZXIgVmVsb2Npb3VzIGNvbmZpZ3VyYXRpb25gKVxuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsRGF0YWJhc2VJZGVudGlmaWVyID0gTW9kZWxDbGFzcy5nZXREYXRhYmFzZUlkZW50aWZpZXIoe3RlbmFudDogdGhpcy5fdGVuYW50fSlcblxuICAgIGlmIChtb2RlbERhdGFiYXNlSWRlbnRpZmllciAhPT0gdGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7TW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUoKX0gdXNlcyBkYXRhYmFzZSAke0pTT04uc3RyaW5naWZ5KG1vZGVsRGF0YWJhc2VJZGVudGlmaWVyKX0sIG5vdCBvcGVyYXRpb24gZGF0YWJhc2UgJHtKU09OLnN0cmluZ2lmeSh0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpfWApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgbG9hZGVkIG9yIGJ1aWx0IHJlY29yZCB0byB0aGlzIG9wZXJhdGlvbi5cbiAgICogQHRlbXBsYXRlIHtpbXBvcnQoXCIuL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBNb2RlbFxuICAgKiBAcGFyYW0ge01vZGVsfSByZWNvcmQgLSBSZWNvcmQgdG8gYmluZC5cbiAgICogQHJldHVybnMge01vZGVsfSAtIEJvdW5kIHJlY29yZC5cbiAgICovXG4gIGJpbmRSZWNvcmQocmVjb3JkKSB7XG4gICAgdGhpcy5hc3NlcnRBY3RpdmUoKVxuICAgIHRoaXMuYXNzZXJ0TW9kZWwocmVjb3JkLmdldE1vZGVsQ2xhc3MoKSlcbiAgICByZWNvcmQuYmluZERhdGFiYXNlT3BlcmF0aW9uKHRoaXMpXG4gICAgcmVjb3JkLmNhcHR1cmVEYXRhYmFzZUlkZW50aXR5KHRoaXMuZGF0YWJhc2VJZGVudGl0eSgpKVxuXG4gICAgcmV0dXJuIHJlY29yZFxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIG93bmVkIGJ5IHRoZSBjdXJyZW50IG9wZXJhdGlvbiB0cmFuc2FjdGlvbiBmcmFtZS5cbiAgICogQHBhcmFtIHsoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBDYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcmVnaXN0cmF0aW9uIG9yIGV4ZWN1dGlvbi5cbiAgICovXG4gIGFzeW5jIGFmdGVyQ29tbWl0KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5hc3NlcnRBY3RpdmUoKVxuICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLmFmdGVyQ29tbWl0KGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGd1YXJkIG93bmVkIGJ5IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uL3NhdmVwb2ludCBmcmFtZS5cbiAgICogQHBhcmFtIHsoY29udGV4dDoge29wZXJhdGlvbjogVmVsb2Npb3VzRGF0YWJhc2VPcGVyYXRpb259KSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBHdWFyZCBjYWxsYmFjay5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgYWZ0ZXIgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgYmVmb3JlQ29tbWl0KGNhbGxiYWNrKSB7XG4gICAgdGhpcy5hc3NlcnRBY3RpdmUoKVxuICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLmJlZm9yZUNvbW1pdCgoKSA9PiBjYWxsYmFjayh7b3BlcmF0aW9uOiB0aGlzfSkpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIG5lc3RlZCBvcGVyYXRpb24gdHJhbnNhY3Rpb24vc2F2ZXBvaW50LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8VD59IGNhbGxiYWNrIC0gQ2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSAtIENhbGxiYWNrIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIHRyYW5zYWN0aW9uKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5hc3NlcnRBY3RpdmUoKVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuY29ubmVjdGlvbigpLnRyYW5zYWN0aW9uKGNhbGxiYWNrKVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGRlbGliZXJhdGVseSBleHBvc2VkIG9wZXJhdGlvbiBjb25uZWN0aW9uIGZhY2FkZSBmb3IgcmF3IFNRTC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IC0gT3BlcmF0aW9uLWJvdW5kIGNvbm5lY3Rpb24uXG4gICAqL1xuICBjb25uZWN0aW9uKCkge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcblxuICAgIC8qKlxuICAgICAqIE5hcnJvd3MgdGhlIFByb3h5IGZhY2FkZSB0byB0aGUgY29tcGxldGUgZHJpdmVyIHN1cmZhY2UgdGhhdCBpdCBmb3J3YXJkcy5cbiAgICAgKiBAdHlwZSB7aW1wb3J0KFwiLi9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH1cbiAgICAgKi9cbiAgICBjb25zdCBjb25uZWN0aW9uRmFjYWRlID0gLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKHRoaXMuX2Nvbm5lY3Rpb24pXG5cbiAgICByZXR1cm4gY29ubmVjdGlvbkZhY2FkZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRlbmFudCBkZXNjcmlwdG9yIGNhcHR1cmVkIGJ5IHRoZSBpbW11dGFibGUgaGFuZGxlLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWR9IC0gQ2FwdHVyZWQgdGVuYW50IGRlc2NyaXB0b3IuXG4gICAqL1xuICB0ZW5hbnQoKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWR9ICovICh0aGlzLl90ZW5hbnQpXG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9naWNhbCBkYXRhYmFzZSBpZGVudGlmaWVyIG93bmVkIGJ5IHRoaXMgb3BlcmF0aW9uLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIERhdGFiYXNlIGlkZW50aWZpZXIuXG4gICAqL1xuICBkYXRhYmFzZUlkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllclxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzdGFibGUgcGh5c2ljYWwtZGF0YWJhc2UgaWRlbnRpdHkgc3VpdGFibGUgZm9yIG9wZXJhdGlvbi1hd2FyZSBjYWNoZXMuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gUGh5c2ljYWwgZGF0YWJhc2UgaWRlbnRpdHkuXG4gICAqL1xuICBkYXRhYmFzZUlkZW50aXR5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXJ9OiR7dGhpcy5fY29uZmlndXJhdGlvblJldXNlS2V5fWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5hbnQgc2NoZW1hIGdlbmVyYXRpb24gY2FwdHVyZWQgd2hlbiB0aGlzIG9wZXJhdGlvbiBzdGFydGVkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIENhcHR1cmVkIHNjaGVtYSBnZW5lcmF0aW9uLlxuICAgKi9cbiAgc2NoZW1hR2VuZXJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NoZW1hR2VuZXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGEgbW9kZWwgdGhyb3VnaCB0aGlzIG9wZXJhdGlvbidzIGNhcHR1cmVkIGNvbm5lY3Rpb24uXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4vcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9IE1vZGVsQ2xhc3MgLSBNb2RlbCBjbGFzcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIGFzeW5jIGVuc3VyZU1vZGVsSW5pdGlhbGl6ZWQoTW9kZWxDbGFzcykge1xuICAgIHRoaXMuYXNzZXJ0QWN0aXZlKClcblxuICAgIGNvbnN0IGJvdW5kTW9kZWxDbGFzcyA9IHRoaXMubW9kZWxDbGFzcyhNb2RlbENsYXNzKVxuXG4gICAgaWYgKGJvdW5kTW9kZWxDbGFzcy5pc0luaXRpYWxpemVkKCkpIHRoaXMuYXNzZXJ0TW9kZWwoTW9kZWxDbGFzcylcblxuICAgIGF3YWl0IGJvdW5kTW9kZWxDbGFzcy5lbnN1cmVJbml0aWFsaXplZCh7XG4gICAgICBjb25maWd1cmF0aW9uOiB0aGlzLl9jb25maWd1cmF0aW9uLFxuICAgICAgY29ubmVjdGlvbjogdGhpcy5jb25uZWN0aW9uKClcbiAgICB9KVxuICAgIHRoaXMuYXNzZXJ0TW9kZWwoTW9kZWxDbGFzcylcbiAgfVxuXG4gIC8qKlxuICAgKiBSYWlzZXMgd2hlbiBhbiBvcGVyYXRpb24gaGFuZGxlIGhhcyBsZWZ0IGl0cyBjYWxsYmFjay5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBhc3NlcnRBY3RpdmUoKSB7XG4gICAgaWYgKCF0aGlzLl9hY3RpdmUpIHRocm93IG5ldyBFcnJvcihcIkRhdGFiYXNlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkXCIpXG5cbiAgICBjb25zdCBwb29sID0gdGhpc1xuICAgICAgLl9jb25maWd1cmF0aW9uXG4gICAgICAuZ2V0RGF0YWJhc2VQb29sKHRoaXMuX2RhdGFiYXNlSWRlbnRpZmllcilcbiAgICBjb25zdCBjYXB0dXJlZFJldXNlS2V5ID0gcG9vbC5nZXRDb25maWd1cmF0aW9uUmV1c2VLZXkodGhpcy5fZGF0YWJhc2VDb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IGNvbm5lY3Rpb25SZXVzZUtleSA9IHBvb2wuZ2V0Q29ubmVjdGlvbkNvbmZpZ3VyYXRpb25SZXVzZUtleSh0aGlzLl9waHlzaWNhbENvbm5lY3Rpb24pXG5cbiAgICBpZiAoY2FwdHVyZWRSZXVzZUtleSAhPT0gdGhpcy5fY29uZmlndXJhdGlvblJldXNlS2V5IHx8IGNvbm5lY3Rpb25SZXVzZUtleSAhPT0gdGhpcy5fY29uZmlndXJhdGlvblJldXNlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGFiYXNlIG9wZXJhdGlvbiBmb3IgJHtKU09OLnN0cmluZ2lmeSh0aGlzLl9kYXRhYmFzZUlkZW50aWZpZXIpfSBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IHBoeXNpY2FsIGRhdGFiYXNlIHRoYW4gaXRzIGNhcHR1cmVkIHRlbmFudCBoYW5kbGVgKVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9lbmZvcmNlQ3VycmVudFRlbmFudFJldXNlS2V5ICYmIHBvb2wuZ2V0Q29uZmlndXJhdGlvblJldXNlS2V5KCkgIT09IHRoaXMuX2NvbmZpZ3VyYXRpb25SZXVzZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhYmFzZSBvcGVyYXRpb24gZm9yICR7SlNPTi5zdHJpbmdpZnkodGhpcy5fZGF0YWJhc2VJZGVudGlmaWVyKX0gYmVsb25ncyB0byBhIGRpZmZlcmVudCBwaHlzaWNhbCBkYXRhYmFzZSB0aGFuIHRoZSBjdXJyZW50IHRlbmFudCBjb250ZXh0YClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhwaXJlcyB0aGUgb3BlcmF0aW9uIGFuZCBhbGwgc2NvcGVzL3JlY29yZHMgYm91bmQgdG8gaXQuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgY29tcGxldGUoKSB7XG4gICAgdGhpcy5fYWN0aXZlID0gZmFsc2VcbiAgfVxufVxuIl19
@@ -415,6 +415,18 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, Ret
415
415
  * @returns {this} - Bound record.
416
416
  */
417
417
  bindDatabaseOperation(operation: import("../operation.js").default): /*elided*/ any;
418
+ /**
419
+ * Captures and validates the physical database identity that owns this record.
420
+ * @param {string} databaseIdentity - Opaque operation/connection identity.
421
+ * @returns {this} This record.
422
+ */
423
+ captureDatabaseIdentity(databaseIdentity: string): /*elided*/ any;
424
+ _databaseIdentity: string | undefined;
425
+ /**
426
+ * Returns the captured physical database identity.
427
+ * @returns {string | undefined} Captured physical database identity.
428
+ */
429
+ databaseIdentity(): string | undefined;
418
430
  /**
419
431
  * Releases this record from a completed eager-helper operation while
420
432
  * preserving the legacy ambient follow-up behavior of `usingTenant` finders.
@@ -476,6 +488,12 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, Ret
476
488
  * @returns {import("../drivers/base.js").default} - The connection.
477
489
  */
478
490
  _connection(): import("../drivers/base.js").default;
491
+ /**
492
+ * Resolves the identity of an already selected concrete connection.
493
+ * @param {import("../drivers/base.js").default} connection - Concrete connection.
494
+ * @returns {string} Physical database identity.
495
+ */
496
+ _databaseIdentityForConnection(connection: import("../drivers/base.js").default): string;
479
497
  /**
480
498
  * Returns the connection that owns this record's database work.
481
499
  * @returns {import("../drivers/base.js").default} - Connection.
@@ -2021,6 +2039,7 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, Ret
2021
2039
  ransack<MC extends typeof VelociousDatabaseRecord>(this: MC, params: Record<string, ReturnType<typeof JSON.parse>>): ModelClassQuery<MC>;
2022
2040
  } | undefined;
2023
2041
  _isNewRecord: boolean;
2042
+ _databaseIdentity: string | undefined;
2024
2043
  /** @type {Record<string, string> | undefined} */
2025
2044
  static _attributeNameToColumnName: Record<string, string> | undefined;
2026
2045
  /** @type {Record<string, string> | undefined} */
@@ -3510,6 +3529,17 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, Ret
3510
3529
  * @returns {this} - Bound record.
3511
3530
  */
3512
3531
  bindDatabaseOperation(operation: import("../operation.js").default): this;
3532
+ /**
3533
+ * Captures and validates the physical database identity that owns this record.
3534
+ * @param {string} databaseIdentity - Opaque operation/connection identity.
3535
+ * @returns {this} This record.
3536
+ */
3537
+ captureDatabaseIdentity(databaseIdentity: string): this;
3538
+ /**
3539
+ * Returns the captured physical database identity.
3540
+ * @returns {string | undefined} Captured physical database identity.
3541
+ */
3542
+ databaseIdentity(): string | undefined;
3513
3543
  /**
3514
3544
  * Releases this record from a completed eager-helper operation while
3515
3545
  * preserving the legacy ambient follow-up behavior of `usingTenant` finders.
@@ -3571,6 +3601,12 @@ declare class VelociousDatabaseRecord<WriteAttributes extends Record<string, Ret
3571
3601
  * @returns {import("../drivers/base.js").default} - The connection.
3572
3602
  */
3573
3603
  _connection(): import("../drivers/base.js").default;
3604
+ /**
3605
+ * Resolves the identity of an already selected concrete connection.
3606
+ * @param {import("../drivers/base.js").default} connection - Concrete connection.
3607
+ * @returns {string} Physical database identity.
3608
+ */
3609
+ _databaseIdentityForConnection(connection: import("../drivers/base.js").default): string;
3574
3610
  /**
3575
3611
  * Returns the connection that owns this record's database work.
3576
3612
  * @returns {import("../drivers/base.js").default} - Connection.