@powerhousedao/reactor 5.0.1-staging.14 → 5.0.1-staging.16
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/src/client/reactor-client.d.ts +4 -2
- package/dist/src/client/reactor-client.d.ts.map +1 -1
- package/dist/src/client/reactor-client.js +112 -31
- package/dist/src/client/reactor-client.js.map +1 -1
- package/dist/src/core/builder.d.ts +15 -2
- package/dist/src/core/builder.d.ts.map +1 -1
- package/dist/src/core/builder.js +48 -7
- package/dist/src/core/builder.js.map +1 -1
- package/dist/src/core/reactor-builder.d.ts +8 -0
- package/dist/src/core/reactor-builder.d.ts.map +1 -1
- package/dist/src/core/reactor-builder.js +26 -7
- package/dist/src/core/reactor-builder.js.map +1 -1
- package/dist/src/core/reactor.d.ts +12 -1
- package/dist/src/core/reactor.d.ts.map +1 -1
- package/dist/src/core/reactor.js +94 -92
- package/dist/src/core/reactor.js.map +1 -1
- package/dist/src/core/types.d.ts +20 -0
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/utils.d.ts +0 -4
- package/dist/src/core/utils.d.ts.map +1 -1
- package/dist/src/core/utils.js +0 -9
- package/dist/src/core/utils.js.map +1 -1
- package/dist/src/events/types.d.ts +28 -0
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +2 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.js +19 -3
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -1
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor.js +21 -7
- package/dist/src/executor/simple-job-executor.js.map +1 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts +11 -2
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.js +54 -26
- package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -1
- package/dist/src/job-tracker/interfaces.d.ts +6 -9
- package/dist/src/job-tracker/interfaces.d.ts.map +1 -1
- package/dist/src/read-models/coordinator.d.ts.map +1 -1
- package/dist/src/read-models/coordinator.js +11 -0
- package/dist/src/read-models/coordinator.js.map +1 -1
- package/dist/src/read-models/document-view.d.ts +1 -0
- package/dist/src/read-models/document-view.d.ts.map +1 -1
- package/dist/src/read-models/document-view.js +40 -0
- package/dist/src/read-models/document-view.js.map +1 -1
- package/dist/src/shared/awaiter.d.ts +11 -8
- package/dist/src/shared/awaiter.d.ts.map +1 -1
- package/dist/src/shared/awaiter.js +66 -75
- package/dist/src/shared/awaiter.js.map +1 -1
- package/dist/src/shared/types.d.ts +4 -2
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js +4 -2
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/storage/index.d.ts +4 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +3 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +79 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -1
- package/dist/src/storage/interfaces.js.map +1 -1
- package/dist/src/storage/kysely/sync-cursor-storage.d.ts +13 -0
- package/dist/src/storage/kysely/sync-cursor-storage.d.ts.map +1 -0
- package/dist/src/storage/kysely/sync-cursor-storage.js +93 -0
- package/dist/src/storage/kysely/sync-cursor-storage.js.map +1 -0
- package/dist/src/storage/kysely/sync-remote-storage.d.ts +13 -0
- package/dist/src/storage/kysely/sync-remote-storage.d.ts.map +1 -0
- package/dist/src/storage/kysely/sync-remote-storage.js +134 -0
- package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -0
- package/dist/src/storage/kysely/types.d.ts +35 -0
- package/dist/src/storage/kysely/types.d.ts.map +1 -1
- package/dist/src/storage/migrations/010_create_sync_tables.d.ts +3 -0
- package/dist/src/storage/migrations/010_create_sync_tables.d.ts.map +1 -0
- package/dist/src/storage/migrations/010_create_sync_tables.js +43 -0
- package/dist/src/storage/migrations/010_create_sync_tables.js.map +1 -0
- package/dist/src/storage/migrations/migrator.d.ts.map +1 -1
- package/dist/src/storage/migrations/migrator.js +2 -0
- package/dist/src/storage/migrations/migrator.js.map +1 -1
- package/dist/src/sync/channels/index.d.ts +3 -0
- package/dist/src/sync/channels/index.d.ts.map +1 -0
- package/dist/src/sync/channels/index.js +3 -0
- package/dist/src/sync/channels/index.js.map +1 -0
- package/dist/src/sync/channels/internal-channel.d.ts +57 -0
- package/dist/src/sync/channels/internal-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/internal-channel.js +106 -0
- package/dist/src/sync/channels/internal-channel.js.map +1 -0
- package/dist/src/sync/channels/utils.d.ts +15 -0
- package/dist/src/sync/channels/utils.d.ts.map +1 -0
- package/dist/src/sync/channels/utils.js +26 -0
- package/dist/src/sync/channels/utils.js.map +1 -0
- package/dist/src/sync/errors.d.ts +10 -0
- package/dist/src/sync/errors.d.ts.map +1 -0
- package/dist/src/sync/errors.js +17 -0
- package/dist/src/sync/errors.js.map +1 -0
- package/dist/src/sync/index.d.ts +12 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +9 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/interfaces.d.ts +150 -0
- package/dist/src/sync/interfaces.d.ts.map +1 -0
- package/dist/src/sync/interfaces.js +2 -0
- package/dist/src/sync/interfaces.js.map +1 -0
- package/dist/src/sync/mailbox.d.ts +21 -0
- package/dist/src/sync/mailbox.d.ts.map +1 -0
- package/dist/src/sync/mailbox.js +59 -0
- package/dist/src/sync/mailbox.js.map +1 -0
- package/dist/src/sync/sync-builder.d.ts +17 -0
- package/dist/src/sync/sync-builder.d.ts.map +1 -0
- package/dist/src/sync/sync-builder.js +29 -0
- package/dist/src/sync/sync-builder.js.map +1 -0
- package/dist/src/sync/sync-manager.d.ts +33 -0
- package/dist/src/sync/sync-manager.d.ts.map +1 -0
- package/dist/src/sync/sync-manager.js +197 -0
- package/dist/src/sync/sync-manager.js.map +1 -0
- package/dist/src/sync/sync-operation.d.ts +28 -0
- package/dist/src/sync/sync-operation.d.ts.map +1 -0
- package/dist/src/sync/sync-operation.js +63 -0
- package/dist/src/sync/sync-operation.js.map +1 -0
- package/dist/src/sync/types.d.ts +61 -0
- package/dist/src/sync/types.d.ts.map +1 -0
- package/dist/src/sync/types.js +16 -0
- package/dist/src/sync/types.js.map +1 -0
- package/dist/src/sync/utils.d.ts +17 -0
- package/dist/src/sync/utils.d.ts.map +1 -0
- package/dist/src/sync/utils.js +34 -0
- package/dist/src/sync/utils.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
function rowToRemoteCursor(row) {
|
|
3
|
+
return {
|
|
4
|
+
remoteName: row.remote_name,
|
|
5
|
+
cursorOrdinal: Number(row.cursor_ordinal),
|
|
6
|
+
lastSyncedAtUtcMs: row.last_synced_at_utc_ms
|
|
7
|
+
? Number(row.last_synced_at_utc_ms)
|
|
8
|
+
: undefined,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function remoteCursorToRow(cursor) {
|
|
12
|
+
return {
|
|
13
|
+
remote_name: cursor.remoteName,
|
|
14
|
+
cursor_ordinal: BigInt(cursor.cursorOrdinal),
|
|
15
|
+
last_synced_at_utc_ms: cursor.lastSyncedAtUtcMs
|
|
16
|
+
? BigInt(cursor.lastSyncedAtUtcMs)
|
|
17
|
+
: null,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export class KyselySyncCursorStorage {
|
|
21
|
+
db;
|
|
22
|
+
constructor(db) {
|
|
23
|
+
this.db = db;
|
|
24
|
+
}
|
|
25
|
+
async list(remoteName, signal) {
|
|
26
|
+
if (signal?.aborted) {
|
|
27
|
+
throw new Error("Operation aborted");
|
|
28
|
+
}
|
|
29
|
+
const rows = await this.db
|
|
30
|
+
.selectFrom("sync_cursors")
|
|
31
|
+
.selectAll()
|
|
32
|
+
.where("remote_name", "=", remoteName)
|
|
33
|
+
.execute();
|
|
34
|
+
if (signal?.aborted) {
|
|
35
|
+
throw new Error("Operation aborted");
|
|
36
|
+
}
|
|
37
|
+
return rows.map(rowToRemoteCursor);
|
|
38
|
+
}
|
|
39
|
+
async get(remoteName, signal) {
|
|
40
|
+
if (signal?.aborted) {
|
|
41
|
+
throw new Error("Operation aborted");
|
|
42
|
+
}
|
|
43
|
+
const row = await this.db
|
|
44
|
+
.selectFrom("sync_cursors")
|
|
45
|
+
.selectAll()
|
|
46
|
+
.where("remote_name", "=", remoteName)
|
|
47
|
+
.executeTakeFirst();
|
|
48
|
+
if (signal?.aborted) {
|
|
49
|
+
throw new Error("Operation aborted");
|
|
50
|
+
}
|
|
51
|
+
if (!row) {
|
|
52
|
+
return {
|
|
53
|
+
remoteName,
|
|
54
|
+
cursorOrdinal: 0,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return rowToRemoteCursor(row);
|
|
58
|
+
}
|
|
59
|
+
async upsert(cursor, signal) {
|
|
60
|
+
if (signal?.aborted) {
|
|
61
|
+
throw new Error("Operation aborted");
|
|
62
|
+
}
|
|
63
|
+
await this.db.transaction().execute(async (trx) => {
|
|
64
|
+
const insertable = remoteCursorToRow(cursor);
|
|
65
|
+
await trx
|
|
66
|
+
.insertInto("sync_cursors")
|
|
67
|
+
.values(insertable)
|
|
68
|
+
.onConflict((oc) => oc.column("remote_name").doUpdateSet({
|
|
69
|
+
...insertable,
|
|
70
|
+
updated_at: sql `NOW()`,
|
|
71
|
+
}))
|
|
72
|
+
.execute();
|
|
73
|
+
});
|
|
74
|
+
if (signal?.aborted) {
|
|
75
|
+
throw new Error("Operation aborted");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
async remove(remoteName, signal) {
|
|
79
|
+
if (signal?.aborted) {
|
|
80
|
+
throw new Error("Operation aborted");
|
|
81
|
+
}
|
|
82
|
+
await this.db.transaction().execute(async (trx) => {
|
|
83
|
+
await trx
|
|
84
|
+
.deleteFrom("sync_cursors")
|
|
85
|
+
.where("remote_name", "=", remoteName)
|
|
86
|
+
.execute();
|
|
87
|
+
});
|
|
88
|
+
if (signal?.aborted) {
|
|
89
|
+
throw new Error("Operation aborted");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=sync-cursor-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-cursor-storage.js","sourceRoot":"","sources":["../../../../src/storage/kysely/sync-cursor-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type { RemoteRecord } from "../../sync/types.js";
|
|
3
|
+
import type { ISyncRemoteStorage } from "../interfaces.js";
|
|
4
|
+
import type { Database } from "./types.js";
|
|
5
|
+
export declare class KyselySyncRemoteStorage implements ISyncRemoteStorage {
|
|
6
|
+
private readonly db;
|
|
7
|
+
constructor(db: Kysely<Database>);
|
|
8
|
+
list(signal?: AbortSignal): Promise<RemoteRecord[]>;
|
|
9
|
+
get(name: string, signal?: AbortSignal): Promise<RemoteRecord>;
|
|
10
|
+
upsert(remote: RemoteRecord, signal?: AbortSignal): Promise<void>;
|
|
11
|
+
remove(name: string, signal?: AbortSignal): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=sync-remote-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-remote-storage.d.ts","sourceRoot":"","sources":["../../../../src/storage/kysely/sync-remote-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAuC,MAAM,YAAY,CAAC;AA0EhF,qBAAa,uBAAwB,YAAW,kBAAkB;IACpD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAcnD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsB9D,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBjE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAahE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
function rowToRemoteRecord(row) {
|
|
3
|
+
return {
|
|
4
|
+
name: row.name,
|
|
5
|
+
collectionId: row.collection_id,
|
|
6
|
+
channelConfig: {
|
|
7
|
+
type: row.channel_type,
|
|
8
|
+
channelId: row.channel_id,
|
|
9
|
+
remoteName: row.remote_name,
|
|
10
|
+
parameters: (row.channel_parameters ?? {}),
|
|
11
|
+
},
|
|
12
|
+
filter: {
|
|
13
|
+
documentId: (row.filter_document_ids ?? []),
|
|
14
|
+
scope: (row.filter_scopes ?? []),
|
|
15
|
+
branch: row.filter_branch,
|
|
16
|
+
},
|
|
17
|
+
options: {},
|
|
18
|
+
status: {
|
|
19
|
+
push: {
|
|
20
|
+
state: row.push_state,
|
|
21
|
+
lastSuccessUtcMs: row.push_last_success_utc_ms
|
|
22
|
+
? Number(row.push_last_success_utc_ms)
|
|
23
|
+
: undefined,
|
|
24
|
+
lastFailureUtcMs: row.push_last_failure_utc_ms
|
|
25
|
+
? Number(row.push_last_failure_utc_ms)
|
|
26
|
+
: undefined,
|
|
27
|
+
failureCount: row.push_failure_count,
|
|
28
|
+
},
|
|
29
|
+
pull: {
|
|
30
|
+
state: row.pull_state,
|
|
31
|
+
lastSuccessUtcMs: row.pull_last_success_utc_ms
|
|
32
|
+
? Number(row.pull_last_success_utc_ms)
|
|
33
|
+
: undefined,
|
|
34
|
+
lastFailureUtcMs: row.pull_last_failure_utc_ms
|
|
35
|
+
? Number(row.pull_last_failure_utc_ms)
|
|
36
|
+
: undefined,
|
|
37
|
+
failureCount: row.pull_failure_count,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function remoteRecordToRow(remote) {
|
|
43
|
+
return {
|
|
44
|
+
name: remote.name,
|
|
45
|
+
collection_id: remote.collectionId,
|
|
46
|
+
channel_type: remote.channelConfig.type,
|
|
47
|
+
channel_id: remote.channelConfig.channelId,
|
|
48
|
+
remote_name: remote.channelConfig.remoteName,
|
|
49
|
+
channel_parameters: remote.channelConfig.parameters,
|
|
50
|
+
filter_document_ids: remote.filter.documentId.length > 0 ? remote.filter.documentId : null,
|
|
51
|
+
filter_scopes: remote.filter.scope.length > 0 ? remote.filter.scope : null,
|
|
52
|
+
filter_branch: remote.filter.branch,
|
|
53
|
+
push_state: remote.status.push.state,
|
|
54
|
+
push_last_success_utc_ms: remote.status.push.lastSuccessUtcMs
|
|
55
|
+
? BigInt(remote.status.push.lastSuccessUtcMs)
|
|
56
|
+
: null,
|
|
57
|
+
push_last_failure_utc_ms: remote.status.push.lastFailureUtcMs
|
|
58
|
+
? BigInt(remote.status.push.lastFailureUtcMs)
|
|
59
|
+
: null,
|
|
60
|
+
push_failure_count: remote.status.push.failureCount,
|
|
61
|
+
pull_state: remote.status.pull.state,
|
|
62
|
+
pull_last_success_utc_ms: remote.status.pull.lastSuccessUtcMs
|
|
63
|
+
? BigInt(remote.status.pull.lastSuccessUtcMs)
|
|
64
|
+
: null,
|
|
65
|
+
pull_last_failure_utc_ms: remote.status.pull.lastFailureUtcMs
|
|
66
|
+
? BigInt(remote.status.pull.lastFailureUtcMs)
|
|
67
|
+
: null,
|
|
68
|
+
pull_failure_count: remote.status.pull.failureCount,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export class KyselySyncRemoteStorage {
|
|
72
|
+
db;
|
|
73
|
+
constructor(db) {
|
|
74
|
+
this.db = db;
|
|
75
|
+
}
|
|
76
|
+
async list(signal) {
|
|
77
|
+
if (signal?.aborted) {
|
|
78
|
+
throw new Error("Operation aborted");
|
|
79
|
+
}
|
|
80
|
+
const rows = await this.db.selectFrom("sync_remotes").selectAll().execute();
|
|
81
|
+
if (signal?.aborted) {
|
|
82
|
+
throw new Error("Operation aborted");
|
|
83
|
+
}
|
|
84
|
+
return rows.map(rowToRemoteRecord);
|
|
85
|
+
}
|
|
86
|
+
async get(name, signal) {
|
|
87
|
+
if (signal?.aborted) {
|
|
88
|
+
throw new Error("Operation aborted");
|
|
89
|
+
}
|
|
90
|
+
const row = await this.db
|
|
91
|
+
.selectFrom("sync_remotes")
|
|
92
|
+
.selectAll()
|
|
93
|
+
.where("name", "=", name)
|
|
94
|
+
.executeTakeFirst();
|
|
95
|
+
if (signal?.aborted) {
|
|
96
|
+
throw new Error("Operation aborted");
|
|
97
|
+
}
|
|
98
|
+
if (!row) {
|
|
99
|
+
throw new Error(`Remote not found: ${name}`);
|
|
100
|
+
}
|
|
101
|
+
return rowToRemoteRecord(row);
|
|
102
|
+
}
|
|
103
|
+
async upsert(remote, signal) {
|
|
104
|
+
if (signal?.aborted) {
|
|
105
|
+
throw new Error("Operation aborted");
|
|
106
|
+
}
|
|
107
|
+
await this.db.transaction().execute(async (trx) => {
|
|
108
|
+
const insertable = remoteRecordToRow(remote);
|
|
109
|
+
await trx
|
|
110
|
+
.insertInto("sync_remotes")
|
|
111
|
+
.values(insertable)
|
|
112
|
+
.onConflict((oc) => oc.column("name").doUpdateSet({
|
|
113
|
+
...insertable,
|
|
114
|
+
updated_at: sql `NOW()`,
|
|
115
|
+
}))
|
|
116
|
+
.execute();
|
|
117
|
+
});
|
|
118
|
+
if (signal?.aborted) {
|
|
119
|
+
throw new Error("Operation aborted");
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async remove(name, signal) {
|
|
123
|
+
if (signal?.aborted) {
|
|
124
|
+
throw new Error("Operation aborted");
|
|
125
|
+
}
|
|
126
|
+
await this.db.transaction().execute(async (trx) => {
|
|
127
|
+
await trx.deleteFrom("sync_remotes").where("name", "=", name).execute();
|
|
128
|
+
});
|
|
129
|
+
if (signal?.aborted) {
|
|
130
|
+
throw new Error("Operation aborted");
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=sync-remote-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-remote-storage.js","sourceRoot":"","sources":["../../../../src/storage/kysely/sync-remote-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,11 +46,40 @@ export interface OperationIndexOperationTable {
|
|
|
46
46
|
hash: string;
|
|
47
47
|
action: unknown;
|
|
48
48
|
}
|
|
49
|
+
export interface SyncRemoteTable {
|
|
50
|
+
name: string;
|
|
51
|
+
collection_id: string;
|
|
52
|
+
channel_type: string;
|
|
53
|
+
channel_id: string;
|
|
54
|
+
remote_name: string;
|
|
55
|
+
channel_parameters: unknown;
|
|
56
|
+
filter_document_ids: unknown;
|
|
57
|
+
filter_scopes: unknown;
|
|
58
|
+
filter_branch: string;
|
|
59
|
+
push_state: string;
|
|
60
|
+
push_last_success_utc_ms: bigint | null;
|
|
61
|
+
push_last_failure_utc_ms: bigint | null;
|
|
62
|
+
push_failure_count: number;
|
|
63
|
+
pull_state: string;
|
|
64
|
+
pull_last_success_utc_ms: bigint | null;
|
|
65
|
+
pull_last_failure_utc_ms: bigint | null;
|
|
66
|
+
pull_failure_count: number;
|
|
67
|
+
created_at: Generated<Date>;
|
|
68
|
+
updated_at: Generated<Date>;
|
|
69
|
+
}
|
|
70
|
+
export interface SyncCursorTable {
|
|
71
|
+
remote_name: string;
|
|
72
|
+
cursor_ordinal: bigint;
|
|
73
|
+
last_synced_at_utc_ms: bigint | null;
|
|
74
|
+
updated_at: Generated<Date>;
|
|
75
|
+
}
|
|
49
76
|
export interface Database {
|
|
50
77
|
Operation: OperationTable;
|
|
51
78
|
Keyframe: KeyframeTable;
|
|
52
79
|
document_collections: DocumentCollectionTable;
|
|
53
80
|
operation_index_operations: OperationIndexOperationTable;
|
|
81
|
+
sync_remotes: SyncRemoteTable;
|
|
82
|
+
sync_cursors: SyncCursorTable;
|
|
54
83
|
}
|
|
55
84
|
export type OperationRow = Selectable<OperationTable>;
|
|
56
85
|
export type InsertableOperation = Insertable<OperationTable>;
|
|
@@ -97,4 +126,10 @@ export type UpdateableDocumentCollection = Updateable<DocumentCollectionTable>;
|
|
|
97
126
|
export type OperationIndexOperationRow = Selectable<OperationIndexOperationTable>;
|
|
98
127
|
export type InsertableOperationIndexOperation = Insertable<OperationIndexOperationTable>;
|
|
99
128
|
export type UpdateableOperationIndexOperation = Updateable<OperationIndexOperationTable>;
|
|
129
|
+
export type SyncRemoteRow = Selectable<SyncRemoteTable>;
|
|
130
|
+
export type InsertableSyncRemote = Insertable<SyncRemoteTable>;
|
|
131
|
+
export type UpdateableSyncRemote = Updateable<SyncRemoteTable>;
|
|
132
|
+
export type SyncCursorRow = Selectable<SyncCursorTable>;
|
|
133
|
+
export type InsertableSyncCursor = Insertable<SyncCursorTable>;
|
|
134
|
+
export type UpdateableSyncCursor = Updateable<SyncCursorTable>;
|
|
100
135
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/storage/kysely/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,oBAAoB,EAAE,uBAAuB,CAAC;IAC9C,0BAA0B,EAAE,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/storage/kysely/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"010_create_sync_tables.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/010_create_sync_tables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAGrC,wBAAsB,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DvD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
export async function up(db) {
|
|
3
|
+
await db.schema
|
|
4
|
+
.createTable("sync_remotes")
|
|
5
|
+
.addColumn("name", "text", (col) => col.primaryKey())
|
|
6
|
+
.addColumn("collection_id", "text", (col) => col.notNull())
|
|
7
|
+
.addColumn("channel_type", "text", (col) => col.notNull())
|
|
8
|
+
.addColumn("channel_id", "text", (col) => col.notNull().defaultTo(""))
|
|
9
|
+
.addColumn("remote_name", "text", (col) => col.notNull().defaultTo(""))
|
|
10
|
+
.addColumn("channel_parameters", "jsonb", (col) => col.notNull().defaultTo(sql `'{}'::jsonb`))
|
|
11
|
+
.addColumn("filter_document_ids", "jsonb")
|
|
12
|
+
.addColumn("filter_scopes", "jsonb")
|
|
13
|
+
.addColumn("filter_branch", "text", (col) => col.notNull().defaultTo("main"))
|
|
14
|
+
.addColumn("push_state", "text", (col) => col.notNull().defaultTo("idle"))
|
|
15
|
+
.addColumn("push_last_success_utc_ms", "bigint")
|
|
16
|
+
.addColumn("push_last_failure_utc_ms", "bigint")
|
|
17
|
+
.addColumn("push_failure_count", "integer", (col) => col.notNull().defaultTo(0))
|
|
18
|
+
.addColumn("pull_state", "text", (col) => col.notNull().defaultTo("idle"))
|
|
19
|
+
.addColumn("pull_last_success_utc_ms", "bigint")
|
|
20
|
+
.addColumn("pull_last_failure_utc_ms", "bigint")
|
|
21
|
+
.addColumn("pull_failure_count", "integer", (col) => col.notNull().defaultTo(0))
|
|
22
|
+
.addColumn("created_at", "timestamptz", (col) => col.notNull().defaultTo(sql `NOW()`))
|
|
23
|
+
.addColumn("updated_at", "timestamptz", (col) => col.notNull().defaultTo(sql `NOW()`))
|
|
24
|
+
.execute();
|
|
25
|
+
await db.schema
|
|
26
|
+
.createIndex("idx_sync_remotes_collection")
|
|
27
|
+
.on("sync_remotes")
|
|
28
|
+
.column("collection_id")
|
|
29
|
+
.execute();
|
|
30
|
+
await db.schema
|
|
31
|
+
.createTable("sync_cursors")
|
|
32
|
+
.addColumn("remote_name", "text", (col) => col.primaryKey().references("sync_remotes.name").onDelete("cascade"))
|
|
33
|
+
.addColumn("cursor_ordinal", "bigint", (col) => col.notNull().defaultTo(0))
|
|
34
|
+
.addColumn("last_synced_at_utc_ms", "bigint")
|
|
35
|
+
.addColumn("updated_at", "timestamptz", (col) => col.notNull().defaultTo(sql `NOW()`))
|
|
36
|
+
.execute();
|
|
37
|
+
await db.schema
|
|
38
|
+
.createIndex("idx_sync_cursors_ordinal")
|
|
39
|
+
.on("sync_cursors")
|
|
40
|
+
.column("cursor_ordinal")
|
|
41
|
+
.execute();
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=010_create_sync_tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"010_create_sync_tables.js","sourceRoot":"","sources":["../../../../src/storage/migrations/010_create_sync_tables.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/migrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../../../src/storage/migrations/migrator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAqB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AA+BlD,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,CAwB7E;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,sDAOvD"}
|
|
@@ -8,6 +8,7 @@ import * as migration006 from "./006_create_document_snapshot_table.js";
|
|
|
8
8
|
import * as migration007 from "./007_create_slug_mapping_table.js";
|
|
9
9
|
import * as migration008 from "./008_create_view_state_table.js";
|
|
10
10
|
import * as migration009 from "./009_create_operation_index_tables.js";
|
|
11
|
+
import * as migration010 from "./010_create_sync_tables.js";
|
|
11
12
|
const migrations = {
|
|
12
13
|
"001_create_operation_table": migration001,
|
|
13
14
|
"002_create_keyframe_table": migration002,
|
|
@@ -18,6 +19,7 @@ const migrations = {
|
|
|
18
19
|
"007_create_slug_mapping_table": migration007,
|
|
19
20
|
"008_create_view_state_table": migration008,
|
|
20
21
|
"009_create_operation_index_tables": migration009,
|
|
22
|
+
"010_create_sync_tables": migration010,
|
|
21
23
|
};
|
|
22
24
|
class ProgrammaticMigrationProvider {
|
|
23
25
|
getMigrations() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../../../src/storage/migrations/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,6CAA6C,CAAC;AAC5E,OAAO,KAAK,YAAY,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,YAAY,MAAM,yCAAyC,CAAC;AACxE,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,YAAY,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,YAAY,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../../../src/storage/migrations/migrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAGlC,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,gCAAgC,CAAC;AAC/D,OAAO,KAAK,YAAY,MAAM,6CAA6C,CAAC;AAC5E,OAAO,KAAK,YAAY,MAAM,qCAAqC,CAAC;AACpE,OAAO,KAAK,YAAY,MAAM,yCAAyC,CAAC;AACxE,OAAO,KAAK,YAAY,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,YAAY,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,YAAY,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,YAAY,MAAM,6BAA6B,CAAC;AAE5D,MAAM,UAAU,GAAG;IACjB,4BAA4B,EAAE,YAAY;IAC1C,2BAA2B,EAAE,YAAY;IACzC,2BAA2B,EAAE,YAAY;IACzC,wCAAwC,EAAE,YAAY;IACtD,gCAAgC,EAAE,YAAY;IAC9C,oCAAoC,EAAE,YAAY;IAClD,+BAA+B,EAAE,YAAY;IAC7C,6BAA6B,EAAE,YAAY;IAC3C,mCAAmC,EAAE,YAAY;IACjD,wBAAwB,EAAE,YAAY;CACvC,CAAC;AAEF,MAAM,6BAA6B;IACjC,aAAa;QACX,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAe;IACjD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,EAAE;QACF,QAAQ,EAAE,IAAI,6BAA6B,EAAE;KAC9C,CAAC,CAAC;IAEH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;IAE5D,MAAM,kBAAkB,GACtB,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAEvD,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE,KAAK;YACd,kBAAkB;YAClB,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC;SACxE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,IAAI;QACb,kBAAkB;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EAAe;IACtD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC;QAC5B,EAAE;QACF,QAAQ,EAAE,IAAI,6BAA6B,EAAE;KAC9C,CAAC,CAAC;IAEH,OAAO,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/sync/channels/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { ISyncCursorStorage } from "../../storage/interfaces.js";
|
|
2
|
+
import type { IChannel } from "../interfaces.js";
|
|
3
|
+
import type { SyncOperation } from "../sync-operation.js";
|
|
4
|
+
import { Mailbox } from "../mailbox.js";
|
|
5
|
+
import type { SyncEnvelope } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* In-memory synchronization channel for testing purposes only.
|
|
8
|
+
*
|
|
9
|
+
* InternalChannel enables direct bidirectional communication between two reactor
|
|
10
|
+
* instances without network transport. Channels are wired together by passing
|
|
11
|
+
* a send function that delivers envelopes to the peer's inbox.
|
|
12
|
+
*/
|
|
13
|
+
export declare class InternalChannel implements IChannel {
|
|
14
|
+
readonly inbox: Mailbox<SyncOperation>;
|
|
15
|
+
readonly outbox: Mailbox<SyncOperation>;
|
|
16
|
+
readonly deadLetter: Mailbox<SyncOperation>;
|
|
17
|
+
private readonly channelId;
|
|
18
|
+
private readonly remoteName;
|
|
19
|
+
private readonly cursorStorage;
|
|
20
|
+
private readonly send;
|
|
21
|
+
private isShutdown;
|
|
22
|
+
constructor(channelId: string, remoteName: string, cursorStorage: ISyncCursorStorage, send: (envelope: SyncEnvelope) => void);
|
|
23
|
+
/**
|
|
24
|
+
* Shuts down the channel and prevents further operations.
|
|
25
|
+
*/
|
|
26
|
+
shutdown(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Receives a sync envelope from a peer channel.
|
|
29
|
+
*
|
|
30
|
+
* This method is called by the peer's send function to deliver an envelope
|
|
31
|
+
* to this channel's inbox.
|
|
32
|
+
*
|
|
33
|
+
* @param envelope - The sync envelope to receive
|
|
34
|
+
* @throws {InternalChannelError} If channel is shutdown
|
|
35
|
+
*/
|
|
36
|
+
receive(envelope: SyncEnvelope): void;
|
|
37
|
+
/**
|
|
38
|
+
* Updates the synchronization cursor for this channel's remote.
|
|
39
|
+
*
|
|
40
|
+
* Cursors track progress through the operation stream and enable resuming
|
|
41
|
+
* synchronization after restarts. The cursor is exclusive - the next sync
|
|
42
|
+
* will start at cursorOrdinal + 1.
|
|
43
|
+
*
|
|
44
|
+
* @param cursorOrdinal - The last processed ordinal (exclusive)
|
|
45
|
+
*/
|
|
46
|
+
updateCursor(cursorOrdinal: number): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Handles sync operations added to the outbox by sending them to the peer.
|
|
49
|
+
*
|
|
50
|
+
* This method is called automatically via the outbox.onAdded callback.
|
|
51
|
+
* It converts the sync operation to a SyncEnvelope and sends it via the send function.
|
|
52
|
+
*
|
|
53
|
+
* @param syncOp - The sync operation to transport
|
|
54
|
+
*/
|
|
55
|
+
private handleOutboxAdded;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=internal-channel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-channel.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/internal-channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAgB,YAAY,EAAE,MAAM,aAAa,CAAC;AAI9D;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAE5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,UAAU,CAAU;gBAG1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,kBAAkB,EACjC,IAAI,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI;IAiBxC;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAcrC;;;;;;;;OAQG;IACG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD;;;;;;;OAOG;IACH,OAAO,CAAC,iBAAiB;CAuB1B"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { ChannelError, InternalChannelError } from "../errors.js";
|
|
2
|
+
import { Mailbox } from "../mailbox.js";
|
|
3
|
+
import { ChannelErrorSource } from "../types.js";
|
|
4
|
+
import { envelopeToSyncOperation } from "./utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* In-memory synchronization channel for testing purposes only.
|
|
7
|
+
*
|
|
8
|
+
* InternalChannel enables direct bidirectional communication between two reactor
|
|
9
|
+
* instances without network transport. Channels are wired together by passing
|
|
10
|
+
* a send function that delivers envelopes to the peer's inbox.
|
|
11
|
+
*/
|
|
12
|
+
export class InternalChannel {
|
|
13
|
+
inbox;
|
|
14
|
+
outbox;
|
|
15
|
+
deadLetter;
|
|
16
|
+
channelId;
|
|
17
|
+
remoteName;
|
|
18
|
+
cursorStorage;
|
|
19
|
+
send;
|
|
20
|
+
isShutdown;
|
|
21
|
+
constructor(channelId, remoteName, cursorStorage, send) {
|
|
22
|
+
this.channelId = channelId;
|
|
23
|
+
this.remoteName = remoteName;
|
|
24
|
+
this.cursorStorage = cursorStorage;
|
|
25
|
+
this.send = send;
|
|
26
|
+
this.isShutdown = false;
|
|
27
|
+
this.inbox = new Mailbox();
|
|
28
|
+
this.outbox = new Mailbox();
|
|
29
|
+
this.deadLetter = new Mailbox();
|
|
30
|
+
this.outbox.onAdded((syncOp) => {
|
|
31
|
+
this.handleOutboxAdded(syncOp);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Shuts down the channel and prevents further operations.
|
|
36
|
+
*/
|
|
37
|
+
shutdown() {
|
|
38
|
+
this.isShutdown = true;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Receives a sync envelope from a peer channel.
|
|
42
|
+
*
|
|
43
|
+
* This method is called by the peer's send function to deliver an envelope
|
|
44
|
+
* to this channel's inbox.
|
|
45
|
+
*
|
|
46
|
+
* @param envelope - The sync envelope to receive
|
|
47
|
+
* @throws {InternalChannelError} If channel is shutdown
|
|
48
|
+
*/
|
|
49
|
+
receive(envelope) {
|
|
50
|
+
if (this.isShutdown) {
|
|
51
|
+
throw new InternalChannelError(`Channel ${this.channelId} is shutdown and cannot receive envelopes`);
|
|
52
|
+
}
|
|
53
|
+
if (envelope.type === "operations" && envelope.operations) {
|
|
54
|
+
const syncOp = envelopeToSyncOperation(envelope, this.remoteName);
|
|
55
|
+
syncOp.transported();
|
|
56
|
+
this.inbox.add(syncOp);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Updates the synchronization cursor for this channel's remote.
|
|
61
|
+
*
|
|
62
|
+
* Cursors track progress through the operation stream and enable resuming
|
|
63
|
+
* synchronization after restarts. The cursor is exclusive - the next sync
|
|
64
|
+
* will start at cursorOrdinal + 1.
|
|
65
|
+
*
|
|
66
|
+
* @param cursorOrdinal - The last processed ordinal (exclusive)
|
|
67
|
+
*/
|
|
68
|
+
async updateCursor(cursorOrdinal) {
|
|
69
|
+
const cursor = {
|
|
70
|
+
remoteName: this.remoteName,
|
|
71
|
+
cursorOrdinal,
|
|
72
|
+
lastSyncedAtUtcMs: Date.now(),
|
|
73
|
+
};
|
|
74
|
+
await this.cursorStorage.upsert(cursor);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handles sync operations added to the outbox by sending them to the peer.
|
|
78
|
+
*
|
|
79
|
+
* This method is called automatically via the outbox.onAdded callback.
|
|
80
|
+
* It converts the sync operation to a SyncEnvelope and sends it via the send function.
|
|
81
|
+
*
|
|
82
|
+
* @param syncOp - The sync operation to transport
|
|
83
|
+
*/
|
|
84
|
+
handleOutboxAdded(syncOp) {
|
|
85
|
+
if (this.isShutdown) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
syncOp.started();
|
|
90
|
+
const envelope = {
|
|
91
|
+
type: "operations",
|
|
92
|
+
channelMeta: { id: this.channelId },
|
|
93
|
+
operations: syncOp.operations,
|
|
94
|
+
};
|
|
95
|
+
this.send(envelope);
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
99
|
+
const channelError = new ChannelError(ChannelErrorSource.Outbox, err);
|
|
100
|
+
syncOp.failed(channelError);
|
|
101
|
+
this.deadLetter.add(syncOp);
|
|
102
|
+
this.outbox.remove(syncOp);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=internal-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal-channel.js","sourceRoot":"","sources":["../../../../src/sync/channels/internal-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SyncOperation } from "../sync-operation.js";
|
|
2
|
+
import type { SyncEnvelope } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Converts a SyncEnvelope containing operations into a SyncOperation.
|
|
5
|
+
*
|
|
6
|
+
* Extracts the necessary metadata from the envelope's operations to create
|
|
7
|
+
* a sync operation that can be processed by the receiving channel.
|
|
8
|
+
*
|
|
9
|
+
* @param envelope - The sync envelope containing operations
|
|
10
|
+
* @param remoteName - The name of the remote this sync operation is associated with
|
|
11
|
+
* @returns A new SyncOperation containing the envelope's operations
|
|
12
|
+
* @throws Error if envelope has no operations or operations array is empty
|
|
13
|
+
*/
|
|
14
|
+
export declare function envelopeToSyncOperation(envelope: SyncEnvelope, remoteName: string): SyncOperation;
|
|
15
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/sync/channels/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhD;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,YAAY,EACtB,UAAU,EAAE,MAAM,GACjB,aAAa,CAuBf"}
|