@spooky-sync/core 0.0.1-canary.32 → 0.0.1-canary.320
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/AGENTS.md +81 -0
- package/README.md +56 -16
- package/dist/index.d.ts +2034 -137
- package/dist/index.js +15137 -2434
- package/dist/live.d.ts +141 -0
- package/dist/live.js +709 -0
- package/dist/otel/index.d.ts +1 -1
- package/dist/otel/index.js +3 -3
- package/dist/pure.d.ts +337 -0
- package/dist/pure.js +24 -0
- package/dist/sqlite-open.js +379 -0
- package/dist/sqlite-worker.d.ts +1 -0
- package/dist/sqlite-worker.js +439 -0
- package/dist/sw.d.ts +207 -0
- package/dist/sw.js +393 -0
- package/dist/tabs-broker-worker.d.ts +8 -0
- package/dist/tabs-broker-worker.js +472 -0
- package/dist/types.d.ts +1811 -38
- package/dist/worker-edges.js +439 -0
- package/dist/worker-impersonation.js +60 -0
- package/dist/worker-ref-tables.d.ts +46 -0
- package/dist/worker-types.d.ts +112 -0
- package/dist/worker-types.js +73 -0
- package/package.json +27 -7
- package/scripts/check-broker-bundle.mjs +33 -0
- package/scripts/check-worker-entries.mjs +172 -0
- package/skills/sp00ky-core/SKILL.md +31 -6
- package/skills/sp00ky-core/references/config.md +6 -0
- package/src/boot/auth-flip.saga.test.ts +135 -0
- package/src/boot/auth-flip.saga.ts +77 -0
- package/src/boot/boot.saga.test.ts +180 -0
- package/src/boot/boot.saga.ts +142 -0
- package/src/boot/bucket-switch.saga.test.ts +187 -0
- package/src/boot/bucket-switch.saga.ts +133 -0
- package/src/boot/preload.saga.test.ts +51 -0
- package/src/boot/preload.saga.ts +31 -0
- package/src/bucket-blurhash.test.ts +148 -0
- package/src/build-globals.d.ts +12 -0
- package/src/client/bucket-handle.test.ts +117 -0
- package/src/client/bucket-handle.ts +227 -0
- package/src/client/router.test.ts +58 -0
- package/src/client/router.ts +100 -0
- package/src/client/runtime.test.ts +195 -0
- package/src/client/runtime.ts +296 -0
- package/src/client/services.test.ts +51 -0
- package/src/client/services.ts +404 -0
- package/src/client/sp00ky-client.test.ts +303 -0
- package/src/client/sp00ky-client.ts +586 -0
- package/src/events/events.test.ts +2 -1
- package/src/events/index.ts +3 -0
- package/src/index.ts +69 -1
- package/src/kernel/constants.test.ts +19 -0
- package/src/kernel/constants.ts +80 -0
- package/src/kernel/effects.test.ts +40 -0
- package/src/kernel/effects.ts +163 -0
- package/src/kernel/events.ts +57 -0
- package/src/kernel/interpreter.test.ts +116 -0
- package/src/kernel/interpreter.ts +148 -0
- package/src/kernel/saga.test.ts +89 -0
- package/src/kernel/saga.ts +73 -0
- package/src/live/index.test.ts +478 -0
- package/src/live/index.ts +1013 -0
- package/src/modules/app-release/index.test.ts +125 -0
- package/src/modules/app-release/index.ts +209 -0
- package/src/modules/auth/auth.local-first.test.ts +169 -0
- package/src/modules/auth/events/index.ts +9 -2
- package/src/modules/auth/impersonation-banner.ts +443 -0
- package/src/modules/auth/impersonation.integration.test.ts +205 -0
- package/src/modules/auth/impersonation.test.ts +377 -0
- package/src/modules/auth/impersonation.ts +179 -0
- package/src/modules/auth/index.ts +466 -19
- package/src/modules/crdt/crdt-field.ts +294 -0
- package/src/modules/crdt/crdt-hydration.test.ts +210 -0
- package/src/modules/crdt/crdt-reconnect.test.ts +195 -0
- package/src/modules/crdt/index.ts +463 -0
- package/src/modules/crdt/loro-loader.ts +25 -0
- package/src/modules/devtools/flags.ts +349 -0
- package/src/modules/devtools/index.ts +746 -95
- package/src/modules/devtools/mutations.test.ts +92 -0
- package/src/modules/devtools/mutations.ts +160 -0
- package/src/modules/devtools/notify-throttle.test.ts +166 -0
- package/src/modules/devtools/state-shape.test.ts +263 -0
- package/src/modules/devtools/storage-info.test.ts +79 -0
- package/src/modules/devtools/storage-info.ts +168 -0
- package/src/modules/devtools/versions.test.ts +74 -0
- package/src/modules/devtools/versions.ts +110 -0
- package/src/modules/feature-flag/index.test.ts +298 -0
- package/src/modules/feature-flag/index.ts +316 -0
- package/src/modules/ref-tables.test.ts +91 -0
- package/src/modules/ref-tables.ts +88 -0
- package/src/modules/web-push/index.test.ts +824 -0
- package/src/modules/web-push/index.ts +1027 -0
- package/src/mutation/jobs.test.ts +25 -0
- package/src/mutation/jobs.ts +41 -0
- package/src/mutation/mutation-id.test.ts +37 -0
- package/src/mutation/mutation-id.ts +35 -0
- package/src/mutation/pending-writes.integration.test.ts +175 -0
- package/src/mutation/push.saga.test.ts +285 -0
- package/src/mutation/push.saga.ts +217 -0
- package/src/mutation/rows.test.ts +231 -0
- package/src/mutation/rows.ts +427 -0
- package/src/mutation/tray.saga.test.ts +63 -0
- package/src/mutation/tray.saga.ts +48 -0
- package/src/mutation/write.saga.test.ts +316 -0
- package/src/mutation/write.saga.ts +268 -0
- package/src/otel/index.ts +10 -7
- package/src/pure.ts +65 -0
- package/src/push/types.ts +174 -0
- package/src/query/env.test.ts +23 -0
- package/src/query/env.ts +56 -0
- package/src/query/fetch.saga.test.ts +199 -0
- package/src/query/fetch.saga.ts +120 -0
- package/src/query/hash.test.ts +14 -0
- package/src/query/hash.ts +18 -0
- package/src/query/id-set-plan.test.ts +132 -0
- package/src/query/lifecycle.saga.test.ts +274 -0
- package/src/query/lifecycle.saga.ts +159 -0
- package/src/query/materialize.saga.test.ts +115 -0
- package/src/query/materialize.saga.ts +84 -0
- package/src/query/materialize.test.ts +58 -0
- package/src/query/materialize.ts +57 -0
- package/src/query/membership.saga.test.ts +350 -0
- package/src/query/membership.saga.ts +278 -0
- package/src/query/membership.test.ts +118 -0
- package/src/query/membership.ts +201 -0
- package/src/query/register.saga.test.ts +311 -0
- package/src/query/register.saga.ts +229 -0
- package/src/query/render-set.test.ts +47 -0
- package/src/query/render-set.ts +71 -0
- package/src/query/sql.test.ts +81 -0
- package/src/query/sql.ts +112 -0
- package/src/query/window-query.test.ts +70 -0
- package/src/query/window-query.ts +195 -0
- package/src/services/blobs/blob-cache.test.ts +359 -0
- package/src/services/blobs/blob-cache.ts +603 -0
- package/src/services/blobs/blob-manifest.ts +227 -0
- package/src/services/blobs/blob-store.test.ts +77 -0
- package/src/services/blobs/blob-store.ts +359 -0
- package/src/services/blobs/blob.fixture.ts +90 -0
- package/src/services/blobs/index.ts +70 -0
- package/src/services/database/cache-engine.ts +199 -0
- package/src/services/database/connection-supervisor.test.ts +318 -0
- package/src/services/database/connection-supervisor.ts +422 -0
- package/src/services/database/database.query-timeout.test.ts +140 -0
- package/src/services/database/database.responses.test.ts +43 -0
- package/src/services/database/database.ts +146 -61
- package/src/services/database/engine-factory.ts +33 -0
- package/src/services/database/errors.ts +34 -0
- package/src/services/database/events/index.ts +2 -1
- package/src/services/database/index.ts +7 -0
- package/src/services/database/landed-body-clear.integration.test.ts +236 -0
- package/src/services/database/local-migrator.integration.test.ts +110 -0
- package/src/services/database/local-migrator.ts +59 -16
- package/src/services/database/local.test.ts +64 -0
- package/src/services/database/local.ts +487 -63
- package/src/services/database/plan-render.test.ts +159 -0
- package/src/services/database/plan-render.ts +108 -0
- package/src/services/database/relation-resolver.test.ts +484 -0
- package/src/services/database/relation-resolver.ts +0 -0
- package/src/services/database/remote.ts +255 -6
- package/src/services/database/sqlite-cache-engine.test.ts +617 -0
- package/src/services/database/sqlite-cache-engine.timeout.test.ts +61 -0
- package/src/services/database/sqlite-cache-engine.ts +1372 -0
- package/src/services/database/sqlite-devtools-queries.integration.test.ts +143 -0
- package/src/services/database/sqlite-devtools-queries.test.ts +154 -0
- package/src/services/database/sqlite-lock-verify.test.ts +33 -0
- package/src/services/database/sqlite-lock-verify.ts +45 -0
- package/src/services/database/sqlite-open.test.ts +150 -0
- package/src/services/database/sqlite-open.ts +164 -0
- package/src/services/database/sqlite-plan-sql.test.ts +145 -0
- package/src/services/database/sqlite-plan-sql.ts +182 -0
- package/src/services/database/sqlite-projection.test.ts +121 -0
- package/src/services/database/sqlite-select.integration.test.ts +185 -0
- package/src/services/database/sqlite-select.test.ts +261 -0
- package/src/services/database/sqlite-select.ts +131 -0
- package/src/services/database/sqlite-transport.fixture.ts +30 -0
- package/src/services/database/sqlite-transport.ts +224 -0
- package/src/services/database/sqlite-worker.ts +437 -0
- package/src/services/database/surql-translate.ts +416 -0
- package/src/services/database/surreal-cache-engine.ts +161 -0
- package/src/services/logger/index.test.ts +132 -0
- package/src/services/logger/index.ts +189 -7
- package/src/services/persistence/localstorage.ts +2 -2
- package/src/services/persistence/resilient.ts +10 -3
- package/src/services/persistence/surrealdb.ts +4 -4
- package/src/services/stream-processor/index.ts +783 -68
- package/src/services/stream-processor/permissions.test.ts +47 -0
- package/src/services/stream-processor/permissions.ts +53 -0
- package/src/services/stream-processor/stream-processor.batch.test.ts +186 -0
- package/src/services/stream-processor/stream-processor.prime.test.ts +198 -0
- package/src/services/stream-processor/stream-processor.reset.test.ts +226 -0
- package/src/services/stream-processor/stream-processor.test.ts +1 -1
- package/src/services/stream-processor/wasm-types.ts +58 -2
- package/src/services/tabs/broker-client.ts +283 -0
- package/src/services/tabs/broker.test.ts +327 -0
- package/src/services/tabs/coordinator.test.ts +386 -0
- package/src/services/tabs/coordinator.ts +638 -0
- package/src/services/tabs/fake-ports.fixture.ts +112 -0
- package/src/services/tabs/leader-locks.ts +75 -0
- package/src/services/tabs/protocol.ts +262 -0
- package/src/services/tabs/support.ts +36 -0
- package/src/services/tabs/tabs-broker-worker.ts +640 -0
- package/src/sp00ky.ts +5 -395
- package/src/state/client-state.ts +200 -0
- package/src/state/lifecycle.test.ts +141 -0
- package/src/state/lifecycle.ts +99 -0
- package/src/state/reducers.test.ts +304 -0
- package/src/state/reducers.ts +526 -0
- package/src/state/selectors.test.ts +175 -0
- package/src/state/selectors.ts +222 -0
- package/src/sw/index.test.ts +582 -0
- package/src/sw/index.ts +607 -0
- package/src/sw/store.ts +96 -0
- package/src/sync/connection.saga.test.ts +86 -0
- package/src/sync/connection.saga.ts +85 -0
- package/src/sync/live.saga.test.ts +178 -0
- package/src/sync/live.saga.ts +107 -0
- package/src/sync/policy.health.test.ts +56 -0
- package/src/sync/policy.test.ts +659 -0
- package/src/sync/policy.ts +502 -0
- package/src/sync/poll.saga.test.ts +51 -0
- package/src/sync/poll.saga.ts +36 -0
- package/src/sync/tabs.saga.test.ts +78 -0
- package/src/sync/tabs.saga.ts +96 -0
- package/src/testing/adapters.ts +133 -0
- package/src/testing/build.ts +63 -0
- package/src/testing/fake-services.ts +48 -0
- package/src/testing/run-pure.test.ts +92 -0
- package/src/testing/run-pure.ts +128 -0
- package/src/testing/services.ts +17 -0
- package/src/types.ts +624 -10
- package/src/utils/blurhash.ts +90 -0
- package/src/utils/edges.ts +39 -0
- package/src/utils/error-classification.test.ts +54 -0
- package/src/utils/error-classification.ts +25 -0
- package/src/utils/index.ts +78 -12
- package/src/utils/parser.test.ts +67 -102
- package/src/utils/parser.ts +64 -2
- package/src/utils/semver.test.ts +32 -0
- package/src/utils/semver.ts +30 -0
- package/src/utils/sha256.ts +15 -0
- package/src/utils/surql.ts +30 -18
- package/src/utils/utils.test.ts +3 -2
- package/tsdown.config.ts +117 -3
- package/vitest.config.ts +48 -0
- package/src/modules/cache/index.ts +0 -241
- package/src/modules/cache/types.ts +0 -19
- package/src/modules/data/data.test.ts +0 -58
- package/src/modules/data/index.ts +0 -879
- package/src/modules/sync/engine.ts +0 -173
- package/src/modules/sync/events/index.ts +0 -77
- package/src/modules/sync/index.ts +0 -3
- package/src/modules/sync/queue/index.ts +0 -2
- package/src/modules/sync/queue/queue-down.ts +0 -89
- package/src/modules/sync/queue/queue-up.ts +0 -223
- package/src/modules/sync/scheduler.ts +0 -84
- package/src/modules/sync/sync.ts +0 -421
- package/src/modules/sync/utils.test.ts +0 -311
- package/src/modules/sync/utils.ts +0 -167
package/dist/live.d.ts
ADDED
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { r as RefMode } from "./worker-ref-tables.js";
|
|
2
|
+
import { SchemaStructure } from "@spooky-sync/query-builder";
|
|
3
|
+
|
|
4
|
+
//#region src/live/index.d.ts
|
|
5
|
+
type LiveToken = string | null | undefined;
|
|
6
|
+
/** A token, or a function returning one (called on every connect). */
|
|
7
|
+
type LiveTokenSource = string | (() => LiveToken | Promise<LiveToken>);
|
|
8
|
+
/** The subset of the `surrealdb` SDK's `Surreal` the feed drives. */
|
|
9
|
+
interface LiveSurreal {
|
|
10
|
+
connect(url: string, options?: Record<string, unknown>): Promise<unknown>;
|
|
11
|
+
use(what: {
|
|
12
|
+
namespace: string;
|
|
13
|
+
database: string;
|
|
14
|
+
}): Promise<unknown>;
|
|
15
|
+
authenticate(token: string): Promise<unknown>;
|
|
16
|
+
query(sql: string, vars?: Record<string, unknown>): PromiseLike<unknown>;
|
|
17
|
+
liveOf(id: never): PromiseLike<LiveStreamLike>;
|
|
18
|
+
close(): Promise<unknown>;
|
|
19
|
+
subscribe?(event: string, listener: (...args: unknown[]) => void): () => void;
|
|
20
|
+
}
|
|
21
|
+
interface LiveStreamLike {
|
|
22
|
+
subscribe(handler: (message: LiveMessageLike) => void): () => void;
|
|
23
|
+
kill?(): Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
interface LiveMessageLike {
|
|
26
|
+
action: string;
|
|
27
|
+
value: unknown;
|
|
28
|
+
}
|
|
29
|
+
interface LiveFeedOptions {
|
|
30
|
+
/** SurrealDB endpoint, `wss://host/rpc` (http(s) is rewritten to ws(s)). */
|
|
31
|
+
endpoint: string;
|
|
32
|
+
namespace: string;
|
|
33
|
+
database: string;
|
|
34
|
+
/**
|
|
35
|
+
* The session token (`db.auth.token` on the page, `getBridgedToken()` in the
|
|
36
|
+
* service worker). None: the anonymous `_00_list_ref_anon` table, which
|
|
37
|
+
* needs `anonymousLiveQueries` on the server.
|
|
38
|
+
*/
|
|
39
|
+
token?: LiveTokenSource;
|
|
40
|
+
/** `_00_list_ref` layout. Default `dedicated` (one table per user), as the SSP. */
|
|
41
|
+
refMode?: RefMode;
|
|
42
|
+
/** View ttl sent with every registration. Default `10m`, the full client's. */
|
|
43
|
+
ttl?: string;
|
|
44
|
+
/** Salt of the `_00_query` keys. Default: a fresh random id per feed. */
|
|
45
|
+
sessionId?: string;
|
|
46
|
+
/**
|
|
47
|
+
* The generated schema. Used to type query params (record ids, datetimes)
|
|
48
|
+
* exactly like the full client does before registering. Taken from a query
|
|
49
|
+
* builder's own schema when omitted.
|
|
50
|
+
*/
|
|
51
|
+
schema?: SchemaStructure;
|
|
52
|
+
/** The server refused the token. Called once, before the connect rejects. */
|
|
53
|
+
onUnauthorized?: (error: unknown) => void | Promise<void>;
|
|
54
|
+
/** Background failures (LIVE, heartbeat, re-reads). Never thrown. */
|
|
55
|
+
onError?: (error: unknown) => void;
|
|
56
|
+
/** Deadline for every statement, ms. Default 15000. */
|
|
57
|
+
timeoutMs?: number;
|
|
58
|
+
/** Bring your own SDK client (tests, a custom WebSocket implementation). */
|
|
59
|
+
surreal?: LiveSurreal | (() => LiveSurreal);
|
|
60
|
+
}
|
|
61
|
+
/** `{ surql, params }`, or anything the query builder builds (`FinalQuery`, `InnerQuery`). */
|
|
62
|
+
type LiveQuery = {
|
|
63
|
+
surql: string;
|
|
64
|
+
params?: Record<string, unknown>;
|
|
65
|
+
table?: string;
|
|
66
|
+
} | BuiltQueryLike;
|
|
67
|
+
interface SelectInfoLike {
|
|
68
|
+
query: string;
|
|
69
|
+
vars?: Record<string, unknown>;
|
|
70
|
+
}
|
|
71
|
+
interface InnerQueryLike {
|
|
72
|
+
selectQuery: SelectInfoLike;
|
|
73
|
+
tableName: string;
|
|
74
|
+
}
|
|
75
|
+
/** A `FinalQuery` (via its `innerQuery`) or an `InnerQuery`. */
|
|
76
|
+
type BuiltQueryLike = {
|
|
77
|
+
innerQuery: InnerQueryLike;
|
|
78
|
+
} | InnerQueryLike;
|
|
79
|
+
interface LiveChange<T> {
|
|
80
|
+
added: T[];
|
|
81
|
+
updated: T[];
|
|
82
|
+
/** The last known body of each row that left the set. */
|
|
83
|
+
removed: T[];
|
|
84
|
+
}
|
|
85
|
+
interface LiveHandlers<T> {
|
|
86
|
+
/** The whole current set: once when it first loads, then after every change. */
|
|
87
|
+
onSet(rows: T[]): void;
|
|
88
|
+
/** What changed, after the first set. */
|
|
89
|
+
onChange?(change: LiveChange<T>): void;
|
|
90
|
+
/** The registration or a later re-read failed. */
|
|
91
|
+
onError?(error: unknown): void;
|
|
92
|
+
}
|
|
93
|
+
interface LiveFeedSubscription<T> {
|
|
94
|
+
/** The first full set; rejects when the registration failed. */
|
|
95
|
+
readonly ready: Promise<T[]>;
|
|
96
|
+
/** The current rows, unordered. Empty until `ready`. */
|
|
97
|
+
rows(): T[];
|
|
98
|
+
/** The view's `_00_query` key, once computed. */
|
|
99
|
+
readonly key: string | null;
|
|
100
|
+
/** Stop listening; releases the server view when nobody else on this feed watches it. */
|
|
101
|
+
unsubscribe(): Promise<void>;
|
|
102
|
+
}
|
|
103
|
+
interface LiveIdleOptions {
|
|
104
|
+
/** Give up after this long and resolve `false`. Default 10000. */
|
|
105
|
+
timeoutMs?: number;
|
|
106
|
+
/** How long nothing must have arrived. Default 300. */
|
|
107
|
+
quietMs?: number;
|
|
108
|
+
}
|
|
109
|
+
interface LiveFeed {
|
|
110
|
+
subscribe<T = Record<string, unknown>>(query: LiveQuery, handlers: LiveHandlers<T>): LiveFeedSubscription<T>;
|
|
111
|
+
/** Run statements on the feed's connection (small writes, `fn::push::*`). The SDK's result array. */
|
|
112
|
+
query<T extends unknown[] = unknown[]>(surql: string, vars?: Record<string, unknown>): Promise<T>;
|
|
113
|
+
/** `true` once every subscription has its first set and nothing arrived for `quietMs`. */
|
|
114
|
+
idle(options?: LiveIdleOptions): Promise<boolean>;
|
|
115
|
+
/** Connect now (subscribe/query do it lazily). */
|
|
116
|
+
connect(): Promise<void>;
|
|
117
|
+
/** Release every view, kill LIVE, close the socket. Idempotent. */
|
|
118
|
+
close(): Promise<void>;
|
|
119
|
+
/** `$auth.id` from the token (`user:abc`), null when anonymous. Known after connect. */
|
|
120
|
+
readonly userId: string | null;
|
|
121
|
+
/** The `_00_list_ref` table LIVE watches. Known after connect. */
|
|
122
|
+
readonly listRefTable: string | null;
|
|
123
|
+
readonly closed: boolean;
|
|
124
|
+
}
|
|
125
|
+
type LiveFeedErrorCode = 'closed' | 'unauthorized' | 'connect' | 'register' | 'query';
|
|
126
|
+
declare class LiveFeedError extends Error {
|
|
127
|
+
readonly code: LiveFeedErrorCode;
|
|
128
|
+
readonly cause?: unknown | undefined;
|
|
129
|
+
constructor(code: LiveFeedErrorCode, message: string, cause?: unknown | undefined);
|
|
130
|
+
}
|
|
131
|
+
declare function createLiveFeed(options: LiveFeedOptions): LiveFeed;
|
|
132
|
+
/** The register input the full client derives from the same query. */
|
|
133
|
+
declare function liveQueryInput(query: LiveQuery, schema?: SchemaStructure): {
|
|
134
|
+
table: string;
|
|
135
|
+
surql: string;
|
|
136
|
+
params: Record<string, unknown>;
|
|
137
|
+
};
|
|
138
|
+
/** `http(s)://` becomes `ws(s)://`; a bare host gets `/rpc`. */
|
|
139
|
+
declare function liveEndpoint(endpoint: string): string;
|
|
140
|
+
//#endregion
|
|
141
|
+
export { LiveChange, LiveFeed, LiveFeedError, LiveFeedErrorCode, LiveFeedOptions, LiveFeedSubscription, LiveHandlers, LiveIdleOptions, LiveMessageLike, LiveQuery, LiveStreamLike, LiveSurreal, LiveToken, LiveTokenSource, createLiveFeed, liveEndpoint, liveQueryInput };
|