solid-objects 0.13.3 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (151) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +212 -67
  3. package/dist/actor.d.ts +1 -0
  4. package/dist/actor.d.ts.map +1 -1
  5. package/dist/actor.js +9 -0
  6. package/dist/actor.js.map +1 -1
  7. package/dist/broadcast-worker.d.ts +1 -1
  8. package/dist/broadcast-worker.d.ts.map +1 -1
  9. package/dist/broadcast-worker.js +1 -1
  10. package/dist/broadcast-worker.js.map +1 -1
  11. package/dist/broken-pipe.d.ts +5 -0
  12. package/dist/broken-pipe.d.ts.map +1 -0
  13. package/dist/broken-pipe.js +8 -0
  14. package/dist/broken-pipe.js.map +1 -0
  15. package/dist/browser/host.d.ts +8 -0
  16. package/dist/browser/host.d.ts.map +1 -0
  17. package/dist/browser/host.js +22 -0
  18. package/dist/browser/host.js.map +1 -0
  19. package/dist/browser/tab-host.d.ts +43 -0
  20. package/dist/browser/tab-host.d.ts.map +1 -0
  21. package/dist/browser/tab-host.js +196 -0
  22. package/dist/browser/tab-host.js.map +1 -0
  23. package/dist/cli.d.ts +1 -0
  24. package/dist/cli.d.ts.map +1 -1
  25. package/dist/cli.js +6 -3
  26. package/dist/cli.js.map +1 -1
  27. package/dist/context.js +2 -2
  28. package/dist/context.js.map +1 -1
  29. package/dist/database/deadline.js +2 -2
  30. package/dist/database/deadline.js.map +1 -1
  31. package/dist/database/mysql.d.ts +1 -0
  32. package/dist/database/mysql.d.ts.map +1 -1
  33. package/dist/database/mysql.js +1 -0
  34. package/dist/database/mysql.js.map +1 -1
  35. package/dist/database/postgresql.d.ts +1 -0
  36. package/dist/database/postgresql.d.ts.map +1 -1
  37. package/dist/database/postgresql.js +1 -0
  38. package/dist/database/postgresql.js.map +1 -1
  39. package/dist/database/shared-sqlite-wasm.d.ts +74 -0
  40. package/dist/database/shared-sqlite-wasm.d.ts.map +1 -0
  41. package/dist/database/shared-sqlite-wasm.js +542 -0
  42. package/dist/database/shared-sqlite-wasm.js.map +1 -0
  43. package/dist/database/sqlite-wasm.d.ts +30 -0
  44. package/dist/database/sqlite-wasm.d.ts.map +1 -0
  45. package/dist/database/sqlite-wasm.js +185 -0
  46. package/dist/database/sqlite-wasm.js.map +1 -0
  47. package/dist/database/sqlite.d.ts +1 -0
  48. package/dist/database/sqlite.d.ts.map +1 -1
  49. package/dist/database/sqlite.js +1 -0
  50. package/dist/database/sqlite.js.map +1 -1
  51. package/dist/database/transaction-context.js +2 -2
  52. package/dist/database/transaction-context.js.map +1 -1
  53. package/dist/doctor.js +1 -1
  54. package/dist/doctor.js.map +1 -1
  55. package/dist/effect-worker.d.ts +1 -1
  56. package/dist/effect-worker.d.ts.map +1 -1
  57. package/dist/effect-worker.js +1 -1
  58. package/dist/effect-worker.js.map +1 -1
  59. package/dist/examples/quickstart-report.js +127 -0
  60. package/dist/examples/quickstart-report.js.map +1 -0
  61. package/dist/examples/sqlite-quickstart.js +59 -7
  62. package/dist/examples/sqlite-quickstart.js.map +1 -1
  63. package/dist/executable.js +4 -0
  64. package/dist/executable.js.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/platform/context-store.d.ts +11 -0
  70. package/dist/platform/context-store.d.ts.map +1 -0
  71. package/dist/platform/context-store.js +28 -0
  72. package/dist/platform/context-store.js.map +1 -0
  73. package/dist/platform/host-identity.d.ts +11 -0
  74. package/dist/platform/host-identity.d.ts.map +1 -0
  75. package/dist/platform/host-identity.js +17 -0
  76. package/dist/platform/host-identity.js.map +1 -0
  77. package/dist/platform/node.d.ts +2 -0
  78. package/dist/platform/node.d.ts.map +1 -0
  79. package/dist/platform/node.js +11 -0
  80. package/dist/platform/node.js.map +1 -0
  81. package/dist/platform/turn-context-store.d.ts +7 -0
  82. package/dist/platform/turn-context-store.d.ts.map +1 -0
  83. package/dist/platform/turn-context-store.js +17 -0
  84. package/dist/platform/turn-context-store.js.map +1 -0
  85. package/dist/platform/uuid.d.ts +2 -0
  86. package/dist/platform/uuid.d.ts.map +1 -0
  87. package/dist/platform/uuid.js +4 -0
  88. package/dist/platform/uuid.js.map +1 -0
  89. package/dist/platform/web-locks.d.ts +2 -0
  90. package/dist/platform/web-locks.d.ts.map +1 -0
  91. package/dist/platform/web-locks.js +8 -0
  92. package/dist/platform/web-locks.js.map +1 -0
  93. package/dist/reference.d.ts +16 -1
  94. package/dist/reference.d.ts.map +1 -1
  95. package/dist/reference.js +12 -0
  96. package/dist/reference.js.map +1 -1
  97. package/dist/reminder-scheduler.d.ts +1 -1
  98. package/dist/reminder-scheduler.d.ts.map +1 -1
  99. package/dist/reminder-scheduler.js +1 -1
  100. package/dist/reminder-scheduler.js.map +1 -1
  101. package/dist/repository.d.ts.map +1 -1
  102. package/dist/repository.js +13 -6
  103. package/dist/repository.js.map +1 -1
  104. package/dist/runtime.d.ts +25 -1
  105. package/dist/runtime.d.ts.map +1 -1
  106. package/dist/runtime.js +62 -1
  107. package/dist/runtime.js.map +1 -1
  108. package/dist/serialization.d.ts.map +1 -1
  109. package/dist/serialization.js +2 -1
  110. package/dist/serialization.js.map +1 -1
  111. package/dist/signals.d.ts +9 -0
  112. package/dist/signals.d.ts.map +1 -0
  113. package/dist/signals.js +299 -0
  114. package/dist/signals.js.map +1 -0
  115. package/dist/transmit-effect.d.ts +2 -0
  116. package/dist/transmit-effect.d.ts.map +1 -0
  117. package/dist/transmit-effect.js +2 -0
  118. package/dist/transmit-effect.js.map +1 -0
  119. package/dist/transmit.d.ts +27 -0
  120. package/dist/transmit.d.ts.map +1 -0
  121. package/dist/transmit.js +105 -0
  122. package/dist/transmit.js.map +1 -0
  123. package/dist/version.d.ts +1 -1
  124. package/dist/version.js +1 -1
  125. package/dist/web/index.d.ts +1 -0
  126. package/dist/web/index.d.ts.map +1 -1
  127. package/dist/web/index.js +1 -0
  128. package/dist/web/index.js.map +1 -1
  129. package/dist/worker.d.ts +1 -1
  130. package/dist/worker.d.ts.map +1 -1
  131. package/dist/worker.js +1 -1
  132. package/dist/worker.js.map +1 -1
  133. package/docs/api.md +262 -20
  134. package/docs/architecture.md +50 -23
  135. package/docs/authorization.md +6 -5
  136. package/docs/benchmarks.md +87 -65
  137. package/docs/browser-protocol.md +62 -3
  138. package/docs/comparisons.md +14 -9
  139. package/docs/configuration.md +2 -2
  140. package/docs/correctness.md +30 -17
  141. package/docs/dashboard.md +6 -6
  142. package/docs/errors-and-recovery.md +12 -12
  143. package/docs/fit.md +5 -0
  144. package/docs/operations.md +33 -19
  145. package/docs/parity.md +137 -47
  146. package/docs/releasing.md +6 -6
  147. package/docs/state-and-lifecycle.md +12 -8
  148. package/docs/support.md +60 -20
  149. package/examples/quickstart-report.ts +151 -0
  150. package/examples/sqlite-quickstart.ts +76 -16
  151. package/package.json +37 -2
@@ -0,0 +1,74 @@
1
+ import type { Database, DatabaseConnection } from "./types.js";
2
+ export interface SharedSQLiteWasmDatabaseOptions {
3
+ path: string;
4
+ name?: string;
5
+ storage?: "temporary" | "persistent";
6
+ requestTimeoutMilliseconds?: number;
7
+ retryIntervalMilliseconds?: number;
8
+ sessionIdleTimeoutMilliseconds?: number;
9
+ openAttempts?: number;
10
+ onError?: (error: Error) => void;
11
+ }
12
+ export declare class SharedDatabaseFailover extends Error {
13
+ constructor();
14
+ }
15
+ export declare class SharedDatabaseUnavailable extends Error {
16
+ constructor(message: string);
17
+ }
18
+ type StatementOperation = "run" | "get" | "all" | "now";
19
+ export declare function sharedSqliteWasm(options: SharedSQLiteWasmDatabaseOptions): SharedSQLiteWasmDatabase;
20
+ export declare class SharedSQLiteWasmDatabase implements Database {
21
+ readonly family: "sqlite";
22
+ readonly schemaIdentity = "solid-objects-wasm-v1";
23
+ private readonly options;
24
+ private readonly channel;
25
+ private readonly electionAbort;
26
+ private readonly pending;
27
+ private readonly holderSessions;
28
+ private readonly epochWaiters;
29
+ private readonly electionLoop;
30
+ private roleValue;
31
+ private currentEpoch;
32
+ private underlying;
33
+ private releaseHold;
34
+ private pingTimer;
35
+ private closed;
36
+ constructor(options: SharedSQLiteWasmDatabaseOptions);
37
+ role(): "connecting" | "holder" | "remote";
38
+ connection<Result>(callback: (connection: DatabaseConnection) => Promise<Result>): Promise<Result>;
39
+ transaction<Result>(callback: (connection: DatabaseConnection) => Promise<Result>): Promise<Result>;
40
+ private dispatchSession;
41
+ transactionActive(): boolean;
42
+ close(): Promise<void>;
43
+ private remoteSession;
44
+ sendStatement(input: {
45
+ sessionId: string;
46
+ epoch: string;
47
+ operation: StatementOperation;
48
+ sql: string;
49
+ parameters: readonly unknown[];
50
+ }): Promise<unknown>;
51
+ private request;
52
+ private requireEpoch;
53
+ private adoptEpoch;
54
+ private rejectInFlight;
55
+ private receive;
56
+ private handleOpen;
57
+ private handleStatement;
58
+ private handleClose;
59
+ private touchSession;
60
+ private dropSession;
61
+ private runElection;
62
+ private serveAsHolder;
63
+ private openUnderlyingWithRetry;
64
+ private respond;
65
+ private post;
66
+ private stopPinging;
67
+ private electionName;
68
+ private storageMode;
69
+ private requestTimeoutMilliseconds;
70
+ private retryIntervalMilliseconds;
71
+ private sessionIdleTimeoutMilliseconds;
72
+ }
73
+ export {};
74
+ //# sourceMappingURL=shared-sqlite-wasm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-sqlite-wasm.d.ts","sourceRoot":"","sources":["../../src/database/shared-sqlite-wasm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,542 @@
1
+ import { randomUUID } from "../platform/uuid.js";
2
+ import { requireWebLocks } from "../platform/web-locks.js";
3
+ import { DatabaseDeadlineExceeded } from "../errors.js";
4
+ import { requireDatabaseDeadlineRemaining } from "./deadline.js";
5
+ import { databaseTransactionActive, withDatabaseTransaction } from "./transaction-context.js";
6
+ import { sqliteWasm } from "./sqlite-wasm.js";
7
+ const PROTOCOL = "solid-objects-shared-sqlite";
8
+ const VERSION = 1;
9
+ const NAME_PREFIX = "solid-objects:shared-sqlite:";
10
+ export class SharedDatabaseFailover extends Error {
11
+ constructor() {
12
+ super("the shared SQLite database failed over; retry the operation");
13
+ this.name = "SharedDatabaseFailover";
14
+ }
15
+ }
16
+ export class SharedDatabaseUnavailable extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = "SharedDatabaseUnavailable";
20
+ }
21
+ }
22
+ class SessionOpenRejected extends Error {
23
+ reason;
24
+ constructor(reason) {
25
+ super(reason.message);
26
+ this.reason = reason;
27
+ this.name = "SessionOpenRejected";
28
+ }
29
+ }
30
+ class RollbackSignal extends Error {
31
+ constructor() {
32
+ super("rollback requested");
33
+ this.name = "RollbackSignal";
34
+ }
35
+ }
36
+ export function sharedSqliteWasm(options) {
37
+ return new SharedSQLiteWasmDatabase(options);
38
+ }
39
+ export class SharedSQLiteWasmDatabase {
40
+ family = "sqlite";
41
+ schemaIdentity = "solid-objects-wasm-v1";
42
+ options;
43
+ channel;
44
+ electionAbort = new AbortController();
45
+ pending = new Map();
46
+ holderSessions = new Map();
47
+ epochWaiters = [];
48
+ electionLoop;
49
+ roleValue = "connecting";
50
+ currentEpoch;
51
+ underlying;
52
+ releaseHold;
53
+ pingTimer;
54
+ closed = false;
55
+ constructor(options) {
56
+ this.options = options;
57
+ this.channel = new BroadcastChannel(`${NAME_PREFIX}${this.electionName()}`);
58
+ this.channel.onmessage = (event) => {
59
+ const message = parseSharedMessage(event.data);
60
+ if (message)
61
+ void this.receive(message);
62
+ };
63
+ this.pingTimer = setInterval(() => {
64
+ if (this.currentEpoch !== undefined || this.roleValue === "holder") {
65
+ this.stopPinging();
66
+ return;
67
+ }
68
+ this.post({ ...envelope(), kind: "ping", requestId: randomUUID() });
69
+ }, this.retryIntervalMilliseconds());
70
+ this.electionLoop = this.runElection();
71
+ }
72
+ role() {
73
+ return this.roleValue;
74
+ }
75
+ async connection(callback) {
76
+ return this.dispatchSession({ mode: "connection", callback });
77
+ }
78
+ async transaction(callback) {
79
+ return withDatabaseTransaction(this, () => this.dispatchSession({ mode: "transaction", callback }));
80
+ }
81
+ async dispatchSession(input) {
82
+ const attempts = 3;
83
+ for (let attempt = 0;; attempt += 1) {
84
+ if (this.roleValue === "holder" && this.underlying) {
85
+ return input.mode === "transaction"
86
+ ? this.underlying.transaction(input.callback)
87
+ : this.underlying.connection(input.callback);
88
+ }
89
+ try {
90
+ return await this.remoteSession(input);
91
+ }
92
+ catch (error) {
93
+ if (!(error instanceof SessionOpenRejected))
94
+ throw error;
95
+ if (attempt >= attempts - 1)
96
+ throw error.reason;
97
+ requireDatabaseDeadlineRemaining();
98
+ await delay(this.retryIntervalMilliseconds());
99
+ }
100
+ }
101
+ }
102
+ transactionActive() {
103
+ return databaseTransactionActive(this);
104
+ }
105
+ async close() {
106
+ if (this.closed)
107
+ return;
108
+ this.closed = true;
109
+ this.stopPinging();
110
+ this.electionAbort.abort();
111
+ this.releaseHold?.();
112
+ this.rejectInFlight(new SharedDatabaseUnavailable("the shared SQLite database is closed"));
113
+ await this.electionLoop.catch(() => undefined);
114
+ this.channel.onmessage = null;
115
+ this.channel.close();
116
+ }
117
+ async remoteSession(input) {
118
+ const initialRemaining = requireDatabaseDeadlineRemaining();
119
+ const deadlineExpiresAtMilliseconds = initialRemaining === undefined ? undefined : performance.now() + initialRemaining;
120
+ const epoch = await this.requireEpoch().catch((error) => {
121
+ throw new SessionOpenRejected(error);
122
+ });
123
+ const sessionId = randomUUID();
124
+ await this.request({
125
+ ...envelope(),
126
+ kind: "open",
127
+ requestId: randomUUID(),
128
+ epoch,
129
+ sessionId,
130
+ mode: input.mode,
131
+ }).catch((error) => {
132
+ throw new SessionOpenRejected(error);
133
+ });
134
+ const connection = new SharedRemoteConnection({
135
+ database: this,
136
+ sessionId,
137
+ epoch,
138
+ deadlineExpiresAtMilliseconds,
139
+ });
140
+ try {
141
+ const result = await input.callback(connection);
142
+ requireDatabaseDeadlineRemaining();
143
+ requireCapturedDeadline(deadlineExpiresAtMilliseconds);
144
+ await this.request({
145
+ ...envelope(),
146
+ kind: "close",
147
+ requestId: randomUUID(),
148
+ epoch,
149
+ sessionId,
150
+ outcome: input.mode === "transaction" ? "commit" : "end",
151
+ });
152
+ return result;
153
+ }
154
+ catch (error) {
155
+ await this.request({
156
+ ...envelope(),
157
+ kind: "close",
158
+ requestId: randomUUID(),
159
+ epoch,
160
+ sessionId,
161
+ outcome: input.mode === "transaction" ? "rollback" : "end",
162
+ }).catch(() => undefined);
163
+ throw error;
164
+ }
165
+ }
166
+ sendStatement(input) {
167
+ return this.request({
168
+ ...envelope(),
169
+ kind: "statement",
170
+ requestId: randomUUID(),
171
+ epoch: input.epoch,
172
+ sessionId: input.sessionId,
173
+ operation: input.operation,
174
+ sql: input.sql,
175
+ parameters: input.parameters,
176
+ });
177
+ }
178
+ request(message) {
179
+ if (this.closed) {
180
+ return Promise.reject(new SharedDatabaseUnavailable("the shared SQLite database is closed"));
181
+ }
182
+ return new Promise((resolve, reject) => {
183
+ const timer = setTimeout(() => {
184
+ this.pending.delete(message.requestId);
185
+ reject(new SharedDatabaseUnavailable(`no shared SQLite database holder answered within ${this.requestTimeoutMilliseconds()}ms`));
186
+ }, this.requestTimeoutMilliseconds());
187
+ this.pending.set(message.requestId, { epoch: message.epoch, resolve, reject, timer });
188
+ this.post(message);
189
+ });
190
+ }
191
+ async requireEpoch() {
192
+ if (this.currentEpoch !== undefined)
193
+ return this.currentEpoch;
194
+ return new Promise((resolve, reject) => {
195
+ const timer = setTimeout(() => {
196
+ const index = this.epochWaiters.indexOf(waiter);
197
+ if (index >= 0)
198
+ this.epochWaiters.splice(index, 1);
199
+ reject(new SharedDatabaseUnavailable(`no shared SQLite database holder announced within ${this.requestTimeoutMilliseconds()}ms`));
200
+ }, this.requestTimeoutMilliseconds());
201
+ const waiter = (epoch) => {
202
+ clearTimeout(timer);
203
+ resolve(epoch);
204
+ };
205
+ this.epochWaiters.push(waiter);
206
+ });
207
+ }
208
+ adoptEpoch(epoch) {
209
+ if (this.currentEpoch === epoch)
210
+ return;
211
+ if (this.currentEpoch !== undefined)
212
+ this.rejectInFlight(new SharedDatabaseFailover());
213
+ this.currentEpoch = epoch;
214
+ if (this.roleValue !== "holder")
215
+ this.roleValue = "remote";
216
+ this.stopPinging();
217
+ for (const waiter of this.epochWaiters.splice(0))
218
+ waiter(epoch);
219
+ }
220
+ rejectInFlight(error) {
221
+ for (const [requestId, entry] of [...this.pending]) {
222
+ this.pending.delete(requestId);
223
+ clearTimeout(entry.timer);
224
+ entry.reject(error);
225
+ }
226
+ }
227
+ async receive(message) {
228
+ if (message.kind === "result") {
229
+ const entry = this.pending.get(message.requestId);
230
+ if (!entry)
231
+ return;
232
+ this.pending.delete(message.requestId);
233
+ clearTimeout(entry.timer);
234
+ if (message.outcome.ok)
235
+ entry.resolve(message.outcome.value);
236
+ else
237
+ entry.reject(rebuildError(message.outcome.error));
238
+ return;
239
+ }
240
+ if (message.kind === "holder-online" || message.kind === "pong") {
241
+ if (this.roleValue !== "holder")
242
+ this.adoptEpoch(message.epoch);
243
+ return;
244
+ }
245
+ if (this.roleValue !== "holder" || this.currentEpoch === undefined)
246
+ return;
247
+ if (message.kind === "ping") {
248
+ this.post({
249
+ ...envelope(),
250
+ kind: "pong",
251
+ requestId: message.requestId,
252
+ epoch: this.currentEpoch,
253
+ });
254
+ return;
255
+ }
256
+ if (message.epoch !== this.currentEpoch) {
257
+ this.respond(message.requestId, {
258
+ ok: false,
259
+ error: describeError(new SharedDatabaseFailover()),
260
+ });
261
+ return;
262
+ }
263
+ if (message.kind === "open")
264
+ await this.handleOpen(message);
265
+ else if (message.kind === "statement")
266
+ await this.handleStatement(message);
267
+ else
268
+ await this.handleClose(message);
269
+ }
270
+ async handleOpen(message) {
271
+ const underlying = this.underlying;
272
+ if (!underlying)
273
+ return;
274
+ let finishResolve = () => { };
275
+ let finishReject = () => { };
276
+ const done = new Promise((resolve, reject) => {
277
+ finishResolve = resolve;
278
+ finishReject = reject;
279
+ });
280
+ let ready = () => { };
281
+ const acquired = new Promise((resolve) => {
282
+ ready = resolve;
283
+ });
284
+ const runner = message.mode === "transaction"
285
+ ? underlying.transaction.bind(underlying)
286
+ : underlying.connection.bind(underlying);
287
+ const session = {
288
+ finishResolve,
289
+ finishReject,
290
+ settled: runner(async (connection) => {
291
+ session.connection = connection;
292
+ ready(session);
293
+ await done;
294
+ return null;
295
+ }),
296
+ };
297
+ session.settled.catch(() => undefined);
298
+ this.holderSessions.set(message.sessionId, session);
299
+ await acquired;
300
+ this.touchSession(message.sessionId);
301
+ this.respond(message.requestId, { ok: true, value: null });
302
+ }
303
+ async handleStatement(message) {
304
+ const session = this.holderSessions.get(message.sessionId);
305
+ if (!session?.connection) {
306
+ this.respond(message.requestId, {
307
+ ok: false,
308
+ error: describeError(new SharedDatabaseFailover()),
309
+ });
310
+ return;
311
+ }
312
+ this.touchSession(message.sessionId);
313
+ try {
314
+ const value = await executeStatement({ connection: session.connection, message });
315
+ this.respond(message.requestId, { ok: true, value });
316
+ }
317
+ catch (error) {
318
+ this.respond(message.requestId, { ok: false, error: describeError(error) });
319
+ }
320
+ }
321
+ async handleClose(message) {
322
+ const session = this.holderSessions.get(message.sessionId);
323
+ if (!session) {
324
+ this.respond(message.requestId, { ok: true, value: null });
325
+ return;
326
+ }
327
+ this.dropSession(message.sessionId);
328
+ if (message.outcome === "rollback") {
329
+ session.finishReject(new RollbackSignal());
330
+ await session.settled.catch(() => undefined);
331
+ this.respond(message.requestId, { ok: true, value: null });
332
+ return;
333
+ }
334
+ session.finishResolve();
335
+ try {
336
+ await session.settled;
337
+ this.respond(message.requestId, { ok: true, value: null });
338
+ }
339
+ catch (error) {
340
+ this.respond(message.requestId, { ok: false, error: describeError(error) });
341
+ }
342
+ }
343
+ touchSession(sessionId) {
344
+ const session = this.holderSessions.get(sessionId);
345
+ if (!session)
346
+ return;
347
+ if (session.watchdog)
348
+ clearTimeout(session.watchdog);
349
+ session.watchdog = setTimeout(() => {
350
+ this.dropSession(sessionId);
351
+ session.finishReject(new SharedDatabaseUnavailable("the shared SQLite session timed out while idle"));
352
+ }, this.sessionIdleTimeoutMilliseconds());
353
+ }
354
+ dropSession(sessionId) {
355
+ const session = this.holderSessions.get(sessionId);
356
+ if (!session)
357
+ return;
358
+ if (session.watchdog)
359
+ clearTimeout(session.watchdog);
360
+ this.holderSessions.delete(sessionId);
361
+ }
362
+ async runElection() {
363
+ try {
364
+ requireWebLocks();
365
+ }
366
+ catch (error) {
367
+ this.options.onError?.(error instanceof Error ? error : new Error(String(error)));
368
+ return;
369
+ }
370
+ while (!this.closed) {
371
+ try {
372
+ await requireWebLocks().request(`${NAME_PREFIX}${this.electionName()}`, { signal: this.electionAbort.signal }, () => this.serveAsHolder());
373
+ return;
374
+ }
375
+ catch (error) {
376
+ if (this.closed || this.electionAbort.signal.aborted)
377
+ return;
378
+ this.options.onError?.(error instanceof Error ? error : new Error(String(error)));
379
+ await delay(this.retryIntervalMilliseconds());
380
+ }
381
+ }
382
+ }
383
+ async serveAsHolder() {
384
+ if (this.closed)
385
+ return;
386
+ const underlying = await this.openUnderlyingWithRetry();
387
+ if (this.closed) {
388
+ await underlying.close();
389
+ return;
390
+ }
391
+ this.underlying = underlying;
392
+ this.roleValue = "holder";
393
+ this.stopPinging();
394
+ const epoch = randomUUID();
395
+ this.rejectInFlight(new SharedDatabaseFailover());
396
+ this.currentEpoch = epoch;
397
+ for (const waiter of this.epochWaiters.splice(0))
398
+ waiter(epoch);
399
+ this.post({ ...envelope(), kind: "holder-online", epoch });
400
+ await new Promise((resolve) => {
401
+ this.releaseHold = resolve;
402
+ if (this.closed)
403
+ resolve();
404
+ });
405
+ for (const sessionId of [...this.holderSessions.keys()]) {
406
+ const session = this.holderSessions.get(sessionId);
407
+ this.dropSession(sessionId);
408
+ session?.finishReject(new SharedDatabaseUnavailable("the shared SQLite database holder is closed"));
409
+ await session?.settled.catch(() => undefined);
410
+ }
411
+ await underlying.close();
412
+ }
413
+ async openUnderlyingWithRetry() {
414
+ const attempts = this.options.openAttempts ?? 50;
415
+ let lastError;
416
+ for (let attempt = 0; attempt < attempts; attempt += 1) {
417
+ if (this.closed)
418
+ break;
419
+ try {
420
+ return await sqliteWasm({ path: this.options.path, storage: this.storageMode() });
421
+ }
422
+ catch (error) {
423
+ lastError = error;
424
+ await delay(100);
425
+ }
426
+ }
427
+ throw lastError instanceof Error
428
+ ? lastError
429
+ : new SharedDatabaseUnavailable("the shared SQLite pool could not be opened");
430
+ }
431
+ respond(requestId, outcome) {
432
+ this.post({ ...envelope(), kind: "result", requestId, outcome });
433
+ }
434
+ post(message) {
435
+ if (this.closed)
436
+ return;
437
+ this.channel.postMessage(message);
438
+ queueMicrotask(() => {
439
+ void this.receive(message);
440
+ });
441
+ }
442
+ stopPinging() {
443
+ if (this.pingTimer === undefined)
444
+ return;
445
+ clearInterval(this.pingTimer);
446
+ this.pingTimer = undefined;
447
+ }
448
+ electionName() {
449
+ return this.options.name ?? this.options.path;
450
+ }
451
+ storageMode() {
452
+ return this.options.storage ?? (this.options.path === ":memory:" ? "temporary" : "persistent");
453
+ }
454
+ requestTimeoutMilliseconds() {
455
+ return this.options.requestTimeoutMilliseconds ?? 15_000;
456
+ }
457
+ retryIntervalMilliseconds() {
458
+ return this.options.retryIntervalMilliseconds ?? 200;
459
+ }
460
+ sessionIdleTimeoutMilliseconds() {
461
+ return this.options.sessionIdleTimeoutMilliseconds ?? 10_000;
462
+ }
463
+ }
464
+ class SharedRemoteConnection {
465
+ context;
466
+ constructor(context) {
467
+ this.context = context;
468
+ }
469
+ async run(sql, parameters = []) {
470
+ return (await this.statement({ operation: "run", sql, parameters }));
471
+ }
472
+ async get(sql, parameters = []) {
473
+ return (await this.statement({ operation: "get", sql, parameters }));
474
+ }
475
+ async all(sql, parameters = []) {
476
+ return (await this.statement({ operation: "all", sql, parameters }));
477
+ }
478
+ async nowMilliseconds() {
479
+ return (await this.statement({ operation: "now", sql: "", parameters: [] }));
480
+ }
481
+ statement(input) {
482
+ requireDatabaseDeadlineRemaining();
483
+ requireCapturedDeadline(this.context.deadlineExpiresAtMilliseconds);
484
+ return this.context.database.sendStatement({
485
+ sessionId: this.context.sessionId,
486
+ epoch: this.context.epoch,
487
+ operation: input.operation,
488
+ sql: input.sql,
489
+ parameters: input.parameters,
490
+ });
491
+ }
492
+ }
493
+ async function executeStatement(input) {
494
+ const { connection, message } = input;
495
+ if (message.operation === "run")
496
+ return connection.run(message.sql, message.parameters);
497
+ if (message.operation === "get")
498
+ return connection.get(message.sql, message.parameters);
499
+ if (message.operation === "all")
500
+ return connection.all(message.sql, message.parameters);
501
+ return connection.nowMilliseconds();
502
+ }
503
+ function requireCapturedDeadline(expiresAtMilliseconds) {
504
+ if (expiresAtMilliseconds === undefined)
505
+ return;
506
+ if (performance.now() >= expiresAtMilliseconds) {
507
+ throw new DatabaseDeadlineExceeded("database deadline exceeded");
508
+ }
509
+ }
510
+ function envelope() {
511
+ return { protocol: PROTOCOL, version: VERSION };
512
+ }
513
+ function parseSharedMessage(value) {
514
+ if (typeof value !== "object" || value === null)
515
+ return undefined;
516
+ const candidate = value;
517
+ if (candidate.protocol !== PROTOCOL || candidate.version !== VERSION)
518
+ return undefined;
519
+ const kinds = ["ping", "pong", "holder-online", "open", "statement", "close", "result"];
520
+ if (typeof candidate.kind !== "string" || !kinds.includes(candidate.kind))
521
+ return undefined;
522
+ return candidate;
523
+ }
524
+ function describeError(error) {
525
+ if (error instanceof Error)
526
+ return { name: error.name, message: error.message };
527
+ return { name: "Error", message: String(error) };
528
+ }
529
+ function rebuildError(details) {
530
+ if (details.name === "DatabaseDeadlineExceeded") {
531
+ return new DatabaseDeadlineExceeded(details.message);
532
+ }
533
+ if (details.name === "SharedDatabaseFailover")
534
+ return new SharedDatabaseFailover();
535
+ const error = new Error(details.message);
536
+ error.name = details.name;
537
+ return error;
538
+ }
539
+ function delay(milliseconds) {
540
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
541
+ }
542
+ //# sourceMappingURL=shared-sqlite-wasm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-sqlite-wasm.js","sourceRoot":"","sources":["../../src/database/shared-sqlite-wasm.ts"],"names":[],"mappings":"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"}