@syncular/client 0.0.6-95 → 0.1.0
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/README.md +713 -11
- package/dist/auth-leases.d.ts +11 -0
- package/dist/auth-leases.d.ts.map +1 -0
- package/dist/auth-leases.js +140 -0
- package/dist/auth-leases.js.map +1 -0
- package/dist/blob-limits.d.ts +15 -0
- package/dist/blob-limits.d.ts.map +1 -0
- package/dist/blob-limits.js +66 -0
- package/dist/blob-limits.js.map +1 -0
- package/dist/bridge-client.d.ts +69 -0
- package/dist/bridge-client.d.ts.map +1 -0
- package/dist/bridge-client.js +282 -0
- package/dist/bridge-client.js.map +1 -0
- package/dist/client-config.d.ts +6 -0
- package/dist/client-config.d.ts.map +1 -0
- package/dist/client-config.js +18 -0
- package/dist/client-config.js.map +1 -0
- package/dist/client.d.ts +65 -397
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +150 -960
- package/dist/client.js.map +1 -1
- package/dist/command-history.d.ts +35 -0
- package/dist/command-history.d.ts.map +1 -0
- package/dist/command-history.js +378 -0
- package/dist/command-history.js.map +1 -0
- package/dist/console-diagnostics.d.ts +33 -0
- package/dist/console-diagnostics.d.ts.map +1 -0
- package/dist/console-diagnostics.js +496 -0
- package/dist/console-diagnostics.js.map +1 -0
- package/dist/crdt-yjs/index.d.ts +4 -0
- package/dist/crdt-yjs/index.d.ts.map +1 -0
- package/dist/crdt-yjs/index.js +4 -0
- package/dist/crdt-yjs/index.js.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.js +284 -0
- package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
- package/dist/database.d.ts +83 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +916 -0
- package/dist/database.js.map +1 -0
- package/dist/diagnostics.d.ts +10 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +83 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +211 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated-bridge.d.ts +365 -0
- package/dist/generated-bridge.d.ts.map +1 -0
- package/dist/generated-bridge.js +250 -0
- package/dist/generated-bridge.js.map +1 -0
- package/dist/index.d.ts +13 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -25
- package/dist/index.js.map +1 -1
- package/dist/mutations.d.ts +4 -72
- package/dist/mutations.d.ts.map +1 -1
- package/dist/mutations.js +2 -568
- package/dist/mutations.js.map +1 -1
- package/dist/network.d.ts +3 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +17 -0
- package/dist/network.js.map +1 -0
- package/dist/react/index.d.ts +169 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +628 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react-native/index.d.ts +35 -0
- package/dist/react-native/index.d.ts.map +1 -0
- package/dist/react-native/index.js +49 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/runtime-contract.d.ts +13 -0
- package/dist/runtime-contract.d.ts.map +1 -0
- package/dist/runtime-contract.js +24 -0
- package/dist/runtime-contract.js.map +1 -0
- package/dist/rust-client.d.ts +106 -0
- package/dist/rust-client.d.ts.map +1 -0
- package/dist/rust-client.js +936 -0
- package/dist/rust-client.js.map +1 -0
- package/dist/sentry.d.ts +35 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +155 -0
- package/dist/sentry.js.map +1 -0
- package/dist/sql-safety.d.ts +3 -0
- package/dist/sql-safety.d.ts.map +1 -0
- package/dist/sql-safety.js +62 -0
- package/dist/sql-safety.js.map +1 -0
- package/dist/syncular-runtime-artifacts.json +61 -0
- package/dist/tauri/index.d.ts +35 -0
- package/dist/tauri/index.d.ts.map +1 -0
- package/dist/tauri/index.js +114 -0
- package/dist/tauri/index.js.map +1 -0
- package/dist/types.d.ts +1059 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wasm/.syncular-wasm-profile +1 -0
- package/dist/wasm/syncular-runtime-artifact.json +21 -0
- package/dist/wasm/syncular.d.ts +207 -0
- package/dist/wasm/syncular.js +2341 -0
- package/dist/wasm/syncular_bg.wasm +0 -0
- package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
- package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
- package/dist/wasm-bindings/runtime-contract.js +112 -0
- package/dist/wasm-bindings/runtime-contract.js.map +1 -0
- package/dist/wasm-core/.syncular-wasm-profile +1 -0
- package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
- package/dist/wasm-core/syncular.d.ts +162 -0
- package/dist/wasm-core/syncular.js +1847 -0
- package/dist/wasm-core/syncular_bg.wasm +0 -0
- package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
- package/dist/wasm-perf/.syncular-wasm-profile +1 -0
- package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
- package/dist/wasm-perf/syncular.d.ts +207 -0
- package/dist/wasm-perf/syncular.js +2341 -0
- package/dist/wasm-perf/syncular_bg.wasm +0 -0
- package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-runtime.d.ts +18 -0
- package/dist/wasm-runtime.d.ts.map +1 -0
- package/dist/wasm-runtime.js +28 -0
- package/dist/wasm-runtime.js.map +1 -0
- package/dist/worker-client.d.ts +123 -0
- package/dist/worker-client.d.ts.map +1 -0
- package/dist/worker-client.js +1686 -0
- package/dist/worker-client.js.map +1 -0
- package/dist/worker-entry.d.ts +2 -0
- package/dist/worker-entry.d.ts.map +1 -0
- package/dist/worker-entry.js +479 -0
- package/dist/worker-entry.js.map +1 -0
- package/dist/worker-protocol.d.ts +64 -0
- package/dist/worker-protocol.d.ts.map +1 -0
- package/dist/worker-protocol.js +16 -0
- package/dist/worker-protocol.js.map +1 -0
- package/dist/worker-realtime.d.ts +39 -0
- package/dist/worker-realtime.d.ts.map +1 -0
- package/dist/worker-realtime.js +677 -0
- package/dist/worker-realtime.js.map +1 -0
- package/package.json +124 -17
- package/src/auth-leases.ts +251 -0
- package/src/blob-limits.ts +98 -0
- package/src/bridge-client.ts +512 -0
- package/src/client-config.ts +29 -0
- package/src/client.ts +256 -1414
- package/src/command-history.ts +623 -0
- package/src/console-diagnostics.ts +617 -0
- package/src/crdt-yjs/index.ts +3 -0
- package/src/crdt-yjs/webview-host-facade.ts +477 -0
- package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
- package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
- package/src/database.ts +1342 -0
- package/src/diagnostics.ts +116 -0
- package/src/errors.ts +269 -0
- package/src/generated-bridge.ts +741 -0
- package/src/index.ts +21 -25
- package/src/mutations.ts +12 -821
- package/src/network.ts +32 -0
- package/src/react/index.ts +1036 -0
- package/src/react-native/index.ts +152 -0
- package/src/runtime-contract.ts +48 -0
- package/src/rust-client.ts +1488 -0
- package/src/sentry.ts +215 -0
- package/src/sql-safety.ts +61 -0
- package/src/tauri/index.ts +211 -0
- package/src/types.ts +1356 -0
- package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
- package/src/wasm-bindings/runtime-contract.ts +158 -0
- package/src/wasm-runtime.ts +76 -0
- package/src/worker-client.ts +2215 -0
- package/src/worker-entry.ts +584 -0
- package/src/worker-protocol.ts +109 -0
- package/src/worker-realtime.ts +843 -0
- package/dist/blobs/index.d.ts +0 -7
- package/dist/blobs/index.d.ts.map +0 -1
- package/dist/blobs/index.js +0 -7
- package/dist/blobs/index.js.map +0 -1
- package/dist/blobs/manager.d.ts +0 -345
- package/dist/blobs/manager.d.ts.map +0 -1
- package/dist/blobs/manager.js +0 -749
- package/dist/blobs/manager.js.map +0 -1
- package/dist/blobs/migrate.d.ts +0 -14
- package/dist/blobs/migrate.d.ts.map +0 -1
- package/dist/blobs/migrate.js +0 -59
- package/dist/blobs/migrate.js.map +0 -1
- package/dist/blobs/types.d.ts +0 -62
- package/dist/blobs/types.d.ts.map +0 -1
- package/dist/blobs/types.js +0 -5
- package/dist/blobs/types.js.map +0 -1
- package/dist/conflicts.d.ts +0 -31
- package/dist/conflicts.d.ts.map +0 -1
- package/dist/conflicts.js +0 -112
- package/dist/conflicts.js.map +0 -1
- package/dist/create-client.d.ts +0 -118
- package/dist/create-client.d.ts.map +0 -1
- package/dist/create-client.js +0 -178
- package/dist/create-client.js.map +0 -1
- package/dist/engine/SyncEngine.d.ts +0 -272
- package/dist/engine/SyncEngine.d.ts.map +0 -1
- package/dist/engine/SyncEngine.js +0 -1860
- package/dist/engine/SyncEngine.js.map +0 -1
- package/dist/engine/index.d.ts +0 -6
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -6
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/types.d.ts +0 -345
- package/dist/engine/types.d.ts.map +0 -1
- package/dist/engine/types.js +0 -7
- package/dist/engine/types.js.map +0 -1
- package/dist/handlers/collection.d.ts +0 -6
- package/dist/handlers/collection.d.ts.map +0 -1
- package/dist/handlers/collection.js +0 -21
- package/dist/handlers/collection.js.map +0 -1
- package/dist/handlers/create-handler.d.ts +0 -120
- package/dist/handlers/create-handler.d.ts.map +0 -1
- package/dist/handlers/create-handler.js +0 -145
- package/dist/handlers/create-handler.js.map +0 -1
- package/dist/handlers/types.d.ts +0 -83
- package/dist/handlers/types.d.ts.map +0 -1
- package/dist/handlers/types.js +0 -5
- package/dist/handlers/types.js.map +0 -1
- package/dist/migrate.d.ts +0 -19
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -238
- package/dist/migrate.js.map +0 -1
- package/dist/outbox.d.ts +0 -112
- package/dist/outbox.d.ts.map +0 -1
- package/dist/outbox.js +0 -294
- package/dist/outbox.js.map +0 -1
- package/dist/plugins/incrementing-version.d.ts +0 -34
- package/dist/plugins/incrementing-version.d.ts.map +0 -1
- package/dist/plugins/incrementing-version.js +0 -83
- package/dist/plugins/incrementing-version.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -3
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -3
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -49
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/plugins/types.js +0 -15
- package/dist/plugins/types.js.map +0 -1
- package/dist/proxy/connection.d.ts +0 -33
- package/dist/proxy/connection.d.ts.map +0 -1
- package/dist/proxy/connection.js +0 -153
- package/dist/proxy/connection.js.map +0 -1
- package/dist/proxy/dialect.d.ts +0 -46
- package/dist/proxy/dialect.d.ts.map +0 -1
- package/dist/proxy/dialect.js +0 -58
- package/dist/proxy/dialect.js.map +0 -1
- package/dist/proxy/driver.d.ts +0 -42
- package/dist/proxy/driver.d.ts.map +0 -1
- package/dist/proxy/driver.js +0 -78
- package/dist/proxy/driver.js.map +0 -1
- package/dist/proxy/index.d.ts +0 -10
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js +0 -10
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/mutations.d.ts +0 -9
- package/dist/proxy/mutations.d.ts.map +0 -1
- package/dist/proxy/mutations.js +0 -11
- package/dist/proxy/mutations.js.map +0 -1
- package/dist/pull-engine.d.ts +0 -48
- package/dist/pull-engine.d.ts.map +0 -1
- package/dist/pull-engine.js +0 -648
- package/dist/pull-engine.js.map +0 -1
- package/dist/push-engine.d.ts +0 -18
- package/dist/push-engine.d.ts.map +0 -1
- package/dist/push-engine.js +0 -167
- package/dist/push-engine.js.map +0 -1
- package/dist/query/FingerprintCollector.d.ts +0 -18
- package/dist/query/FingerprintCollector.d.ts.map +0 -1
- package/dist/query/FingerprintCollector.js +0 -28
- package/dist/query/FingerprintCollector.js.map +0 -1
- package/dist/query/QueryContext.d.ts +0 -33
- package/dist/query/QueryContext.d.ts.map +0 -1
- package/dist/query/QueryContext.js +0 -16
- package/dist/query/QueryContext.js.map +0 -1
- package/dist/query/fingerprint.d.ts +0 -61
- package/dist/query/fingerprint.d.ts.map +0 -1
- package/dist/query/fingerprint.js +0 -91
- package/dist/query/fingerprint.js.map +0 -1
- package/dist/query/index.d.ts +0 -7
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -7
- package/dist/query/index.js.map +0 -1
- package/dist/query/tracked-select.d.ts +0 -18
- package/dist/query/tracked-select.d.ts.map +0 -1
- package/dist/query/tracked-select.js +0 -90
- package/dist/query/tracked-select.js.map +0 -1
- package/dist/schema.d.ts +0 -83
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -7
- package/dist/schema.js.map +0 -1
- package/dist/subscription-state.d.ts +0 -46
- package/dist/subscription-state.d.ts.map +0 -1
- package/dist/subscription-state.js +0 -185
- package/dist/subscription-state.js.map +0 -1
- package/dist/sync-loop.d.ts +0 -34
- package/dist/sync-loop.d.ts.map +0 -1
- package/dist/sync-loop.js +0 -253
- package/dist/sync-loop.js.map +0 -1
- package/dist/sync.d.ts +0 -32
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -55
- package/dist/sync.js.map +0 -1
- package/dist/utils/id.d.ts +0 -17
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -46
- package/dist/utils/id.js.map +0 -1
- package/src/blobs/index.ts +0 -7
- package/src/blobs/manager.ts +0 -1027
- package/src/blobs/migrate.ts +0 -67
- package/src/blobs/types.ts +0 -84
- package/src/client.test.ts +0 -417
- package/src/conflicts.ts +0 -171
- package/src/create-client.test.ts +0 -83
- package/src/create-client.ts +0 -330
- package/src/engine/SyncEngine.test.ts +0 -254
- package/src/engine/SyncEngine.ts +0 -2375
- package/src/engine/index.ts +0 -6
- package/src/engine/types.ts +0 -419
- package/src/handlers/collection.ts +0 -36
- package/src/handlers/create-handler.ts +0 -330
- package/src/handlers/types.ts +0 -108
- package/src/migrate.ts +0 -318
- package/src/outbox.ts +0 -383
- package/src/plugins/incrementing-version.ts +0 -133
- package/src/plugins/index.ts +0 -2
- package/src/plugins/types.ts +0 -63
- package/src/proxy/connection.ts +0 -191
- package/src/proxy/dialect.ts +0 -76
- package/src/proxy/driver.ts +0 -126
- package/src/proxy/index.ts +0 -10
- package/src/proxy/mutations.ts +0 -18
- package/src/pull-engine.test.ts +0 -151
- package/src/pull-engine.ts +0 -855
- package/src/push-engine.ts +0 -216
- package/src/query/FingerprintCollector.ts +0 -29
- package/src/query/QueryContext.ts +0 -54
- package/src/query/fingerprint.ts +0 -109
- package/src/query/index.ts +0 -10
- package/src/query/tracked-select.ts +0 -139
- package/src/schema.ts +0 -94
- package/src/subscription-state.ts +0 -259
- package/src/sync-loop.ts +0 -379
- package/src/sync.ts +0 -170
- package/src/utils/id.ts +0 -55
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
SyncularChangedRow,
|
|
3
|
+
SyncularCrdtDocumentSnapshot,
|
|
4
|
+
SyncularCrdtFieldCompactionReceipt,
|
|
5
|
+
SyncularCrdtFieldDescriptor,
|
|
6
|
+
SyncularCrdtFieldMaterialization,
|
|
7
|
+
SyncularCrdtFieldRequest,
|
|
8
|
+
SyncularCrdtFieldWriteReceipt,
|
|
9
|
+
SyncularCrdtFieldYjsUpdateRequest,
|
|
10
|
+
SyncularCrdtUpdateLogEntry,
|
|
11
|
+
SyncularRowsChangedEvent,
|
|
12
|
+
} from '@syncular/client';
|
|
13
|
+
import type { SyncularCrdtProjectionHost } from './yjs-document-field-adapter';
|
|
14
|
+
|
|
15
|
+
export const SYNCULAR_CRDT_WEBVIEW_PROTOCOL = 'syncular.crdt.host.v1';
|
|
16
|
+
export const SYNCULAR_CRDT_WEBVIEW_REQUEST = 'syncular.crdt.host.request';
|
|
17
|
+
export const SYNCULAR_CRDT_WEBVIEW_RESPONSE = 'syncular.crdt.host.response';
|
|
18
|
+
export const SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED =
|
|
19
|
+
'syncular.crdt.host.rowsChanged';
|
|
20
|
+
|
|
21
|
+
export interface SyncularCrdtWebViewTransport {
|
|
22
|
+
postMessage(message: SyncularCrdtHostMessage): void;
|
|
23
|
+
addMessageListener(listener: (message: unknown) => void): () => void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface SyncularCrdtJsonTransportOptions {
|
|
27
|
+
postJsonMessage(message: string): void;
|
|
28
|
+
addJsonMessageListener(listener: (message: string) => void): () => void;
|
|
29
|
+
onInvalidMessage?: (error: unknown, message: string) => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SyncularCrdtWebViewHostOptions {
|
|
33
|
+
transport: SyncularCrdtWebViewTransport;
|
|
34
|
+
requestId?: () => string;
|
|
35
|
+
timeoutMs?: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface SyncularCrdtWebViewHostResponderOptions {
|
|
39
|
+
transport: SyncularCrdtWebViewTransport;
|
|
40
|
+
host: SyncularCrdtProjectionHost;
|
|
41
|
+
publishRowsChanged?: boolean;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface SyncularCrdtWebViewHost {
|
|
45
|
+
host: SyncularCrdtProjectionHost;
|
|
46
|
+
close(): void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface SyncularCrdtWebViewHostResponder {
|
|
50
|
+
close(): void;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface SyncularCrdtHostErrorPayload {
|
|
54
|
+
message: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
code?: string;
|
|
57
|
+
details?: unknown;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface SyncularCrdtHostMethodMap {
|
|
61
|
+
openCrdtField: {
|
|
62
|
+
request: SyncularCrdtFieldRequest;
|
|
63
|
+
response: SyncularCrdtFieldDescriptor;
|
|
64
|
+
};
|
|
65
|
+
applyCrdtFieldYjsUpdate: {
|
|
66
|
+
request: SyncularCrdtFieldYjsUpdateRequest;
|
|
67
|
+
response: SyncularCrdtFieldWriteReceipt;
|
|
68
|
+
};
|
|
69
|
+
enqueueCrdtFieldYjsUpdate: {
|
|
70
|
+
request: SyncularCrdtFieldYjsUpdateRequest;
|
|
71
|
+
response: string;
|
|
72
|
+
};
|
|
73
|
+
materializeCrdtField: {
|
|
74
|
+
request: SyncularCrdtFieldRequest;
|
|
75
|
+
response: SyncularCrdtFieldMaterialization;
|
|
76
|
+
};
|
|
77
|
+
crdtDocumentSnapshot: {
|
|
78
|
+
request: SyncularCrdtFieldRequest;
|
|
79
|
+
response: SyncularCrdtDocumentSnapshot;
|
|
80
|
+
};
|
|
81
|
+
crdtUpdateLog: {
|
|
82
|
+
request: SyncularCrdtFieldRequest & { limit?: number };
|
|
83
|
+
response: SyncularCrdtUpdateLogEntry[];
|
|
84
|
+
};
|
|
85
|
+
snapshotCrdtFieldStateVector: {
|
|
86
|
+
request: SyncularCrdtFieldRequest;
|
|
87
|
+
response: { stateVectorBase64: string };
|
|
88
|
+
};
|
|
89
|
+
compactCrdtField: {
|
|
90
|
+
request: SyncularCrdtFieldRequest & {
|
|
91
|
+
minUncheckpointedUpdates?: number;
|
|
92
|
+
};
|
|
93
|
+
response: SyncularCrdtFieldCompactionReceipt;
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export type SyncularCrdtHostMethod = keyof SyncularCrdtHostMethodMap;
|
|
98
|
+
|
|
99
|
+
export type SyncularCrdtHostRequestMessage = {
|
|
100
|
+
[Method in SyncularCrdtHostMethod]: {
|
|
101
|
+
protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
|
|
102
|
+
type: typeof SYNCULAR_CRDT_WEBVIEW_REQUEST;
|
|
103
|
+
id: string;
|
|
104
|
+
method: Method;
|
|
105
|
+
request: SyncularCrdtHostMethodMap[Method]['request'];
|
|
106
|
+
};
|
|
107
|
+
}[SyncularCrdtHostMethod];
|
|
108
|
+
|
|
109
|
+
export type SyncularCrdtHostResponseMessage =
|
|
110
|
+
| {
|
|
111
|
+
protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
|
|
112
|
+
type: typeof SYNCULAR_CRDT_WEBVIEW_RESPONSE;
|
|
113
|
+
id: string;
|
|
114
|
+
ok: true;
|
|
115
|
+
response: unknown;
|
|
116
|
+
}
|
|
117
|
+
| {
|
|
118
|
+
protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
|
|
119
|
+
type: typeof SYNCULAR_CRDT_WEBVIEW_RESPONSE;
|
|
120
|
+
id: string;
|
|
121
|
+
ok: false;
|
|
122
|
+
error: SyncularCrdtHostErrorPayload;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export interface SyncularCrdtHostRowsChangedMessage {
|
|
126
|
+
protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
|
|
127
|
+
type: typeof SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED;
|
|
128
|
+
event: SyncularRowsChangedEvent;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export type SyncularCrdtHostMessage =
|
|
132
|
+
| SyncularCrdtHostRequestMessage
|
|
133
|
+
| SyncularCrdtHostResponseMessage
|
|
134
|
+
| SyncularCrdtHostRowsChangedMessage;
|
|
135
|
+
|
|
136
|
+
export interface SyncularNativeRowsChangedEventLike {
|
|
137
|
+
kind: string;
|
|
138
|
+
tables?: string[];
|
|
139
|
+
changedRows?: SyncularChangedRow[];
|
|
140
|
+
payload_json?: {
|
|
141
|
+
source?: string | null;
|
|
142
|
+
changedRows?: SyncularChangedRow[];
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function createSyncularCrdtJsonTransport(
|
|
147
|
+
options: SyncularCrdtJsonTransportOptions
|
|
148
|
+
): SyncularCrdtWebViewTransport {
|
|
149
|
+
return {
|
|
150
|
+
postMessage(message) {
|
|
151
|
+
options.postJsonMessage(JSON.stringify(message));
|
|
152
|
+
},
|
|
153
|
+
addMessageListener(listener) {
|
|
154
|
+
return options.addJsonMessageListener((message) => {
|
|
155
|
+
try {
|
|
156
|
+
const parsed = JSON.parse(message);
|
|
157
|
+
if (isSyncularCrdtHostMessage(parsed)) {
|
|
158
|
+
listener(parsed);
|
|
159
|
+
}
|
|
160
|
+
} catch (error) {
|
|
161
|
+
options.onInvalidMessage?.(error, message);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
interface PendingRequest {
|
|
169
|
+
resolve: (value: unknown) => void;
|
|
170
|
+
reject: (error: unknown) => void;
|
|
171
|
+
timer: ReturnType<typeof setTimeout> | undefined;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function createSyncularCrdtWebViewHost(
|
|
175
|
+
options: SyncularCrdtWebViewHostOptions
|
|
176
|
+
): SyncularCrdtWebViewHost {
|
|
177
|
+
const timeoutMs = options.timeoutMs ?? 15_000;
|
|
178
|
+
const nextRequestId = options.requestId ?? randomRequestId;
|
|
179
|
+
const pending = new Map<string, PendingRequest>();
|
|
180
|
+
const rowsChangedListeners = new Set<
|
|
181
|
+
(event: SyncularRowsChangedEvent) => void
|
|
182
|
+
>();
|
|
183
|
+
let closed = false;
|
|
184
|
+
|
|
185
|
+
const unsubscribe = options.transport.addMessageListener((message) => {
|
|
186
|
+
if (!isSyncularCrdtHostMessage(message)) return;
|
|
187
|
+
if (message.type === SYNCULAR_CRDT_WEBVIEW_RESPONSE) {
|
|
188
|
+
const request = pending.get(message.id);
|
|
189
|
+
if (!request) return;
|
|
190
|
+
pending.delete(message.id);
|
|
191
|
+
if (request.timer != null) clearTimeout(request.timer);
|
|
192
|
+
if (message.ok) {
|
|
193
|
+
request.resolve(message.response);
|
|
194
|
+
} else {
|
|
195
|
+
request.reject(errorFromPayload(message.error));
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (message.type === SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED) {
|
|
201
|
+
for (const listener of rowsChangedListeners) listener(message.event);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
const request = <Method extends SyncularCrdtHostMethod>(
|
|
206
|
+
method: Method,
|
|
207
|
+
payload: SyncularCrdtHostMethodMap[Method]['request']
|
|
208
|
+
): Promise<SyncularCrdtHostMethodMap[Method]['response']> => {
|
|
209
|
+
if (closed) {
|
|
210
|
+
return Promise.reject(new Error('Syncular CRDT WebView host is closed'));
|
|
211
|
+
}
|
|
212
|
+
const id = nextRequestId();
|
|
213
|
+
const message: SyncularCrdtHostRequestMessage = {
|
|
214
|
+
protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
|
|
215
|
+
type: SYNCULAR_CRDT_WEBVIEW_REQUEST,
|
|
216
|
+
id,
|
|
217
|
+
method,
|
|
218
|
+
request: payload,
|
|
219
|
+
} as SyncularCrdtHostRequestMessage;
|
|
220
|
+
|
|
221
|
+
return new Promise<unknown>((resolve, reject) => {
|
|
222
|
+
const timer =
|
|
223
|
+
timeoutMs > 0
|
|
224
|
+
? setTimeout(() => {
|
|
225
|
+
pending.delete(id);
|
|
226
|
+
reject(
|
|
227
|
+
new Error(
|
|
228
|
+
`Syncular CRDT WebView host request timed out: ${method}`
|
|
229
|
+
)
|
|
230
|
+
);
|
|
231
|
+
}, timeoutMs)
|
|
232
|
+
: undefined;
|
|
233
|
+
pending.set(id, { resolve, reject, timer });
|
|
234
|
+
try {
|
|
235
|
+
options.transport.postMessage(message);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
pending.delete(id);
|
|
238
|
+
if (timer != null) clearTimeout(timer);
|
|
239
|
+
reject(error);
|
|
240
|
+
}
|
|
241
|
+
}) as Promise<SyncularCrdtHostMethodMap[Method]['response']>;
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
return {
|
|
245
|
+
host: {
|
|
246
|
+
openCrdtField(field) {
|
|
247
|
+
return request('openCrdtField', field);
|
|
248
|
+
},
|
|
249
|
+
applyCrdtFieldYjsUpdate(update) {
|
|
250
|
+
return request('applyCrdtFieldYjsUpdate', update);
|
|
251
|
+
},
|
|
252
|
+
enqueueCrdtFieldYjsUpdate(update) {
|
|
253
|
+
return request('enqueueCrdtFieldYjsUpdate', update);
|
|
254
|
+
},
|
|
255
|
+
materializeCrdtField(field) {
|
|
256
|
+
return request('materializeCrdtField', field);
|
|
257
|
+
},
|
|
258
|
+
crdtDocumentSnapshot(field) {
|
|
259
|
+
return request('crdtDocumentSnapshot', field);
|
|
260
|
+
},
|
|
261
|
+
crdtUpdateLog(field) {
|
|
262
|
+
return request('crdtUpdateLog', field);
|
|
263
|
+
},
|
|
264
|
+
snapshotCrdtFieldStateVector(field) {
|
|
265
|
+
return request('snapshotCrdtFieldStateVector', field);
|
|
266
|
+
},
|
|
267
|
+
compactCrdtField(field) {
|
|
268
|
+
return request('compactCrdtField', field);
|
|
269
|
+
},
|
|
270
|
+
addRowsChangedListener(listener) {
|
|
271
|
+
rowsChangedListeners.add(listener);
|
|
272
|
+
return () => {
|
|
273
|
+
rowsChangedListeners.delete(listener);
|
|
274
|
+
};
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
close() {
|
|
278
|
+
if (closed) return;
|
|
279
|
+
closed = true;
|
|
280
|
+
unsubscribe();
|
|
281
|
+
rowsChangedListeners.clear();
|
|
282
|
+
for (const [id, pendingRequest] of pending) {
|
|
283
|
+
pending.delete(id);
|
|
284
|
+
if (pendingRequest.timer != null) clearTimeout(pendingRequest.timer);
|
|
285
|
+
pendingRequest.reject(
|
|
286
|
+
new Error('Syncular CRDT WebView host closed before response')
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export function createSyncularCrdtWebViewHostResponder(
|
|
294
|
+
options: SyncularCrdtWebViewHostResponderOptions
|
|
295
|
+
): SyncularCrdtWebViewHostResponder {
|
|
296
|
+
let closed = false;
|
|
297
|
+
const unsubscribeRequests = options.transport.addMessageListener(
|
|
298
|
+
(message) => {
|
|
299
|
+
if (!isSyncularCrdtHostMessage(message)) return;
|
|
300
|
+
if (message.type !== SYNCULAR_CRDT_WEBVIEW_REQUEST) return;
|
|
301
|
+
void createSyncularCrdtHostResponseMessage(options.host, message).then(
|
|
302
|
+
(response) => {
|
|
303
|
+
options.transport.postMessage(response);
|
|
304
|
+
}
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
const unsubscribeRowsChanged =
|
|
309
|
+
options.publishRowsChanged === false
|
|
310
|
+
? undefined
|
|
311
|
+
: options.host.addRowsChangedListener((event) => {
|
|
312
|
+
if (closed) return;
|
|
313
|
+
options.transport.postMessage(
|
|
314
|
+
createSyncularCrdtRowsChangedMessage(event)
|
|
315
|
+
);
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
return {
|
|
319
|
+
close() {
|
|
320
|
+
if (closed) return;
|
|
321
|
+
closed = true;
|
|
322
|
+
unsubscribeRequests();
|
|
323
|
+
unsubscribeRowsChanged?.();
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export async function createSyncularCrdtHostResponseMessage(
|
|
329
|
+
host: SyncularCrdtProjectionHost,
|
|
330
|
+
message: SyncularCrdtHostRequestMessage
|
|
331
|
+
): Promise<SyncularCrdtHostResponseMessage> {
|
|
332
|
+
try {
|
|
333
|
+
const response = await dispatchSyncularCrdtHostRequest(host, message);
|
|
334
|
+
return {
|
|
335
|
+
protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
|
|
336
|
+
type: SYNCULAR_CRDT_WEBVIEW_RESPONSE,
|
|
337
|
+
id: message.id,
|
|
338
|
+
ok: true,
|
|
339
|
+
response,
|
|
340
|
+
};
|
|
341
|
+
} catch (error) {
|
|
342
|
+
return {
|
|
343
|
+
protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
|
|
344
|
+
type: SYNCULAR_CRDT_WEBVIEW_RESPONSE,
|
|
345
|
+
id: message.id,
|
|
346
|
+
ok: false,
|
|
347
|
+
error: errorPayload(error),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function createSyncularCrdtRowsChangedMessage(
|
|
353
|
+
event: SyncularRowsChangedEvent
|
|
354
|
+
): SyncularCrdtHostRowsChangedMessage {
|
|
355
|
+
return {
|
|
356
|
+
protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
|
|
357
|
+
type: SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED,
|
|
358
|
+
event,
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export function syncularCrdtRowsChangedMessageFromNativeEvent(
|
|
363
|
+
event: unknown
|
|
364
|
+
): SyncularCrdtHostRowsChangedMessage | undefined {
|
|
365
|
+
if (!isNativeRowsChangedEventLike(event)) return undefined;
|
|
366
|
+
const changedRows =
|
|
367
|
+
event.changedRows ?? event.payload_json?.changedRows ?? [];
|
|
368
|
+
const changedTables =
|
|
369
|
+
event.tables && event.tables.length > 0
|
|
370
|
+
? event.tables
|
|
371
|
+
: Array.from(new Set(changedRows.map((row) => row.table)));
|
|
372
|
+
return createSyncularCrdtRowsChangedMessage({
|
|
373
|
+
source: event.payload_json?.source ?? 'native',
|
|
374
|
+
changedTables,
|
|
375
|
+
changedRows,
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
export function syncularCrdtRowsChangedMessageFromNativeEventJson(
|
|
380
|
+
eventJson: string
|
|
381
|
+
): SyncularCrdtHostRowsChangedMessage | undefined {
|
|
382
|
+
return syncularCrdtRowsChangedMessageFromNativeEvent(JSON.parse(eventJson));
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export function isSyncularCrdtHostMessage(
|
|
386
|
+
message: unknown
|
|
387
|
+
): message is SyncularCrdtHostMessage {
|
|
388
|
+
if (!isRecord(message)) return false;
|
|
389
|
+
if (message.protocol !== SYNCULAR_CRDT_WEBVIEW_PROTOCOL) return false;
|
|
390
|
+
return (
|
|
391
|
+
message.type === SYNCULAR_CRDT_WEBVIEW_REQUEST ||
|
|
392
|
+
message.type === SYNCULAR_CRDT_WEBVIEW_RESPONSE ||
|
|
393
|
+
message.type === SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
export function dispatchSyncularCrdtHostRequest(
|
|
398
|
+
host: SyncularCrdtProjectionHost,
|
|
399
|
+
message: SyncularCrdtHostRequestMessage
|
|
400
|
+
): Promise<unknown> {
|
|
401
|
+
switch (message.method) {
|
|
402
|
+
case 'openCrdtField':
|
|
403
|
+
return host.openCrdtField(message.request);
|
|
404
|
+
case 'applyCrdtFieldYjsUpdate':
|
|
405
|
+
return host.applyCrdtFieldYjsUpdate(message.request);
|
|
406
|
+
case 'enqueueCrdtFieldYjsUpdate':
|
|
407
|
+
if (host.enqueueCrdtFieldYjsUpdate) {
|
|
408
|
+
return host.enqueueCrdtFieldYjsUpdate(message.request);
|
|
409
|
+
}
|
|
410
|
+
return host.applyCrdtFieldYjsUpdate(message.request).then((receipt) => {
|
|
411
|
+
return receipt.clientCommitId;
|
|
412
|
+
});
|
|
413
|
+
case 'materializeCrdtField':
|
|
414
|
+
return host.materializeCrdtField(message.request);
|
|
415
|
+
case 'crdtDocumentSnapshot':
|
|
416
|
+
if (!host.crdtDocumentSnapshot) {
|
|
417
|
+
throw new Error('Host does not expose crdtDocumentSnapshot');
|
|
418
|
+
}
|
|
419
|
+
return host.crdtDocumentSnapshot(message.request);
|
|
420
|
+
case 'crdtUpdateLog':
|
|
421
|
+
if (!host.crdtUpdateLog) {
|
|
422
|
+
throw new Error('Host does not expose crdtUpdateLog');
|
|
423
|
+
}
|
|
424
|
+
return host.crdtUpdateLog(message.request);
|
|
425
|
+
case 'snapshotCrdtFieldStateVector':
|
|
426
|
+
return host.snapshotCrdtFieldStateVector(message.request);
|
|
427
|
+
case 'compactCrdtField':
|
|
428
|
+
return host.compactCrdtField(message.request);
|
|
429
|
+
default:
|
|
430
|
+
return assertNever(message);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function errorPayload(error: unknown): SyncularCrdtHostErrorPayload {
|
|
435
|
+
if (error instanceof Error) {
|
|
436
|
+
return {
|
|
437
|
+
message: error.message,
|
|
438
|
+
name: error.name,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
return {
|
|
442
|
+
message: String(error),
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
function errorFromPayload(payload: SyncularCrdtHostErrorPayload): Error {
|
|
447
|
+
const error = new Error(payload.message);
|
|
448
|
+
error.name = payload.name ?? 'Error';
|
|
449
|
+
return error;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
function isRecord(value: unknown): value is Record<string, unknown> {
|
|
453
|
+
return typeof value === 'object' && value !== null;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function isNativeRowsChangedEventLike(
|
|
457
|
+
event: unknown
|
|
458
|
+
): event is SyncularNativeRowsChangedEventLike {
|
|
459
|
+
if (!isRecord(event)) return false;
|
|
460
|
+
if (event.kind !== 'RowsChanged') return false;
|
|
461
|
+
return (
|
|
462
|
+
Array.isArray(event.tables) ||
|
|
463
|
+
Array.isArray(event.changedRows) ||
|
|
464
|
+
(isRecord(event.payload_json) &&
|
|
465
|
+
Array.isArray(event.payload_json.changedRows))
|
|
466
|
+
);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function randomRequestId(): string {
|
|
470
|
+
return `syncular-crdt-${Date.now().toString(36)}-${Math.random()
|
|
471
|
+
.toString(36)
|
|
472
|
+
.slice(2)}`;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
function assertNever(value: never): never {
|
|
476
|
+
throw new Error(`Unhandled Syncular CRDT WebView method: ${String(value)}`);
|
|
477
|
+
}
|