@welshman/store 0.14.0 → 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.
@@ -7,8 +7,13 @@ export type SqliteMethods = Pick<SqliteEngine, (typeof SQLITE_ENGINE_METHODS)[nu
7
7
  export type SqliteExtension = Record<string, (...args: any[]) => unknown>;
8
8
  /** Builds an app's methods after the engine migrates, so its schema can refer to the engine's. */
9
9
  export type ExtendSqlite<M extends SqliteExtension> = (db: SqliteDatabase, engine: SqliteEngine) => M;
10
+ /** Methods the worker answers itself, over the file the events are kept in. */
11
+ export type SqliteWorkerMethods = {
12
+ /** Discard the database file, leaving an empty one in its place. */
13
+ wipe: () => void;
14
+ };
10
15
  /** The engine's methods and an extension's, which can't shadow them. */
11
- export type SqliteServed<M extends SqliteExtension> = SqliteMethods & Omit<M, keyof SqliteMethods>;
16
+ export type SqliteServed<M extends SqliteExtension> = SqliteWorkerMethods & SqliteMethods & Omit<M, keyof SqliteMethods | keyof SqliteWorkerMethods>;
12
17
  /** Calls a method wherever the database lives, in the order calls are made. */
13
18
  export type SqliteRpc<M extends SqliteExtension = Record<never, never>> = <K extends keyof SqliteServed<M> & string>(method: K, ...args: Parameters<SqliteServed<M>[K]>) => Promise<ReturnType<SqliteServed<M>[K]>>;
14
19
  /** A change a call committed to the database's events, which other connections hear about. */
@@ -47,6 +52,8 @@ export type SqliteOpen = {
47
52
  type: "open";
48
53
  name: string;
49
54
  };
55
+ /** Answers one request, with the change it committed if it made one. */
56
+ export type SqliteResponder = (request: SqliteRequest) => SqliteReply;
50
57
  /** Migrates the engine, then answers requests for its methods and the extension's. */
51
- export declare const createSqliteHandler: <M extends SqliteExtension>(engine: SqliteEngine, extend?: ExtendSqlite<M>) => ({ id, method, args }: SqliteRequest) => SqliteReply;
58
+ export declare const createSqliteHandler: <M extends SqliteExtension>(engine: SqliteEngine, extend?: ExtendSqlite<M>) => SqliteResponder;
52
59
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/protocol.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAC,cAAc,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAC,MAAM,aAAa,CAAA;AAEnF,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,wGAUxB,CAAA;AAEV,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;AAEtF,4FAA4F;AAC5F,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,CAAA;AAEzE,kGAAkG;AAClG,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,eAAe,IAAI,CACpD,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,YAAY,KACjB,CAAC,CAAA;AAEN,wEAAwE;AACxE,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,eAAe,IAAI,aAAa,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,aAAa,CAAC,CAAA;AAElG,+EAA+E;AAC/E,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CACxE,CAAC,SAAS,MAAM,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,EAExC,MAAM,EAAE,CAAC,EACT,GAAG,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KACpC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAE5C,8FAA8F;AAC9F,MAAM,MAAM,YAAY,GAAG;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAC,GAAG;IAAC,IAAI,EAAE,OAAO,CAAA;CAAC,CAAA;AAEjG,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,eAAe,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI;IAC/E,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAA;IAClB,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,KAAK,YAAY,CAAA;IACrE,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,OAAO,EAAE,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAC,GAAG;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAA;AAExF,4EAA4E;AAC5E,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB,CAAA;AAED,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAsBD,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,eAAe,EAC3D,QAAQ,YAAY,EACpB,SAAS,YAAY,CAAC,CAAC,CAAC,MAYhB,sBAAoB,aAAa,KAAG,WAgB7C,CAAA"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/protocol.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/protocol.ts"],"names":[],"mappings":"AAIA,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO;IACP,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;CACC,CAAA;AAsDV,2EAA2E;AAC3E,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,IAAe,EAAE,MAAe,EAAE,EAAE;IACrE,IAAI,MAA2B,CAAA;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAc,EAAE,MAAM,EAAE,MAAqB,EAAC,CAAA;YAClF,MAAK;QACP,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAqB,EAAC,CAAA;YAChE,MAAK;QACP,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAC,CAAA;YACxB,MAAK;IACT,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAoB,EACpB,MAAwB,EACxB,EAAE;IACF,MAAM,CAAC,OAAO,EAAE,CAAA;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAClD,CAAA;IAED,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAoC,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,CAAC,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAgB,EAAe,EAAE;QACxD,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7B,IAAI,KAAkB,CAAA;QAEtB,IAAI,CAAC;YACH,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;YAE1D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;YAEzB,KAAK,GAAG,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,EAAC,CAAA;QAC5C,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/protocol.ts"],"names":[],"mappings":"AAIA,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,OAAO;IACP,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,OAAO;IACP,OAAO;IACP,OAAO;IACP,OAAO;CACC,CAAA;AA8DV,2EAA2E;AAC3E,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,IAAe,EAAE,MAAe,EAAE,EAAE;IACrE,IAAI,MAA2B,CAAA;IAE/B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAc,EAAE,MAAM,EAAE,MAAqB,EAAC,CAAA;YAClF,MAAK;QACP,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,MAAqB,EAAC,CAAA;YAChE,MAAK;QACP,KAAK,OAAO;YACV,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAC,CAAA;YACxB,MAAK;IACT,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAKD,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAAoB,EACpB,MAAwB,EACP,EAAE;IACnB,MAAM,CAAC,OAAO,EAAE,CAAA;IAEhB,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAClD,CAAA;IAED,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAoC,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,CAAC,EAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAgB,EAAe,EAAE;QACxD,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC7B,IAAI,KAAkB,CAAA;QAEtB,IAAI,CAAC;YACH,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;YAE1D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;YAEzB,KAAK,GAAG,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,MAAM,EAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,EAAC,CAAA;QAC5C,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAIhB,MAAM,eAAe,CAAA;AAsBtB,iGAAiG;AACjG,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,eAAe,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,SAgB9E,CAAA"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/serve.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EAIhB,MAAM,eAAe,CAAA;AAuBtB,iGAAiG;AACjG,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,eAAe,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,SAoC9E,CAAA"}
@@ -21,15 +21,32 @@ const open = async (name) => {
21
21
  };
22
22
  /** Serves `connectSqlite` from a dedicated worker, with `extend`'s methods over the database. */
23
23
  export const serveSqlite = (extend) => {
24
- let handle;
24
+ const start = ({ db, wipe }) => ({
25
+ respond: createSqliteHandler(new SqliteEngine(db), extend),
26
+ wipe,
27
+ });
28
+ // A wipe replaces the file, so the engine and the handler over it go with it
29
+ let serving;
25
30
  self.onmessage = async ({ data }) => {
26
31
  if ("type" in data) {
27
- handle = open(data.name).then(db => createSqliteHandler(new SqliteEngine(db), extend));
32
+ serving = open(data.name).then(start);
28
33
  }
29
- else if (handle) {
34
+ else if (serving) {
30
35
  try {
31
- const respond = await handle;
32
- self.postMessage(respond(data));
36
+ const { respond, wipe } = await serving;
37
+ if (data.method === "wipe") {
38
+ serving = wipe().then(db => start({ db, wipe }));
39
+ await serving;
40
+ // The file is gone, so every connection drops what it held
41
+ const change = { type: "clear" };
42
+ self.postMessage({
43
+ response: { id: data.id, result: undefined },
44
+ change,
45
+ });
46
+ }
47
+ else {
48
+ self.postMessage(respond(data));
49
+ }
33
50
  }
34
51
  catch (e) {
35
52
  self.postMessage({ response: { id: data.id, error: String(e) } });
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAA;AACnC,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AACxC,OAAO,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAA;AAQjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAA;AAE1C,uGAAuG;AACvG,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE,CACjC,OAAO,oBAAoB,KAAK,WAAW;IAC3C,wBAAwB,IAAI,oBAAoB,CAAC,SAAS;IAC1D,CAAC,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;AAEpE,kEAAkE;AAClE,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAClC,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,OAAO,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAA;YAEzC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,WAAW,GAAG,CAA4B,MAAwB,EAAE,EAAE;IACjF,IAAI,MAAmE,CAAA;IAEvE,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,EAAC,IAAI,EAA2C,EAAE,EAAE;QAC1E,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;QACxF,CAAC;aAAM,IAAI,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAA;gBAE5B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;YACjC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,WAAW,CAAC,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,EAAuB,CAAC,CAAA;YACrF,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAC,MAAM,eAAe,CAAA;AACnC,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAA;AACxC,OAAO,EAAC,mBAAmB,EAAC,MAAM,eAAe,CAAA;AAQjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAA;AAG1C,uGAAuG;AACvG,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE,CACjC,OAAO,oBAAoB,KAAK,WAAW;IAC3C,wBAAwB,IAAI,oBAAoB,CAAC,SAAS;IAC1D,CAAC,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;AAEpE,kEAAkE;AAClE,MAAM,IAAI,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAClC,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,OAAO,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,MAAM,CAAC,CAAA;YAEzC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AAED,iGAAiG;AACjG,MAAM,CAAC,MAAM,WAAW,GAAG,CAA4B,MAAwB,EAAE,EAAE;IACjF,MAAM,KAAK,GAAG,CAAC,EAAC,EAAE,EAAE,IAAI,EAAiB,EAAE,EAAE,CAAC,CAAC;QAC7C,OAAO,EAAE,mBAAmB,CAAC,IAAI,YAAY,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAC1D,IAAI;KACL,CAAC,CAAA;IAEF,6EAA6E;IAC7E,IAAI,OAAsD,CAAA;IAE1D,IAAI,CAAC,SAAS,GAAG,KAAK,EAAE,EAAC,IAAI,EAA2C,EAAE,EAAE;QAC1E,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvC,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,EAAC,OAAO,EAAE,IAAI,EAAC,GAAG,MAAM,OAAO,CAAA;gBAErC,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC3B,OAAO,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,EAAC,EAAE,EAAE,IAAI,EAAC,CAAC,CAAC,CAAA;oBAE9C,MAAM,OAAO,CAAA;oBAEb,2DAA2D;oBAC3D,MAAM,MAAM,GAAG,EAAC,IAAI,EAAE,OAAO,EAAU,CAAA;oBAEvC,IAAI,CAAC,WAAW,CAAC;wBACf,QAAQ,EAAE,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAC;wBAC1C,MAAM;qBACe,CAAC,CAAA;gBAC1B,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;gBACjC,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,WAAW,CAAC,EAAC,QAAQ,EAAE,EAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,EAAuB,CAAC,CAAA;YACrF,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -2,6 +2,11 @@ import type { Database } from "@sqlite.org/sqlite-wasm";
2
2
  import type { SqliteDatabase } from "./engine.js";
3
3
  /** Adapt a sqlite-wasm database to the engine, preparing each statement once. */
4
4
  export declare const wasmDatabase: (db: Database) => SqliteDatabase;
5
+ export type WasmConnection = {
6
+ db: SqliteDatabase;
7
+ /** Discard the file, and serve an empty one in its place. */
8
+ wipe: () => Promise<SqliteDatabase>;
9
+ };
5
10
  /** Open `name` in OPFS through its own SAH pool, so tabs can lead different databases at once. */
6
- export declare const openWasmDatabase: (name: string) => Promise<SqliteDatabase>;
11
+ export declare const openWasmDatabase: (name: string) => Promise<WasmConnection>;
7
12
  //# sourceMappingURL=wasm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/wasm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAoB,MAAM,yBAAyB,CAAA;AACxE,OAAO,KAAK,EAAW,cAAc,EAAC,MAAM,aAAa,CAAA;AAEzD,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,IAAI,QAAQ,KAAG,cAuD3C,CAAA;AAED,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,4BAQlD,CAAA"}
1
+ {"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/wasm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,QAAQ,EAAoB,MAAM,yBAAyB,CAAA;AACxE,OAAO,KAAK,EAAW,cAAc,EAAC,MAAM,aAAa,CAAA;AAEzD,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,IAAI,QAAQ,KAAG,cAuD3C,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,cAAc,CAAA;IAClB,6DAA6D;IAC7D,IAAI,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAA;CACpC,CAAA;AAWD,kGAAkG;AAClG,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,cAAc,CAgC3E,CAAA"}
@@ -50,12 +50,36 @@ export const wasmDatabase = (db) => {
50
50
  },
51
51
  };
52
52
  };
53
+ // A file sqlite refuses to even read is as unusable as a malformed one
54
+ const isReadable = (db) => {
55
+ try {
56
+ return db.selectValue("PRAGMA quick_check") === "ok";
57
+ }
58
+ catch (e) {
59
+ return false;
60
+ }
61
+ };
53
62
  /** Open `name` in OPFS through its own SAH pool, so tabs can lead different databases at once. */
54
63
  export const openWasmDatabase = async (name) => {
55
64
  const sqlite3 = await sqlite3InitModule();
56
65
  const pool = await sqlite3.installOpfsSAHPoolVfs({ name: `welshman-${name}` });
57
- const db = new pool.OpfsSAHPoolDb(`/${name}.sqlite3`);
58
- db.exec("PRAGMA journal_mode = TRUNCATE; PRAGMA synchronous = NORMAL; PRAGMA temp_store = MEMORY");
59
- return wasmDatabase(db);
66
+ const connect = () => {
67
+ const db = new pool.OpfsSAHPoolDb(`/${name}.sqlite3`);
68
+ db.exec("PRAGMA journal_mode = TRUNCATE; PRAGMA synchronous = NORMAL; PRAGMA temp_store = MEMORY");
69
+ return db;
70
+ };
71
+ let db = connect();
72
+ const wipe = async () => {
73
+ // Prepared statements belong to the file they were built against, so the wrapper goes too
74
+ db.close();
75
+ await pool.wipeFiles();
76
+ db = connect();
77
+ return wasmDatabase(db);
78
+ };
79
+ // A malformed image fails every read for as long as it's kept, and the cache rebuilds from relays
80
+ if (!isReadable(db)) {
81
+ await wipe();
82
+ }
83
+ return { db: wasmDatabase(db), wipe };
60
84
  };
61
85
  //# sourceMappingURL=wasm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/wasm.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,yBAAyB,CAAA;AAIvD,iFAAiF;AACjF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAY,EAAkB,EAAE;IAC3D,MAAM,UAAU,GAAG,IAAI,GAAG,EAA6B,CAAA;IAEvD,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,MAAkB,EAAE,EAAE;QAClD,IAAI,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAEnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC3B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;QAChC,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACxB,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC,CAAA;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,EAAE;YACV,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACd,CAAC;QACD,sFAAsF;QACtF,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,EAAE;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAEtC,IAAI,CAAC;gBACH,SAAS,CAAC,IAAI,EAAE,CAAA;YAClB,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;QACH,CAAC;QACD,GAAG,EAAE,CAAI,GAAW,EAAE,SAAqB,EAAE,EAAE,EAAE;YAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACtC,MAAM,IAAI,GAAQ,EAAE,CAAA;YAEpB,IAAI,CAAC;gBACH,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAM,CAAC,CAAA;gBACnC,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YACvB,CAAC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAClB,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE;gBACtB,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAiB,CAAC;gBAChD,KAAK,EAAE,CAAC;gBACR,aAAa,EAAE,IAAI;aACpB,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC,CAAA;AAED,kGAAkG;AAClG,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,qBAAqB,CAAC,EAAC,IAAI,EAAE,YAAY,IAAI,EAAE,EAAC,CAAC,CAAA;IAC5E,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,UAAU,CAAC,CAAA;IAErD,EAAE,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAA;IAElG,OAAO,YAAY,CAAC,EAAE,CAAC,CAAA;AACzB,CAAC,CAAA"}
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../../../../src/repository/adapters/sqlite/wasm.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@welshman/store",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "author": "hodlbod",
5
5
  "license": "MIT",
6
6
  "description": "Event storage and reactive stores for welshman",
@@ -32,8 +32,8 @@
32
32
  ],
33
33
  "peerDependencies": {
34
34
  "@sqlite.org/sqlite-wasm": "^3.53.4-build1",
35
- "@welshman/lib": "0.14.0",
36
- "@welshman/util": "0.14.0"
35
+ "@welshman/lib": "0.14.1",
36
+ "@welshman/util": "0.14.1"
37
37
  },
38
38
  "peerDependenciesMeta": {
39
39
  "@sqlite.org/sqlite-wasm": {
@@ -42,8 +42,8 @@
42
42
  },
43
43
  "devDependencies": {
44
44
  "@sqlite.org/sqlite-wasm": "3.53.4-build1",
45
- "@welshman/lib": "0.14.0",
46
- "@welshman/util": "0.14.0",
45
+ "@welshman/lib": "0.14.1",
46
+ "@welshman/util": "0.14.1",
47
47
  "rimraf": "~6.0.0",
48
48
  "typescript": "~5.8.0"
49
49
  },