@haverstack/server 0.10.3 → 0.12.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/dist/app.d.ts.map +1 -1
- package/dist/app.js +2 -0
- package/dist/app.js.map +1 -1
- package/dist/lib/canonicalJson.d.ts +7 -0
- package/dist/lib/canonicalJson.d.ts.map +1 -0
- package/dist/lib/canonicalJson.js +18 -0
- package/dist/lib/canonicalJson.js.map +1 -0
- package/dist/lib/historyPage.d.ts +12 -0
- package/dist/lib/historyPage.d.ts.map +1 -0
- package/dist/lib/historyPage.js +24 -0
- package/dist/lib/historyPage.js.map +1 -0
- package/dist/lib/ifMatch.d.ts +11 -0
- package/dist/lib/ifMatch.d.ts.map +1 -0
- package/dist/lib/ifMatch.js +11 -0
- package/dist/lib/ifMatch.js.map +1 -0
- package/dist/lib/installRequestStore.d.ts +46 -0
- package/dist/lib/installRequestStore.d.ts.map +1 -0
- package/dist/lib/installRequestStore.js +102 -0
- package/dist/lib/installRequestStore.js.map +1 -0
- package/dist/lib/json.d.ts +7 -1
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +18 -4
- package/dist/lib/json.js.map +1 -1
- package/dist/lib/queryWorker/pool.d.ts +2 -1
- package/dist/lib/queryWorker/pool.d.ts.map +1 -1
- package/dist/lib/queryWorker/pool.js.map +1 -1
- package/dist/lib/queryWorker/protocol.d.ts +3 -2
- package/dist/lib/queryWorker/protocol.d.ts.map +1 -1
- package/dist/lib/queryWorker/worker.js +3 -3
- package/dist/lib/queryWorker/worker.js.map +1 -1
- package/dist/lib/resumeBuffer.d.ts +4 -4
- package/dist/lib/resumeBuffer.d.ts.map +1 -1
- package/dist/lib/resumeBuffer.js +23 -9
- package/dist/lib/resumeBuffer.js.map +1 -1
- package/dist/lib/resumeCursor.d.ts +1 -1
- package/dist/lib/resumeCursor.d.ts.map +1 -1
- package/dist/lib/resumeCursor.js +3 -3
- package/dist/lib/resumeCursor.js.map +1 -1
- package/dist/lib/selfService.d.ts +2 -0
- package/dist/lib/selfService.d.ts.map +1 -0
- package/dist/lib/selfService.js +6 -0
- package/dist/lib/selfService.js.map +1 -0
- package/dist/middleware/auth.d.ts +10 -9
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +21 -10
- package/dist/middleware/auth.js.map +1 -1
- package/dist/middleware/errors.js +1 -1
- package/dist/middleware/errors.js.map +1 -1
- package/dist/middleware/params.d.ts +10 -0
- package/dist/middleware/params.d.ts.map +1 -0
- package/dist/middleware/params.js +18 -0
- package/dist/middleware/params.js.map +1 -0
- package/dist/routes/attachments.d.ts.map +1 -1
- package/dist/routes/attachments.js +24 -14
- package/dist/routes/attachments.js.map +1 -1
- package/dist/routes/auth.d.ts.map +1 -1
- package/dist/routes/auth.js +13 -23
- package/dist/routes/auth.js.map +1 -1
- package/dist/routes/changes.d.ts +1 -1
- package/dist/routes/changes.d.ts.map +1 -1
- package/dist/routes/changes.js +17 -18
- package/dist/routes/changes.js.map +1 -1
- package/dist/routes/entity.d.ts.map +1 -1
- package/dist/routes/entity.js +12 -8
- package/dist/routes/entity.js.map +1 -1
- package/dist/routes/health.d.ts.map +1 -1
- package/dist/routes/health.js +2 -1
- package/dist/routes/health.js.map +1 -1
- package/dist/routes/installs.d.ts +13 -0
- package/dist/routes/installs.d.ts.map +1 -0
- package/dist/routes/installs.js +101 -0
- package/dist/routes/installs.js.map +1 -0
- package/dist/routes/records.d.ts.map +1 -1
- package/dist/routes/records.js +114 -173
- package/dist/routes/records.js.map +1 -1
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +22 -18
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/types.d.ts.map +1 -1
- package/dist/routes/types.js +11 -25
- package/dist/routes/types.js.map +1 -1
- package/dist/routes/wellknown.d.ts.map +1 -1
- package/dist/routes/wellknown.js +6 -3
- package/dist/routes/wellknown.js.map +1 -1
- package/dist/shutdown.d.ts.map +1 -1
- package/dist/shutdown.js +1 -0
- package/dist/shutdown.js.map +1 -1
- package/dist/stack.d.ts +2 -0
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +30 -8
- package/dist/stack.js.map +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +15 -4
- package/dist/testing.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/dist/lib/queryLimit.d.ts +0 -6
- package/dist/lib/queryLimit.d.ts.map +0 -1
- package/dist/lib/queryLimit.js +0 -20
- package/dist/lib/queryLimit.js.map +0 -1
package/dist/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAezC,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,wBAAgB,SAAS,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CA+DzF"}
|
package/dist/app.js
CHANGED
|
@@ -13,6 +13,7 @@ import { attachmentRoutes } from './routes/attachments.js';
|
|
|
13
13
|
import { entityRoutes } from './routes/entity.js';
|
|
14
14
|
import { tokenRoutes } from './routes/tokens.js';
|
|
15
15
|
import { authRoutes } from './routes/auth.js';
|
|
16
|
+
import { installRoutes } from './routes/installs.js';
|
|
16
17
|
import { wireError } from './wireError.js';
|
|
17
18
|
export function createApp(ctx, config, logger) {
|
|
18
19
|
const app = new Hono();
|
|
@@ -64,6 +65,7 @@ export function createApp(ctx, config, logger) {
|
|
|
64
65
|
app.route('/entity', entityRoutes(ctx));
|
|
65
66
|
app.route('/tokens', tokenRoutes(ctx));
|
|
66
67
|
app.route('/auth', authRoutes(ctx, config.authOrigin, logger));
|
|
68
|
+
app.route('/installs', installRoutes(ctx));
|
|
67
69
|
app.notFound((c) => wireError(c, 404, 'not_found', 'Not found'));
|
|
68
70
|
return app;
|
|
69
71
|
}
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON with every object's keys in sorted order, so two values that mean
|
|
3
|
+
* the same thing serialize the same way whatever order a client wrote
|
|
4
|
+
* their keys in. Array order is kept, since it is part of the value.
|
|
5
|
+
*/
|
|
6
|
+
export declare function canonicalJson(value: unknown): string;
|
|
7
|
+
//# sourceMappingURL=canonicalJson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalJson.d.ts","sourceRoot":"","sources":["../../src/lib/canonicalJson.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEpD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON with every object's keys in sorted order, so two values that mean
|
|
3
|
+
* the same thing serialize the same way whatever order a client wrote
|
|
4
|
+
* their keys in. Array order is kept, since it is part of the value.
|
|
5
|
+
*/
|
|
6
|
+
export function canonicalJson(value) {
|
|
7
|
+
return JSON.stringify(sortKeys(value));
|
|
8
|
+
}
|
|
9
|
+
function sortKeys(value) {
|
|
10
|
+
if (Array.isArray(value))
|
|
11
|
+
return value.map(sortKeys);
|
|
12
|
+
if (value === null || typeof value !== 'object')
|
|
13
|
+
return value;
|
|
14
|
+
return Object.fromEntries(Object.keys(value)
|
|
15
|
+
.sort()
|
|
16
|
+
.map((key) => [key, sortKeys(value[key])]));
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=canonicalJson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalJson.js","sourceRoot":"","sources":["../../src/lib/canonicalJson.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACf,IAAI,EAAE;SACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC1E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const MAX_HISTORY_PAGE = 500;
|
|
2
|
+
/**
|
|
3
|
+
* Reads one page of a history, one row past it to learn whether anything
|
|
4
|
+
* follows, so `cursor` is null exactly when the history is exhausted. A
|
|
5
|
+
* `limit` below 1 is passed through as given: whether it is in range is
|
|
6
|
+
* `Stack`'s to judge.
|
|
7
|
+
*/
|
|
8
|
+
export declare function readHistoryPage<T>(limit: number | undefined, read: (limit: number) => Promise<T[]>, cursorOf: (row: T) => number): Promise<{
|
|
9
|
+
rows: T[];
|
|
10
|
+
cursor: number | null;
|
|
11
|
+
}>;
|
|
12
|
+
//# sourceMappingURL=historyPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyPage.d.ts","sourceRoot":"","sources":["../../src/lib/historyPage.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EACrC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,GAC3B,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAO/C"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// A record's version history and its journal are the two reads with no
|
|
2
|
+
// ceiling when `limit` is omitted: omitting it reads everything by
|
|
3
|
+
// contract, so a page size can't be supplied on the caller's behalf
|
|
4
|
+
// without silently truncating exactly the caller reading the whole thing.
|
|
5
|
+
// This server bounds a page and says so in `cursor` instead, as the spec
|
|
6
|
+
// lets it. See docs/spec/wire-format.md § Versions and § Journal.
|
|
7
|
+
export const MAX_HISTORY_PAGE = 500;
|
|
8
|
+
/**
|
|
9
|
+
* Reads one page of a history, one row past it to learn whether anything
|
|
10
|
+
* follows, so `cursor` is null exactly when the history is exhausted. A
|
|
11
|
+
* `limit` below 1 is passed through as given: whether it is in range is
|
|
12
|
+
* `Stack`'s to judge.
|
|
13
|
+
*/
|
|
14
|
+
export async function readHistoryPage(limit, read, cursorOf) {
|
|
15
|
+
const page = Math.min(limit ?? MAX_HISTORY_PAGE, MAX_HISTORY_PAGE);
|
|
16
|
+
if (page < 1)
|
|
17
|
+
return { rows: await read(page), cursor: null };
|
|
18
|
+
const rows = await read(page + 1);
|
|
19
|
+
if (rows.length <= page)
|
|
20
|
+
return { rows, cursor: null };
|
|
21
|
+
const kept = rows.slice(0, page);
|
|
22
|
+
return { rows: kept, cursor: cursorOf(kept[kept.length - 1]) };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=historyPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"historyPage.js","sourceRoot":"","sources":["../../src/lib/historyPage.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,mEAAmE;AACnE,oEAAoE;AACpE,0EAA0E;AAC1E,yEAAyE;AACzE,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAyB,EACzB,IAAqC,EACrC,QAA4B;IAE5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;IACnE,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAClC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Context } from 'hono';
|
|
2
|
+
import type { IfVersionOptions } from '@haverstack/core';
|
|
3
|
+
import type { AppEnv } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* The `ifVersion` an `If-Match` header carries. Every record write reads
|
|
6
|
+
* one and checks it when present; a malformed header is core's 400, never a
|
|
7
|
+
* fallthrough to unconditional. See docs/spec/wire-format.md
|
|
8
|
+
* § Optimistic concurrency.
|
|
9
|
+
*/
|
|
10
|
+
export declare function ifMatchVersion(c: Context<AppEnv>): IfVersionOptions;
|
|
11
|
+
//# sourceMappingURL=ifMatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ifMatch.d.ts","sourceRoot":"","sources":["../../src/lib/ifMatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,gBAAgB,CAEnE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { parseIfMatch } from '@haverstack/core/wire';
|
|
2
|
+
/**
|
|
3
|
+
* The `ifVersion` an `If-Match` header carries. Every record write reads
|
|
4
|
+
* one and checks it when present; a malformed header is core's 400, never a
|
|
5
|
+
* fallthrough to unconditional. See docs/spec/wire-format.md
|
|
6
|
+
* § Optimistic concurrency.
|
|
7
|
+
*/
|
|
8
|
+
export function ifMatchVersion(c) {
|
|
9
|
+
return { ifVersion: parseIfMatch(c.req.header('If-Match')) };
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ifMatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ifMatch.js","sourceRoot":"","sources":["../../src/lib/ifMatch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGrD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,CAAkB;IAC/C,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { AppManifest, EntityId } from '@haverstack/core';
|
|
2
|
+
/** Conventional sibling path for the install request store beside a stack's main .db file. */
|
|
3
|
+
export declare const defaultInstallRequestStorePath: (dbPath: string) => string;
|
|
4
|
+
export type InstallRequestEntry = {
|
|
5
|
+
/** Names this manifest as sent; a key sending a different one gets a new id. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** The key asking to be installed — the session's principal. */
|
|
8
|
+
did: EntityId;
|
|
9
|
+
manifest: AppManifest;
|
|
10
|
+
requestedAt: Date;
|
|
11
|
+
expiresAt: Date;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Install requests awaiting the owner, one per key: the app's half of an
|
|
15
|
+
* install (POST /installs) leaves one here, and the owner's half
|
|
16
|
+
* (/installs/requests) reviews and approves it. A request is not an
|
|
17
|
+
* approval, so it lives with the server rather than in the stack — a key
|
|
18
|
+
* that merely authenticated writes nothing into the owner's data. Its own
|
|
19
|
+
* sibling file, like AuthNonceStore. See docs/spec/apps.md § Over the wire.
|
|
20
|
+
*/
|
|
21
|
+
export declare class InstallRequestStore {
|
|
22
|
+
private readonly db;
|
|
23
|
+
private constructor();
|
|
24
|
+
static open(path: string): InstallRequestStore;
|
|
25
|
+
/**
|
|
26
|
+
* Records `manifest` as `did`'s pending request, replacing any other it
|
|
27
|
+
* had. Re-sending the same manifest — compared as canonical JSON, so key
|
|
28
|
+
* order is not a difference — keeps its id and refreshes its expiry, so
|
|
29
|
+
* an id the owner reviewed always names what they reviewed.
|
|
30
|
+
*/
|
|
31
|
+
put(did: EntityId, manifest: AppManifest): InstallRequestEntry;
|
|
32
|
+
get(id: string): InstallRequestEntry | null;
|
|
33
|
+
/** Every live request, oldest first. */
|
|
34
|
+
list(): InstallRequestEntry[];
|
|
35
|
+
/** The pending request `did` holds, if any. */
|
|
36
|
+
forKey(did: EntityId): InstallRequestEntry | null;
|
|
37
|
+
/**
|
|
38
|
+
* Removes the request `id` names — once it is installed or declined, there
|
|
39
|
+
* is nothing left to ask. A request its key has since replaced has a new
|
|
40
|
+
* id, so removing the old one leaves the new one standing.
|
|
41
|
+
*/
|
|
42
|
+
remove(id: string): void;
|
|
43
|
+
private sweepExpired;
|
|
44
|
+
close(): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=installRequestStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installRequestStore.d.ts","sourceRoot":"","sources":["../../src/lib/installRequestStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI9D,8FAA8F;AAC9F,eAAO,MAAM,8BAA8B,GAAI,QAAQ,MAAM,KAAG,MAA8B,CAAC;AAE/F,MAAM,MAAM,mBAAmB,GAAG;IAChC,gFAAgF;IAChF,EAAE,EAAE,MAAM,CAAC;IACX,gEAAgE;IAChE,GAAG,EAAE,QAAQ,CAAC;IACd,QAAQ,EAAE,WAAW,CAAC;IACtB,WAAW,EAAE,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB,CAAC;AAIF;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IACV,OAAO,CAAC,QAAQ,CAAC,EAAE;IAAvC,OAAO;IAEP,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB;IAkB9C;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,GAAG,mBAAmB;IAuB9D,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI;IAO3C,wCAAwC;IACxC,IAAI,IAAI,mBAAmB,EAAE;IAO7B,+CAA+C;IAC/C,MAAM,CAAC,GAAG,EAAE,QAAQ,GAAG,mBAAmB,GAAG,IAAI;IAOjD;;;;OAIG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIxB,OAAO,CAAC,YAAY;IAIpB,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { canonicalJson } from './canonicalJson.js';
|
|
4
|
+
import { SELF_SERVICE_TTL_MS } from './selfService.js';
|
|
5
|
+
/** Conventional sibling path for the install request store beside a stack's main .db file. */
|
|
6
|
+
export const defaultInstallRequestStorePath = (dbPath) => `${dbPath}.installs`;
|
|
7
|
+
/**
|
|
8
|
+
* Install requests awaiting the owner, one per key: the app's half of an
|
|
9
|
+
* install (POST /installs) leaves one here, and the owner's half
|
|
10
|
+
* (/installs/requests) reviews and approves it. A request is not an
|
|
11
|
+
* approval, so it lives with the server rather than in the stack — a key
|
|
12
|
+
* that merely authenticated writes nothing into the owner's data. Its own
|
|
13
|
+
* sibling file, like AuthNonceStore. See docs/spec/apps.md § Over the wire.
|
|
14
|
+
*/
|
|
15
|
+
export class InstallRequestStore {
|
|
16
|
+
db;
|
|
17
|
+
constructor(db) {
|
|
18
|
+
this.db = db;
|
|
19
|
+
}
|
|
20
|
+
static open(path) {
|
|
21
|
+
const db = new DatabaseSync(path);
|
|
22
|
+
db.exec('PRAGMA journal_mode = WAL;');
|
|
23
|
+
db.exec(`CREATE TABLE IF NOT EXISTS install_requests (
|
|
24
|
+
did TEXT PRIMARY KEY,
|
|
25
|
+
id TEXT NOT NULL UNIQUE,
|
|
26
|
+
manifest TEXT NOT NULL,
|
|
27
|
+
requestedAt INTEGER NOT NULL,
|
|
28
|
+
expiresAt INTEGER NOT NULL
|
|
29
|
+
);`);
|
|
30
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_install_requests_expiresAt ON install_requests (expiresAt);');
|
|
31
|
+
return new InstallRequestStore(db);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Records `manifest` as `did`'s pending request, replacing any other it
|
|
35
|
+
* had. Re-sending the same manifest — compared as canonical JSON, so key
|
|
36
|
+
* order is not a difference — keeps its id and refreshes its expiry, so
|
|
37
|
+
* an id the owner reviewed always names what they reviewed.
|
|
38
|
+
*/
|
|
39
|
+
put(did, manifest) {
|
|
40
|
+
this.sweepExpired();
|
|
41
|
+
const json = canonicalJson(manifest);
|
|
42
|
+
const now = Date.now();
|
|
43
|
+
const expiresAt = now + SELF_SERVICE_TTL_MS;
|
|
44
|
+
const existing = this.db.prepare('SELECT * FROM install_requests WHERE did = ?').get(did);
|
|
45
|
+
if (existing && existing.manifest === json) {
|
|
46
|
+
this.db
|
|
47
|
+
.prepare('UPDATE install_requests SET expiresAt = ? WHERE did = ?')
|
|
48
|
+
.run(expiresAt, did);
|
|
49
|
+
return toEntry({ ...existing, expiresAt });
|
|
50
|
+
}
|
|
51
|
+
const row = { id: randomUUID(), did, manifest: json, requestedAt: now, expiresAt };
|
|
52
|
+
this.db
|
|
53
|
+
.prepare(`INSERT OR REPLACE INTO install_requests (did, id, manifest, requestedAt, expiresAt)
|
|
54
|
+
VALUES (?, ?, ?, ?, ?)`)
|
|
55
|
+
.run(row.did, row.id, row.manifest, row.requestedAt, row.expiresAt);
|
|
56
|
+
return toEntry(row);
|
|
57
|
+
}
|
|
58
|
+
get(id) {
|
|
59
|
+
const row = this.db
|
|
60
|
+
.prepare('SELECT * FROM install_requests WHERE id = ? AND expiresAt >= ?')
|
|
61
|
+
.get(id, Date.now());
|
|
62
|
+
return row ? toEntry(row) : null;
|
|
63
|
+
}
|
|
64
|
+
/** Every live request, oldest first. */
|
|
65
|
+
list() {
|
|
66
|
+
const rows = this.db
|
|
67
|
+
.prepare('SELECT * FROM install_requests WHERE expiresAt >= ? ORDER BY requestedAt, id')
|
|
68
|
+
.all(Date.now());
|
|
69
|
+
return rows.map(toEntry);
|
|
70
|
+
}
|
|
71
|
+
/** The pending request `did` holds, if any. */
|
|
72
|
+
forKey(did) {
|
|
73
|
+
const row = this.db
|
|
74
|
+
.prepare('SELECT * FROM install_requests WHERE did = ? AND expiresAt >= ?')
|
|
75
|
+
.get(did, Date.now());
|
|
76
|
+
return row ? toEntry(row) : null;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Removes the request `id` names — once it is installed or declined, there
|
|
80
|
+
* is nothing left to ask. A request its key has since replaced has a new
|
|
81
|
+
* id, so removing the old one leaves the new one standing.
|
|
82
|
+
*/
|
|
83
|
+
remove(id) {
|
|
84
|
+
this.db.prepare('DELETE FROM install_requests WHERE id = ?').run(id);
|
|
85
|
+
}
|
|
86
|
+
sweepExpired() {
|
|
87
|
+
this.db.prepare('DELETE FROM install_requests WHERE expiresAt < ?').run(Date.now());
|
|
88
|
+
}
|
|
89
|
+
close() {
|
|
90
|
+
this.db.close();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function toEntry(row) {
|
|
94
|
+
return {
|
|
95
|
+
id: row.id,
|
|
96
|
+
did: row.did,
|
|
97
|
+
manifest: JSON.parse(row.manifest),
|
|
98
|
+
requestedAt: new Date(row.requestedAt),
|
|
99
|
+
expiresAt: new Date(row.expiresAt),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=installRequestStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installRequestStore.js","sourceRoot":"","sources":["../../src/lib/installRequestStore.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/json.d.ts
CHANGED
|
@@ -6,5 +6,11 @@ import type { AppEnv } from '../types.js';
|
|
|
6
6
|
* catch-all as an unlabeled 500 instead of the 400 `bad_request` every other
|
|
7
7
|
* structurally-invalid request gets (docs/spec/wire-format.md § Error responses).
|
|
8
8
|
*/
|
|
9
|
-
export declare function readJson<T = unknown>(c: Context<AppEnv
|
|
9
|
+
export declare function readJson<T = unknown>(c: Context<AppEnv>, keys?: readonly string[]): Promise<T>;
|
|
10
|
+
/**
|
|
11
|
+
* A key the endpoint doesn't define is refused rather than ignored: an
|
|
12
|
+
* ignored field turns a mistaken request into a different one that
|
|
13
|
+
* succeeds, and the caller never learns it asked for something else.
|
|
14
|
+
*/
|
|
15
|
+
export declare function rejectUnknownKeys(body: Record<string, unknown>, keys: readonly string[]): void;
|
|
10
16
|
//# sourceMappingURL=json.d.ts.map
|
package/dist/lib/json.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,CAAC,GAAG,OAAO,EACxC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAClB,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GACvB,OAAO,CAAC,CAAC,CAAC,CAiBZ;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAQ9F"}
|
package/dist/lib/json.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StackBadRequestError } from '@haverstack/core';
|
|
2
2
|
/**
|
|
3
3
|
* `c.req.json()` throws a bare `SyntaxError` on malformed input, which isn't
|
|
4
4
|
* a `StackError` — left uncaught it falls through errorMiddleware's
|
|
5
5
|
* catch-all as an unlabeled 500 instead of the 400 `bad_request` every other
|
|
6
6
|
* structurally-invalid request gets (docs/spec/wire-format.md § Error responses).
|
|
7
7
|
*/
|
|
8
|
-
export async function readJson(c) {
|
|
8
|
+
export async function readJson(c, keys) {
|
|
9
9
|
let parsed;
|
|
10
10
|
try {
|
|
11
11
|
parsed = await c.req.json();
|
|
12
12
|
}
|
|
13
13
|
catch (err) {
|
|
14
14
|
if (err instanceof SyntaxError)
|
|
15
|
-
throw new
|
|
15
|
+
throw new StackBadRequestError('Invalid JSON in request body');
|
|
16
16
|
throw err;
|
|
17
17
|
}
|
|
18
18
|
// `null`, a bare string or a number parses fine, but every call site
|
|
@@ -20,8 +20,22 @@ export async function readJson(c) {
|
|
|
20
20
|
// throws a bare TypeError — another unlabeled 500, unauthenticated on the
|
|
21
21
|
// /auth routes. Structurally invalid like malformed JSON, so a 400 too.
|
|
22
22
|
if (parsed === null || typeof parsed !== 'object') {
|
|
23
|
-
throw new
|
|
23
|
+
throw new StackBadRequestError('Request body must be a JSON object');
|
|
24
24
|
}
|
|
25
|
+
if (keys)
|
|
26
|
+
rejectUnknownKeys(parsed, keys);
|
|
25
27
|
return parsed;
|
|
26
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A key the endpoint doesn't define is refused rather than ignored: an
|
|
31
|
+
* ignored field turns a mistaken request into a different one that
|
|
32
|
+
* succeeds, and the caller never learns it asked for something else.
|
|
33
|
+
*/
|
|
34
|
+
export function rejectUnknownKeys(body, keys) {
|
|
35
|
+
const unknown = Object.keys(body).filter((key) => !keys.includes(key));
|
|
36
|
+
if (unknown.length > 0) {
|
|
37
|
+
throw new StackBadRequestError(`Unknown body key${unknown.length > 1 ? 's' : ''}: ${unknown.join(', ')}. ` +
|
|
38
|
+
`This endpoint takes: ${keys.join(', ') || 'no keys'}.`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
27
41
|
//# sourceMappingURL=json.js.map
|
package/dist/lib/json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGxD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,CAAkB,EAClB,IAAwB;IAExB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAK,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW;YAAE,MAAM,IAAI,oBAAoB,CAAC,8BAA8B,CAAC,CAAC;QAC/F,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,qEAAqE;IACrE,yEAAyE;IACzE,0EAA0E;IAC1E,wEAAwE;IACxE,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAClD,MAAM,IAAI,oBAAoB,CAAC,oCAAoC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,IAAI;QAAE,iBAAiB,CAAC,MAAiC,EAAE,IAAI,CAAC,CAAC;IACrE,OAAO,MAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAA6B,EAAE,IAAuB;IACtF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,oBAAoB,CAC5B,mBAAmB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YACzE,wBAAwB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAC1D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { StackQuery, QueryResult
|
|
1
|
+
import type { StackQuery, QueryResult } from '@haverstack/core';
|
|
2
|
+
import type { TokenSession } from '@haverstack/core/wire';
|
|
2
3
|
import type { Logger } from 'pino';
|
|
3
4
|
import type { QueryWorkerInit } from './protocol.js';
|
|
4
5
|
export type QueryWorkerPoolOptions = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/lib/queryWorker/pool.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../../src/lib/queryWorker/pool.ts"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAG1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAA+B,eAAe,EAAE,MAAM,eAAe,CAAC;AAgClF,MAAM,MAAM,sBAAsB,GAAG;IACnC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB,CAAC;AAEF,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgD;IACxE,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,WAAW,CAAsB;IAEzC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAM;gBAEpB,IAAI,EAAE,sBAAsB;IAYxC;;;OAGG;IACH,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,aAAa;IAmBrB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,qFAAqF;IACrF,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,QAAQ;IAShB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,YAAY;IAepB,qFAAqF;IACrF,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,UAAU;IAWlB;;;;OAIG;IACH,KAAK,CACH,OAAO,EAAE,YAAY,GAAG,IAAI,EAC5B,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,WAAW,CAAC;IAyBjB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/lib/queryWorker/pool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../src/lib/queryWorker/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
* (serializeError/deserializeError from @haverstack/wire-types) since a
|
|
8
8
|
* custom Error subclass doesn't survive structured clone as itself.
|
|
9
9
|
*/
|
|
10
|
-
import type { StackQuery, QueryResult
|
|
10
|
+
import type { StackQuery, QueryResult } from '@haverstack/core';
|
|
11
|
+
import type { TokenSession } from '@haverstack/core/wire';
|
|
11
12
|
import type { WireError } from '@haverstack/wire-types';
|
|
12
13
|
/**
|
|
13
14
|
* Passed as `workerData` when a query worker is spawned. dbPath is the
|
|
14
15
|
* whole of it: a worker calls LocalAdapter.open(), which reads timezone
|
|
15
16
|
* (and the rest of the stack config) out of the database itself — only
|
|
16
|
-
*
|
|
17
|
+
* creating a store takes one as input, and workers never create one.
|
|
17
18
|
*/
|
|
18
19
|
export type QueryWorkerInit = {
|
|
19
20
|
dbPath: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/lib/queryWorker/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../../src/lib/queryWorker/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,iFAAiF;IACjF,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GAC7C;IACE,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,KAAK,CAAC;IACV,sGAAsG;IACtG,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,iGAAiG;IACjG,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
|
@@ -24,14 +24,14 @@ if (!parentPort) {
|
|
|
24
24
|
const init = workerData;
|
|
25
25
|
// The database already exists — the main thread's initStack() created or
|
|
26
26
|
// opened it, and seeded system types, before any worker is spawned (see
|
|
27
|
-
// pool.ts). open()
|
|
27
|
+
// pool.ts). open()'s default `create: 'never'` reflects that: there is no
|
|
28
28
|
// first-run path to handle here.
|
|
29
29
|
const adapter = await LocalAdapter.open({ path: init.dbPath });
|
|
30
|
-
const stack = await Stack.
|
|
30
|
+
const stack = await Stack.open(adapter);
|
|
31
31
|
parentPort.on('message', async (req) => {
|
|
32
32
|
const port = parentPort;
|
|
33
33
|
try {
|
|
34
|
-
const scoped = req.session ? stack.
|
|
34
|
+
const scoped = req.session ? stack.asActor(req.session) : stack.asEntity(null);
|
|
35
35
|
const result = await scoped.query(req.query);
|
|
36
36
|
port.postMessage({ id: req.id, ok: true, result });
|
|
37
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/lib/queryWorker/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,IAAI,GAAG,UAA6B,CAAC;AAE3C,yEAAyE;AACzE,wEAAwE;AACxE,
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/lib/queryWorker/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,IAAI,GAAG,UAA6B,CAAC;AAE3C,yEAAyE;AACzE,wEAAwE;AACxE,0EAA0E;AAC1E,iCAAiC;AACjC,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;AAC/D,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAExC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,GAAiB,EAAE,EAAE;IACnD,MAAM,IAAI,GAAG,UAAW,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAA0B,CAAC,CAAC;IAC7E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC;YACf,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,EAAE,EAAE,KAAK;YACT,IAAI;YACJ,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SAClC,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -20,7 +20,7 @@ export type ResumeEntry = {
|
|
|
20
20
|
n: number;
|
|
21
21
|
recordId: string;
|
|
22
22
|
isPurge: boolean;
|
|
23
|
-
/** Wire-ready,
|
|
23
|
+
/** Wire-ready, cursor already attached. */
|
|
24
24
|
frame: WireRecordChange;
|
|
25
25
|
};
|
|
26
26
|
export type EntriesAfterResult = {
|
|
@@ -71,13 +71,13 @@ export type ResumeBufferKeyParts = {
|
|
|
71
71
|
subjectId: string | null;
|
|
72
72
|
filter: ChangeFilter;
|
|
73
73
|
includeRecords: boolean;
|
|
74
|
-
includeUnlisted: boolean;
|
|
75
74
|
};
|
|
76
75
|
/**
|
|
77
76
|
* Reproducible across a reconnect that re-sends the same query params —
|
|
78
77
|
* order-independent on the parts of `filter` that don't carry order of
|
|
79
|
-
* their own (`typeId
|
|
80
|
-
* re-sending them in a different order
|
|
78
|
+
* their own (`typeId`, `baseId`, `createdBy`'s halves and `kinds` are
|
|
79
|
+
* matched as sets, not sequences, so re-sending them in a different order
|
|
80
|
+
* must key the same buffer).
|
|
81
81
|
*
|
|
82
82
|
* Two filters that mean different things must never key the same buffer.
|
|
83
83
|
* A buffer opens exactly one `ScopedStack.subscribe()`, carrying the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resumeBuffer.d.ts","sourceRoot":"","sources":["../../src/lib/resumeBuffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"resumeBuffer.d.ts","sourceRoot":"","sources":["../../src/lib/resumeBuffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG/D,MAAM,MAAM,WAAW,GAAG;IACxB,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,gBAAgB,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,WAAW,EAAE,CAAA;CAAE;AAC1C,4FAA4F;GAC1F;IAAE,MAAM,EAAE,UAAU,CAAA;CAAE;AACxB,2EAA2E;GACzE;IAAE,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEjC,wGAAwG;AACxG,qBAAa,YAAY;IAYX,OAAO,CAAC,QAAQ,CAAC,KAAK;IAXlC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAuB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2C;IAErE,wEAAwE;IACxE,SAAS,SAAK;IACd,2EAA2E;IAC3E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAER,KAAK,EAAE,MAAM;IAE1C,+EAA+E;IAC/E,UAAU,IAAI,MAAM;IAIpB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW;IAmBzC,6DAA6D;IAC7D,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAOjE;;;;OAIG;IACH,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,kBAAkB;CAK5C;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,6CAA6C;IAC7C,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CAwBnE;AAQD,MAAM,MAAM,2BAA2B,GAAG;IACxC,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,6GAA6G;IAC7G,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;GAKG;AACH,qBAAa,oBAAoB;IAanB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAZjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqC;IACpE;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;gBAEzC,IAAI,EAAE,2BAA2B;IAE9D;;;;;;;;;;OAUG;IACG,OAAO,CACX,GAAG,EAAE,MAAM,EACX,gBAAgB,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,KAAK,OAAO,CAAC,WAAW,CAAC,GACnF,OAAO,CAAC,YAAY,CAAC;IAuCxB,uGAAuG;IACvG,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAW1B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,KAAK;IASb,kEAAkE;IAClE,QAAQ,IAAI,IAAI;CAQjB"}
|
package/dist/lib/resumeBuffer.js
CHANGED
|
@@ -26,8 +26,8 @@ export class ResumeBuffer {
|
|
|
26
26
|
*/
|
|
27
27
|
append(change) {
|
|
28
28
|
this.currentN += 1;
|
|
29
|
-
const
|
|
30
|
-
const frame = serializeChange({ ...change,
|
|
29
|
+
const cursor = encodeCursor(this.id, this.currentN);
|
|
30
|
+
const frame = serializeChange({ ...change, cursor });
|
|
31
31
|
const entry = {
|
|
32
32
|
n: this.currentN,
|
|
33
33
|
recordId: change.recordId,
|
|
@@ -67,8 +67,9 @@ export class ResumeBuffer {
|
|
|
67
67
|
/**
|
|
68
68
|
* Reproducible across a reconnect that re-sends the same query params —
|
|
69
69
|
* order-independent on the parts of `filter` that don't carry order of
|
|
70
|
-
* their own (`typeId
|
|
71
|
-
* re-sending them in a different order
|
|
70
|
+
* their own (`typeId`, `baseId`, `createdBy`'s halves and `kinds` are
|
|
71
|
+
* matched as sets, not sequences, so re-sending them in a different order
|
|
72
|
+
* must key the same buffer).
|
|
72
73
|
*
|
|
73
74
|
* Two filters that mean different things must never key the same buffer.
|
|
74
75
|
* A buffer opens exactly one `ScopedStack.subscribe()`, carrying the
|
|
@@ -87,21 +88,34 @@ export class ResumeBuffer {
|
|
|
87
88
|
*/
|
|
88
89
|
export function resumeBufferKey(parts) {
|
|
89
90
|
const { filter } = parts;
|
|
90
|
-
const typeId = filter.typeId
|
|
91
|
-
|
|
91
|
+
const typeId = asSortedSet(filter.typeId);
|
|
92
|
+
const baseId = asSortedSet(filter.baseId);
|
|
93
|
+
const createdBySubject = asSortedSet(filter.createdBy?.subjectId);
|
|
94
|
+
const createdByPrincipal = asSortedSet(filter.createdBy?.principalId);
|
|
95
|
+
// `createdBy: {}` constrains nothing, so it keys the same as no createdBy.
|
|
96
|
+
const createdBy = createdBySubject || createdByPrincipal
|
|
97
|
+
? { subjectId: createdBySubject, principalId: createdByPrincipal }
|
|
92
98
|
: undefined;
|
|
93
|
-
const kinds = filter.kinds
|
|
99
|
+
const kinds = asSortedSet(filter.kinds);
|
|
94
100
|
return JSON.stringify({
|
|
95
101
|
principalId: parts.principalId,
|
|
96
102
|
subjectId: parts.subjectId,
|
|
97
103
|
includeRecords: parts.includeRecords,
|
|
98
|
-
|
|
104
|
+
// Absent and `false` both exclude unlisted records, so they key alike.
|
|
105
|
+
includeUnlisted: filter.includeUnlisted === true,
|
|
99
106
|
...(typeId !== undefined && { typeId }),
|
|
107
|
+
...(baseId !== undefined && { baseId }),
|
|
100
108
|
...(filter.parentId !== undefined && { parentId: filter.parentId }),
|
|
101
|
-
...(
|
|
109
|
+
...(createdBy !== undefined && { createdBy }),
|
|
102
110
|
...(kinds !== undefined && { kinds }),
|
|
103
111
|
});
|
|
104
112
|
}
|
|
113
|
+
/** A one-or-many filter value, matched as a set: normalized to a sorted array. */
|
|
114
|
+
function asSortedSet(value) {
|
|
115
|
+
if (value === undefined)
|
|
116
|
+
return undefined;
|
|
117
|
+
return [...(Array.isArray(value) ? value : [value])].sort();
|
|
118
|
+
}
|
|
105
119
|
/**
|
|
106
120
|
* Owns every live resume buffer, keyed by (session, filter, includeRecords).
|
|
107
121
|
* A buffer's underlying `ScopedStack.subscribe()` is opened once, when the
|