@agentshouse/mdruntime 0.1.0-alpha.3 → 0.1.0-alpha.5
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/adapter.d.ts +21 -4
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js.map +1 -1
- package/dist/connection.d.ts +22 -4
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +657 -78
- package/dist/connection.js.map +1 -1
- package/dist/durability.d.ts +4 -0
- package/dist/durability.d.ts.map +1 -0
- package/dist/durability.js +65 -0
- package/dist/durability.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/log.d.ts +5 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +15 -0
- package/dist/log.js.map +1 -0
- package/dist/memory.js +2 -1
- package/dist/memory.js.map +1 -1
- package/dist/outcome.d.ts +30 -0
- package/dist/outcome.d.ts.map +1 -0
- package/dist/outcome.js +13 -0
- package/dist/outcome.js.map +1 -0
- package/dist/replica.d.ts +1 -0
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +25 -0
- package/dist/replica.js.map +1 -1
- package/dist/status.d.ts +2 -1
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +6 -4
- package/dist/status.js.map +1 -1
- package/dist/store.d.ts +5 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +19 -1
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/replica.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { immutable, type ChangeBatch } from './change.js';\nimport { parseCollection, readCollection, type Collection } from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport type { ReplicaRecord } from './store.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n};\n\nexport function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null {\n const collection = readCollection(record.documents, record.binaryTargets);\n return collection === null ? null : { record, collection };\n}\n\nexport function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n collection: confirmed.collection,\n },\n };\n }\n const layer = overlay(confirmed.record, batches);\n return {\n confirmed,\n queue: batches,\n visible: { ...layer, collection: parseCollection(layer.documents) },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","overlay","readConfirmed","record","collection","documents","binaryTargets","
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/replica.ts"],"sourcesContent":["import { immutable, type ChangeBatch } from './change.js';\nimport { parseCollection, readCollection, type Collection } from './collection.js';\nimport { overlay, type Layer } from './overlay.js';\nimport type { ReplicaRecord } from './store.js';\n\nexport type ConfirmedLayer = {\n record: ReplicaRecord;\n collection: Collection;\n};\n\nexport type VisibleLayer = Layer & {\n collection: Collection;\n};\n\nexport type Replica = {\n confirmed: ConfirmedLayer;\n queue: readonly ChangeBatch[];\n visible: VisibleLayer;\n};\n\nexport function readConfirmed(record: ReplicaRecord): ConfirmedLayer | null {\n const collection = readCollection(record.documents, record.binaryTargets);\n return collection === null ? null : { record, collection };\n}\n\nexport function applyReturned(\n confirmed: ConfirmedLayer,\n documents: Readonly<Record<string, string>>,\n revisions: Readonly<Record<string, string>>,\n removals: readonly string[],\n roomVersion: string,\n): ConfirmedLayer | null {\n const nextDocuments = { ...confirmed.record.documents, ...documents };\n const nextRevisions = { ...confirmed.record.revisions, ...revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n for (const path of removals) {\n delete nextDocuments[path];\n delete nextRevisions[path];\n binaryTargets.delete(path);\n }\n return readConfirmed({\n ...confirmed.record,\n roomVersion,\n documents: nextDocuments,\n revisions: nextRevisions,\n binaryTargets: [...binaryTargets].sort(),\n });\n}\n\nexport function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[]): Replica {\n const batches = Object.freeze(queue.map(immutable));\n if (batches.length === 0) {\n return {\n confirmed,\n queue: batches,\n visible: {\n documents: confirmed.record.documents,\n binaryTargets: confirmed.record.binaryTargets,\n revisions: confirmed.record.revisions,\n collection: confirmed.collection,\n },\n };\n }\n const layer = overlay(confirmed.record, batches);\n return {\n confirmed,\n queue: batches,\n visible: { ...layer, collection: parseCollection(layer.documents) },\n };\n}\n"],"names":["immutable","parseCollection","readCollection","overlay","readConfirmed","record","collection","documents","binaryTargets","applyReturned","confirmed","revisions","removals","roomVersion","nextDocuments","nextRevisions","Set","path","delete","sort","replicaOf","queue","batches","Object","freeze","map","length","visible","layer"],"mappings":"AAAA,SAASA,SAAS,QAA0B,cAAc;AAC1D,SAASC,eAAe,EAAEC,cAAc,QAAyB,kBAAkB;AACnF,SAASC,OAAO,QAAoB,eAAe;AAkBnD,OAAO,SAASC,cAAcC,MAAqB;IACjD,MAAMC,aAAaJ,eAAeG,OAAOE,SAAS,EAAEF,OAAOG,aAAa;IACxE,OAAOF,eAAe,OAAO,OAAO;QAAED;QAAQC;IAAW;AAC3D;AAEA,OAAO,SAASG,cACdC,SAAyB,EACzBH,SAA2C,EAC3CI,SAA2C,EAC3CC,QAA2B,EAC3BC,WAAmB;IAEnB,MAAMC,gBAAgB;QAAE,GAAGJ,UAAUL,MAAM,CAACE,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMQ,gBAAgB;QAAE,GAAGL,UAAUL,MAAM,CAACM,SAAS;QAAE,GAAGA,SAAS;IAAC;IACpE,MAAMH,gBAAgB,IAAIQ,IAAIN,UAAUL,MAAM,CAACG,aAAa;IAC5D,KAAK,MAAMS,QAAQL,SAAU;QAC3B,OAAOE,aAAa,CAACG,KAAK;QAC1B,OAAOF,aAAa,CAACE,KAAK;QAC1BT,cAAcU,MAAM,CAACD;IACvB;IACA,OAAOb,cAAc;QACnB,GAAGM,UAAUL,MAAM;QACnBQ;QACAN,WAAWO;QACXH,WAAWI;QACXP,eAAe;eAAIA;SAAc,CAACW,IAAI;IACxC;AACF;AAEA,OAAO,SAASC,UAAUV,SAAyB,EAAEW,KAA6B;IAChF,MAAMC,UAAUC,OAAOC,MAAM,CAACH,MAAMI,GAAG,CAACzB;IACxC,IAAIsB,QAAQI,MAAM,KAAK,GAAG;QACxB,OAAO;YACLhB;YACAW,OAAOC;YACPK,SAAS;gBACPpB,WAAWG,UAAUL,MAAM,CAACE,SAAS;gBACrCC,eAAeE,UAAUL,MAAM,CAACG,aAAa;gBAC7CG,WAAWD,UAAUL,MAAM,CAACM,SAAS;gBACrCL,YAAYI,UAAUJ,UAAU;YAClC;QACF;IACF;IACA,MAAMsB,QAAQzB,QAAQO,UAAUL,MAAM,EAAEiB;IACxC,OAAO;QACLZ;QACAW,OAAOC;QACPK,SAAS;YAAE,GAAGC,KAAK;YAAEtB,YAAYL,gBAAgB2B,MAAMrB,SAAS;QAAE;IACpE;AACF"}
|
package/dist/status.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ export type SyncStatus = {
|
|
|
2
2
|
state: 'pending' | 'syncing' | 'synced';
|
|
3
3
|
lastCompleted: string | null;
|
|
4
4
|
providerUnreachable: boolean;
|
|
5
|
+
attentionRequired: boolean;
|
|
5
6
|
};
|
|
6
7
|
export type CycleProgress = {
|
|
7
8
|
complete: boolean;
|
|
@@ -9,7 +10,7 @@ export type CycleProgress = {
|
|
|
9
10
|
};
|
|
10
11
|
export declare const STARTING: SyncStatus;
|
|
11
12
|
export declare function transferring(status: SyncStatus): SyncStatus;
|
|
12
|
-
export declare function settled(status: SyncStatus, progress: CycleProgress, at: string, queued: boolean): SyncStatus;
|
|
13
|
+
export declare function settled(status: SyncStatus, progress: CycleProgress, at: string, queued: boolean, attentionRequired: boolean): SyncStatus;
|
|
13
14
|
export declare function saving(status: SyncStatus): SyncStatus;
|
|
14
15
|
export declare function same(one: SyncStatus, other: SyncStatus): boolean;
|
|
15
16
|
//# sourceMappingURL=status.d.ts.map
|
package/dist/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAKtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,OAAO,CACrB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,EACf,iBAAiB,EAAE,OAAO,GACzB,UAAU,CAOZ;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAOhE"}
|
package/dist/status.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export const STARTING = {
|
|
2
2
|
state: 'syncing',
|
|
3
3
|
lastCompleted: null,
|
|
4
|
-
providerUnreachable: false
|
|
4
|
+
providerUnreachable: false,
|
|
5
|
+
attentionRequired: false
|
|
5
6
|
};
|
|
6
7
|
export function transferring(status) {
|
|
7
8
|
return {
|
|
@@ -9,11 +10,12 @@ export function transferring(status) {
|
|
|
9
10
|
state: 'syncing'
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
|
-
export function settled(status, progress, at, queued) {
|
|
13
|
+
export function settled(status, progress, at, queued, attentionRequired) {
|
|
13
14
|
return {
|
|
14
15
|
state: queued ? 'pending' : progress.complete ? 'synced' : status.state,
|
|
15
16
|
lastCompleted: progress.complete ? at : status.lastCompleted,
|
|
16
|
-
providerUnreachable: !progress.reachable
|
|
17
|
+
providerUnreachable: !progress.reachable,
|
|
18
|
+
attentionRequired
|
|
17
19
|
};
|
|
18
20
|
}
|
|
19
21
|
export function saving(status) {
|
|
@@ -23,7 +25,7 @@ export function saving(status) {
|
|
|
23
25
|
};
|
|
24
26
|
}
|
|
25
27
|
export function same(one, other) {
|
|
26
|
-
return one.state === other.state && one.lastCompleted === other.lastCompleted && one.providerUnreachable === other.providerUnreachable;
|
|
28
|
+
return one.state === other.state && one.lastCompleted === other.lastCompleted && one.providerUnreachable === other.providerUnreachable && one.attentionRequired === other.attentionRequired;
|
|
27
29
|
}
|
|
28
30
|
|
|
29
31
|
//# sourceMappingURL=status.js.map
|
package/dist/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/status.ts"],"sourcesContent":["export type SyncStatus = {\n state: 'pending' | 'syncing' | 'synced';\n lastCompleted: string | null;\n providerUnreachable: boolean;\n};\n\nexport type CycleProgress = {\n complete: boolean;\n reachable: boolean;\n};\n\nexport const STARTING: SyncStatus = {\n state: 'syncing',\n lastCompleted: null,\n providerUnreachable: false,\n};\n\nexport function transferring(status: SyncStatus): SyncStatus {\n return { ...status, state: 'syncing' };\n}\n\nexport function settled(\n status: SyncStatus,\n progress: CycleProgress,\n at: string,\n queued: boolean,\n): SyncStatus {\n return {\n state: queued ? 'pending' : progress.complete ? 'synced' : status.state,\n lastCompleted: progress.complete ? at : status.lastCompleted,\n providerUnreachable: !progress.reachable,\n };\n}\n\nexport function saving(status: SyncStatus): SyncStatus {\n return { ...status, state: 'pending' };\n}\n\nexport function same(one: SyncStatus, other: SyncStatus): boolean {\n return (\n one.state === other.state &&\n one.lastCompleted === other.lastCompleted &&\n one.providerUnreachable === other.providerUnreachable\n );\n}\n"],"names":["STARTING","state","lastCompleted","providerUnreachable","transferring","status","settled","progress","at","queued","complete","reachable","saving","same","one","other"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/status.ts"],"sourcesContent":["export type SyncStatus = {\n state: 'pending' | 'syncing' | 'synced';\n lastCompleted: string | null;\n providerUnreachable: boolean;\n attentionRequired: boolean;\n};\n\nexport type CycleProgress = {\n complete: boolean;\n reachable: boolean;\n};\n\nexport const STARTING: SyncStatus = {\n state: 'syncing',\n lastCompleted: null,\n providerUnreachable: false,\n attentionRequired: false,\n};\n\nexport function transferring(status: SyncStatus): SyncStatus {\n return { ...status, state: 'syncing' };\n}\n\nexport function settled(\n status: SyncStatus,\n progress: CycleProgress,\n at: string,\n queued: boolean,\n attentionRequired: boolean,\n): SyncStatus {\n return {\n state: queued ? 'pending' : progress.complete ? 'synced' : status.state,\n lastCompleted: progress.complete ? at : status.lastCompleted,\n providerUnreachable: !progress.reachable,\n attentionRequired,\n };\n}\n\nexport function saving(status: SyncStatus): SyncStatus {\n return { ...status, state: 'pending' };\n}\n\nexport function same(one: SyncStatus, other: SyncStatus): boolean {\n return (\n one.state === other.state &&\n one.lastCompleted === other.lastCompleted &&\n one.providerUnreachable === other.providerUnreachable &&\n one.attentionRequired === other.attentionRequired\n );\n}\n"],"names":["STARTING","state","lastCompleted","providerUnreachable","attentionRequired","transferring","status","settled","progress","at","queued","complete","reachable","saving","same","one","other"],"mappings":"AAYA,OAAO,MAAMA,WAAuB;IAClCC,OAAO;IACPC,eAAe;IACfC,qBAAqB;IACrBC,mBAAmB;AACrB,EAAE;AAEF,OAAO,SAASC,aAAaC,MAAkB;IAC7C,OAAO;QAAE,GAAGA,MAAM;QAAEL,OAAO;IAAU;AACvC;AAEA,OAAO,SAASM,QACdD,MAAkB,EAClBE,QAAuB,EACvBC,EAAU,EACVC,MAAe,EACfN,iBAA0B;IAE1B,OAAO;QACLH,OAAOS,SAAS,YAAYF,SAASG,QAAQ,GAAG,WAAWL,OAAOL,KAAK;QACvEC,eAAeM,SAASG,QAAQ,GAAGF,KAAKH,OAAOJ,aAAa;QAC5DC,qBAAqB,CAACK,SAASI,SAAS;QACxCR;IACF;AACF;AAEA,OAAO,SAASS,OAAOP,MAAkB;IACvC,OAAO;QAAE,GAAGA,MAAM;QAAEL,OAAO;IAAU;AACvC;AAEA,OAAO,SAASa,KAAKC,GAAe,EAAEC,KAAiB;IACrD,OACED,IAAId,KAAK,KAAKe,MAAMf,KAAK,IACzBc,IAAIb,aAAa,KAAKc,MAAMd,aAAa,IACzCa,IAAIZ,mBAAmB,KAAKa,MAAMb,mBAAmB,IACrDY,IAAIX,iBAAiB,KAAKY,MAAMZ,iBAAiB;AAErD"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ProviderLimit } from './adapter.js';
|
|
2
2
|
import type { ChangeBatch } from './change.js';
|
|
3
|
+
import type { QueueOutcome } from './outcome.js';
|
|
3
4
|
export type ReplicaRecord = {
|
|
4
5
|
locator: string;
|
|
5
6
|
name: string;
|
|
@@ -13,6 +14,7 @@ export type ReplicaRecord = {
|
|
|
13
14
|
export type QueueRecord = {
|
|
14
15
|
locator: string;
|
|
15
16
|
batches: readonly ChangeBatch[];
|
|
17
|
+
outcomes: Readonly<Record<string, QueueOutcome>>;
|
|
16
18
|
};
|
|
17
19
|
export type DraftRecord = {
|
|
18
20
|
locator: string;
|
|
@@ -31,6 +33,9 @@ export type ReplicaStore = {
|
|
|
31
33
|
keep(draft: DraftRecord): Promise<void>;
|
|
32
34
|
discard(locator: string, path: string): Promise<void>;
|
|
33
35
|
append(queue: QueueRecord, consumed: readonly string[]): Promise<void>;
|
|
36
|
+
writeQueue(queue: QueueRecord): Promise<void>;
|
|
37
|
+
generation(): Promise<string | null>;
|
|
38
|
+
rememberGeneration(value: string): Promise<void>;
|
|
34
39
|
close(): void;
|
|
35
40
|
};
|
|
36
41
|
export declare function openReplicaStore(): Promise<ReplicaStore>;
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAajD,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,cAAc,IAAI,OAAO,CAAC,SAAS,aAAa,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,OAAO,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACrC,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAiBF,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC,CA6F9D"}
|
package/dist/store.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { requestPersistentStorage } from './durability.js';
|
|
1
2
|
const DATABASE = 'mdruntime';
|
|
2
3
|
const REPLICAS = 'replicas';
|
|
3
4
|
const SYNCHRONIZATION = 'synchronization';
|
|
@@ -5,8 +6,9 @@ const DISCOVERY = 'discovery';
|
|
|
5
6
|
const QUEUES = 'queues';
|
|
6
7
|
const DRAFTS = 'drafts';
|
|
7
8
|
const LAST_COMPLETED = 'lastCompleted';
|
|
9
|
+
const GENERATION = 'generation';
|
|
8
10
|
const PROVIDER_LIMITS = 'providerLimits';
|
|
9
|
-
const SCHEMA =
|
|
11
|
+
const SCHEMA = 4;
|
|
10
12
|
function settled(request) {
|
|
11
13
|
return new Promise((resolve, reject)=>{
|
|
12
14
|
request.onsuccess = ()=>resolve(request.result);
|
|
@@ -21,6 +23,7 @@ function completed(transaction) {
|
|
|
21
23
|
});
|
|
22
24
|
}
|
|
23
25
|
export async function openReplicaStore() {
|
|
26
|
+
await requestPersistentStorage();
|
|
24
27
|
const opening = indexedDB.open(DATABASE, SCHEMA);
|
|
25
28
|
opening.onupgradeneeded = ()=>{
|
|
26
29
|
const database = opening.result;
|
|
@@ -107,6 +110,21 @@ export async function openReplicaStore() {
|
|
|
107
110
|
]);
|
|
108
111
|
await completed(transaction);
|
|
109
112
|
},
|
|
113
|
+
async writeQueue (queue) {
|
|
114
|
+
const transaction = database.transaction(QUEUES, 'readwrite');
|
|
115
|
+
transaction.objectStore(QUEUES).put(queue);
|
|
116
|
+
await completed(transaction);
|
|
117
|
+
},
|
|
118
|
+
async generation () {
|
|
119
|
+
const transaction = database.transaction(SYNCHRONIZATION, 'readonly');
|
|
120
|
+
const value = await settled(transaction.objectStore(SYNCHRONIZATION).get(GENERATION));
|
|
121
|
+
return value ?? null;
|
|
122
|
+
},
|
|
123
|
+
async rememberGeneration (value) {
|
|
124
|
+
const transaction = database.transaction(SYNCHRONIZATION, 'readwrite');
|
|
125
|
+
transaction.objectStore(SYNCHRONIZATION).put(value, GENERATION);
|
|
126
|
+
await completed(transaction);
|
|
127
|
+
},
|
|
110
128
|
close () {
|
|
111
129
|
database.close();
|
|
112
130
|
}
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/workspace/packages/mdruntime/src/store.ts"],"sourcesContent":["import type { ProviderLimit } from './adapter.js';\nimport type { ChangeBatch } from './change.js';\n\nconst DATABASE = 'mdruntime';\nconst REPLICAS = 'replicas';\nconst SYNCHRONIZATION = 'synchronization';\nconst DISCOVERY = 'discovery';\nconst QUEUES = 'queues';\nconst DRAFTS = 'drafts';\nconst LAST_COMPLETED = 'lastCompleted';\nconst PROVIDER_LIMITS = 'providerLimits';\nconst SCHEMA = 3;\n\nexport type ReplicaRecord = {\n locator: string;\n name: string;\n writeGrants: readonly string[];\n providerOwnedPaths: readonly string[];\n roomVersion: string;\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n};\n\nexport type QueueRecord = {\n locator: string;\n batches: readonly ChangeBatch[];\n};\n\nexport type DraftRecord = {\n locator: string;\n path: string;\n content: unknown;\n};\n\nexport type ReplicaStore = {\n all(): Promise<readonly ReplicaRecord[]>;\n publish(record: ReplicaRecord): Promise<void>;\n lastCompleted(): Promise<string | null>;\n complete(at: string): Promise<void>;\n providerLimits(): Promise<readonly ProviderLimit[]>;\n declare(limits: readonly ProviderLimit[]): Promise<void>;\n queues(): Promise<readonly QueueRecord[]>;\n drafts(): Promise<readonly DraftRecord[]>;\n keep(draft: DraftRecord): Promise<void>;\n discard(locator: string, path: string): Promise<void>;\n append(queue: QueueRecord, consumed: readonly string[]): Promise<void>;\n close(): void;\n};\n\nfunction settled<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction completed(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n}\n\nexport async function openReplicaStore(): Promise<ReplicaStore> {\n const opening = indexedDB.open(DATABASE, SCHEMA);\n opening.onupgradeneeded = () => {\n const database = opening.result;\n for (const name of [...database.objectStoreNames]) database.deleteObjectStore(name);\n database.createObjectStore(REPLICAS, { keyPath: 'locator' });\n database.createObjectStore(SYNCHRONIZATION);\n database.createObjectStore(DISCOVERY);\n database.createObjectStore(QUEUES, { keyPath: 'locator' });\n database.createObjectStore(DRAFTS, { keyPath: ['locator', 'path'] });\n };\n const database = await settled(opening);\n return {\n async all() {\n const transaction = database.transaction(REPLICAS, 'readonly');\n return settled<ReplicaRecord[]>(transaction.objectStore(REPLICAS).getAll());\n },\n async publish(record) {\n const transaction = database.transaction(REPLICAS, 'readwrite');\n transaction.objectStore(REPLICAS).put(record);\n await completed(transaction);\n },\n async lastCompleted() {\n const transaction = database.transaction(SYNCHRONIZATION, 'readonly');\n const value = await settled<string | undefined>(\n transaction.objectStore(SYNCHRONIZATION).get(LAST_COMPLETED),\n );\n return value ?? null;\n },\n async complete(at) {\n const transaction = database.transaction(SYNCHRONIZATION, 'readwrite');\n transaction.objectStore(SYNCHRONIZATION).put(at, LAST_COMPLETED);\n await completed(transaction);\n },\n async providerLimits() {\n const transaction = database.transaction(DISCOVERY, 'readonly');\n const value = await settled<readonly ProviderLimit[] | undefined>(\n transaction.objectStore(DISCOVERY).get(PROVIDER_LIMITS),\n );\n return value ?? [];\n },\n async declare(limits) {\n const transaction = database.transaction(DISCOVERY, 'readwrite');\n transaction.objectStore(DISCOVERY).put(limits, PROVIDER_LIMITS);\n await completed(transaction);\n },\n async queues() {\n const transaction = database.transaction(QUEUES, 'readonly');\n return settled<QueueRecord[]>(transaction.objectStore(QUEUES).getAll());\n },\n async drafts() {\n const transaction = database.transaction(DRAFTS, 'readonly');\n return settled<DraftRecord[]>(transaction.objectStore(DRAFTS).getAll());\n },\n async keep(draft) {\n const transaction = database.transaction(DRAFTS, 'readwrite');\n transaction.objectStore(DRAFTS).put(draft);\n await completed(transaction);\n },\n async discard(locator, path) {\n const transaction = database.transaction(DRAFTS, 'readwrite');\n transaction.objectStore(DRAFTS).delete([locator, path]);\n await completed(transaction);\n },\n async append(queue, consumed) {\n const transaction = database.transaction([QUEUES, DRAFTS], 'readwrite');\n transaction.objectStore(QUEUES).put(queue);\n const drafts = transaction.objectStore(DRAFTS);\n for (const path of consumed) drafts.delete([queue.locator, path]);\n await completed(transaction);\n },\n close() {\n database.close();\n },\n };\n}\n"],"names":["DATABASE","REPLICAS","SYNCHRONIZATION","DISCOVERY","QUEUES","DRAFTS","LAST_COMPLETED","PROVIDER_LIMITS","SCHEMA","settled","request","Promise","resolve","reject","onsuccess","result","onerror","error","completed","transaction","oncomplete","onabort","openReplicaStore","opening","indexedDB","open","onupgradeneeded","database","name","objectStoreNames","deleteObjectStore","createObjectStore","keyPath","all","objectStore","getAll","publish","record","put","lastCompleted","value","get","complete","at","providerLimits","declare","limits","queues","drafts","keep","draft","discard","locator","path","delete","append","queue","consumed","close"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime/src/store.ts"],"sourcesContent":["import type { ProviderLimit } from './adapter.js';\nimport type { ChangeBatch } from './change.js';\nimport { requestPersistentStorage } from './durability.js';\nimport type { QueueOutcome } from './outcome.js';\n\nconst DATABASE = 'mdruntime';\nconst REPLICAS = 'replicas';\nconst SYNCHRONIZATION = 'synchronization';\nconst DISCOVERY = 'discovery';\nconst QUEUES = 'queues';\nconst DRAFTS = 'drafts';\nconst LAST_COMPLETED = 'lastCompleted';\nconst GENERATION = 'generation';\nconst PROVIDER_LIMITS = 'providerLimits';\nconst SCHEMA = 4;\n\nexport type ReplicaRecord = {\n locator: string;\n name: string;\n writeGrants: readonly string[];\n providerOwnedPaths: readonly string[];\n roomVersion: string;\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n};\n\nexport type QueueRecord = {\n locator: string;\n batches: readonly ChangeBatch[];\n outcomes: Readonly<Record<string, QueueOutcome>>;\n};\n\nexport type DraftRecord = {\n locator: string;\n path: string;\n content: unknown;\n};\n\nexport type ReplicaStore = {\n all(): Promise<readonly ReplicaRecord[]>;\n publish(record: ReplicaRecord): Promise<void>;\n lastCompleted(): Promise<string | null>;\n complete(at: string): Promise<void>;\n providerLimits(): Promise<readonly ProviderLimit[]>;\n declare(limits: readonly ProviderLimit[]): Promise<void>;\n queues(): Promise<readonly QueueRecord[]>;\n drafts(): Promise<readonly DraftRecord[]>;\n keep(draft: DraftRecord): Promise<void>;\n discard(locator: string, path: string): Promise<void>;\n append(queue: QueueRecord, consumed: readonly string[]): Promise<void>;\n writeQueue(queue: QueueRecord): Promise<void>;\n generation(): Promise<string | null>;\n rememberGeneration(value: string): Promise<void>;\n close(): void;\n};\n\nfunction settled<T>(request: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n}\n\nfunction completed(transaction: IDBTransaction): Promise<void> {\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n}\n\nexport async function openReplicaStore(): Promise<ReplicaStore> {\n await requestPersistentStorage();\n const opening = indexedDB.open(DATABASE, SCHEMA);\n opening.onupgradeneeded = () => {\n const database = opening.result;\n for (const name of [...database.objectStoreNames]) database.deleteObjectStore(name);\n database.createObjectStore(REPLICAS, { keyPath: 'locator' });\n database.createObjectStore(SYNCHRONIZATION);\n database.createObjectStore(DISCOVERY);\n database.createObjectStore(QUEUES, { keyPath: 'locator' });\n database.createObjectStore(DRAFTS, { keyPath: ['locator', 'path'] });\n };\n const database = await settled(opening);\n return {\n async all() {\n const transaction = database.transaction(REPLICAS, 'readonly');\n return settled<ReplicaRecord[]>(transaction.objectStore(REPLICAS).getAll());\n },\n async publish(record) {\n const transaction = database.transaction(REPLICAS, 'readwrite');\n transaction.objectStore(REPLICAS).put(record);\n await completed(transaction);\n },\n async lastCompleted() {\n const transaction = database.transaction(SYNCHRONIZATION, 'readonly');\n const value = await settled<string | undefined>(\n transaction.objectStore(SYNCHRONIZATION).get(LAST_COMPLETED),\n );\n return value ?? null;\n },\n async complete(at) {\n const transaction = database.transaction(SYNCHRONIZATION, 'readwrite');\n transaction.objectStore(SYNCHRONIZATION).put(at, LAST_COMPLETED);\n await completed(transaction);\n },\n async providerLimits() {\n const transaction = database.transaction(DISCOVERY, 'readonly');\n const value = await settled<readonly ProviderLimit[] | undefined>(\n transaction.objectStore(DISCOVERY).get(PROVIDER_LIMITS),\n );\n return value ?? [];\n },\n async declare(limits) {\n const transaction = database.transaction(DISCOVERY, 'readwrite');\n transaction.objectStore(DISCOVERY).put(limits, PROVIDER_LIMITS);\n await completed(transaction);\n },\n async queues() {\n const transaction = database.transaction(QUEUES, 'readonly');\n return settled<QueueRecord[]>(transaction.objectStore(QUEUES).getAll());\n },\n async drafts() {\n const transaction = database.transaction(DRAFTS, 'readonly');\n return settled<DraftRecord[]>(transaction.objectStore(DRAFTS).getAll());\n },\n async keep(draft) {\n const transaction = database.transaction(DRAFTS, 'readwrite');\n transaction.objectStore(DRAFTS).put(draft);\n await completed(transaction);\n },\n async discard(locator, path) {\n const transaction = database.transaction(DRAFTS, 'readwrite');\n transaction.objectStore(DRAFTS).delete([locator, path]);\n await completed(transaction);\n },\n async append(queue, consumed) {\n const transaction = database.transaction([QUEUES, DRAFTS], 'readwrite');\n transaction.objectStore(QUEUES).put(queue);\n const drafts = transaction.objectStore(DRAFTS);\n for (const path of consumed) drafts.delete([queue.locator, path]);\n await completed(transaction);\n },\n async writeQueue(queue) {\n const transaction = database.transaction(QUEUES, 'readwrite');\n transaction.objectStore(QUEUES).put(queue);\n await completed(transaction);\n },\n async generation() {\n const transaction = database.transaction(SYNCHRONIZATION, 'readonly');\n const value = await settled<string | undefined>(\n transaction.objectStore(SYNCHRONIZATION).get(GENERATION),\n );\n return value ?? null;\n },\n async rememberGeneration(value) {\n const transaction = database.transaction(SYNCHRONIZATION, 'readwrite');\n transaction.objectStore(SYNCHRONIZATION).put(value, GENERATION);\n await completed(transaction);\n },\n close() {\n database.close();\n },\n };\n}\n"],"names":["requestPersistentStorage","DATABASE","REPLICAS","SYNCHRONIZATION","DISCOVERY","QUEUES","DRAFTS","LAST_COMPLETED","GENERATION","PROVIDER_LIMITS","SCHEMA","settled","request","Promise","resolve","reject","onsuccess","result","onerror","error","completed","transaction","oncomplete","onabort","openReplicaStore","opening","indexedDB","open","onupgradeneeded","database","name","objectStoreNames","deleteObjectStore","createObjectStore","keyPath","all","objectStore","getAll","publish","record","put","lastCompleted","value","get","complete","at","providerLimits","declare","limits","queues","drafts","keep","draft","discard","locator","path","delete","append","queue","consumed","writeQueue","generation","rememberGeneration","close"],"mappings":"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"}
|