@argentic/chest-sdk 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +508 -80
- package/client/index.ts +11 -7
- package/client/src/api.ts +19 -18
- package/client/src/database.ts +6 -1
- package/client/src/errors.ts +50 -0
- package/client/src/eventrules.ts +117 -0
- package/client/src/events.ts +181 -39
- package/client/src/files.ts +37 -7
- package/client/src/member.ts +15 -9
- package/client/src/members.ts +34 -16
- package/client/src/notifications.ts +84 -27
- package/client/src/realtime-client.ts +516 -0
- package/client/src/realtime.ts +118 -0
- package/client/src/sealed.ts +158 -0
- package/client/src/signed.ts +8 -4
- package/client/src/testing-realtime.ts +361 -0
- package/client/src/testing.ts +391 -94
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/src/api.d.ts +2 -1
- package/dist/src/api.d.ts.map +1 -1
- package/dist/src/api.js +18 -16
- package/dist/src/api.js.map +1 -1
- package/dist/src/database.d.ts.map +1 -1
- package/dist/src/database.js +5 -1
- package/dist/src/database.js.map +1 -1
- package/dist/src/errors.d.ts +18 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +44 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/eventrules.d.ts +23 -0
- package/dist/src/eventrules.d.ts.map +1 -0
- package/dist/src/eventrules.js +107 -0
- package/dist/src/eventrules.js.map +1 -0
- package/dist/src/events.d.ts +31 -6
- package/dist/src/events.d.ts.map +1 -1
- package/dist/src/events.js +130 -26
- package/dist/src/events.js.map +1 -1
- package/dist/src/files.d.ts +1 -0
- package/dist/src/files.d.ts.map +1 -1
- package/dist/src/files.js +34 -3
- package/dist/src/files.js.map +1 -1
- package/dist/src/member.d.ts +1 -1
- package/dist/src/member.d.ts.map +1 -1
- package/dist/src/member.js +9 -6
- package/dist/src/member.js.map +1 -1
- package/dist/src/members.d.ts +9 -2
- package/dist/src/members.d.ts.map +1 -1
- package/dist/src/members.js +29 -13
- package/dist/src/members.js.map +1 -1
- package/dist/src/notifications.d.ts +12 -1
- package/dist/src/notifications.d.ts.map +1 -1
- package/dist/src/notifications.js +60 -19
- package/dist/src/notifications.js.map +1 -1
- package/dist/src/realtime-client.d.ts +45 -0
- package/dist/src/realtime-client.d.ts.map +1 -0
- package/dist/src/realtime-client.js +453 -0
- package/dist/src/realtime-client.js.map +1 -0
- package/dist/src/realtime.d.ts +22 -0
- package/dist/src/realtime.d.ts.map +1 -0
- package/dist/src/realtime.js +99 -0
- package/dist/src/realtime.js.map +1 -0
- package/dist/src/sealed.d.ts +20 -0
- package/dist/src/sealed.d.ts.map +1 -0
- package/dist/src/sealed.js +121 -0
- package/dist/src/sealed.js.map +1 -0
- package/dist/src/signed.d.ts.map +1 -1
- package/dist/src/signed.js +6 -2
- package/dist/src/signed.js.map +1 -1
- package/dist/src/testing-realtime.d.ts +54 -0
- package/dist/src/testing-realtime.d.ts.map +1 -0
- package/dist/src/testing-realtime.js +376 -0
- package/dist/src/testing-realtime.js.map +1 -0
- package/dist/src/testing.d.ts +40 -3
- package/dist/src/testing.d.ts.map +1 -1
- package/dist/src/testing.js +368 -81
- package/dist/src/testing.js.map +1 -1
- package/package.json +23 -4
package/dist/index.d.ts
CHANGED
|
@@ -2,10 +2,12 @@ export * from "./src/errors.js";
|
|
|
2
2
|
export * from "./src/member.js";
|
|
3
3
|
export * from "./src/chest.js";
|
|
4
4
|
export * from "./src/database.js";
|
|
5
|
+
export * as sealed from "./src/sealed.js";
|
|
5
6
|
export * as files from "./src/files.js";
|
|
6
7
|
export * as members from "./src/members.js";
|
|
7
8
|
export * as notifications from "./src/notifications.js";
|
|
8
9
|
export * as events from "./src/events.js";
|
|
9
10
|
export * as schedules from "./src/schedules.js";
|
|
10
11
|
export * as ai from "./src/ai.js";
|
|
12
|
+
export * as realtime from "./src/realtime.js";
|
|
11
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AASA,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,aAAa,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
// The package root: every published module a tool's code uses (tool
|
|
2
|
-
// 0.
|
|
3
|
-
// /
|
|
4
|
-
// pulls in nothing else. The
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
1
|
+
// The package root: every published module a tool's server code uses (tool
|
|
2
|
+
// contract 0.5). Each one is also its own subpath (@argentic/chest-sdk/member,
|
|
3
|
+
// /chest, /database, /sealed, /files, /members, /notifications, /events,
|
|
4
|
+
// /schedules, /ai, /realtime, /errors), which pulls in nothing else. The
|
|
5
|
+
// sealed, files, members, notifications, events, schedules, ai and realtime
|
|
6
|
+
// APIs are namespaces here, as their names (seal, open, get, list, stat, move,
|
|
7
|
+
// notify, verify, chat, publish…) are too plain to stand alone.
|
|
8
|
+
// @argentic/chest-sdk/realtime/client runs in the browser, and
|
|
9
|
+
// @argentic/chest-sdk/testing in a tool's tests only: neither is here.
|
|
8
10
|
export * from "./src/errors.js";
|
|
9
11
|
export * from "./src/member.js";
|
|
10
12
|
export * from "./src/chest.js";
|
|
11
13
|
export * from "./src/database.js";
|
|
14
|
+
export * as sealed from "./src/sealed.js";
|
|
12
15
|
export * as files from "./src/files.js";
|
|
13
16
|
export * as members from "./src/members.js";
|
|
14
17
|
export * as notifications from "./src/notifications.js";
|
|
15
18
|
export * as events from "./src/events.js";
|
|
16
19
|
export * as schedules from "./src/schedules.js";
|
|
17
20
|
export * as ai from "./src/ai.js";
|
|
21
|
+
export * as realtime from "./src/realtime.js";
|
|
18
22
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../client/index.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,+EAA+E;AAC/E,yEAAyE;AACzE,yEAAyE;AACzE,4EAA4E;AAC5E,+EAA+E;AAC/E,gEAAgE;AAChE,+DAA+D;AAC/D,uEAAuE;AACvE,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,aAAa,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,KAAK,SAAS,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC"}
|
package/dist/src/api.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { ChestError } from "./errors.js";
|
|
2
|
-
export declare const fakeOrigins: Set<string>;
|
|
3
2
|
export declare function chestLink(url: unknown, path: string): string | undefined;
|
|
4
3
|
export declare function ask(capability: string, method: string, path: string, init?: {
|
|
5
4
|
body?: Uint8Array<ArrayBuffer> | string;
|
|
6
5
|
type?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
7
|
deadline?: number;
|
|
8
8
|
signal?: AbortSignal;
|
|
9
9
|
}): Promise<Response>;
|
|
10
10
|
export declare function read(response: Response, limit: number): Promise<Uint8Array>;
|
|
11
11
|
export declare function json(response: Response): Promise<unknown>;
|
|
12
|
+
export declare function errorCode(response: Response): Promise<string>;
|
|
12
13
|
export declare function refusal(response: Response, capability: string): Promise<ChestError>;
|
|
13
14
|
//# sourceMappingURL=api.d.ts.map
|
package/dist/src/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../client/src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../client/src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,UAAU,EAAkE,MAAM,aAAa,CAAC;AAgB/H,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAcD,wBAAsB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAW/O;AAID,wBAAsB,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBjF;AAGD,wBAAsB,IAAI,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAM/D;AAID,wBAAsB,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAQnE;AAGD,wBAAsB,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAQzF"}
|
package/dist/src/api.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CapabilityNotGranted, ChestError, QuotaExceeded, RateLimited, TooLarge, Unavailable } from "./errors.js";
|
|
1
|
+
import { CapabilityNotGranted, ChestError, QuotaExceeded, RateLimited, StorageFull, TooLarge, Unavailable } from "./errors.js";
|
|
2
2
|
// The Chest's API as a server tool reaches it, shared by the modules that
|
|
3
3
|
// call it (files, members): CHEST_API is http://127.0.0.1:<port>, the tool's
|
|
4
4
|
// launcher, which relays each request to the Chest — the container has no
|
|
@@ -6,21 +6,16 @@ import { CapabilityNotGranted, ChestError, QuotaExceeded, RateLimited, TooLarge,
|
|
|
6
6
|
// identity. Not a published module.
|
|
7
7
|
const maxAnswer = 4 << 20;
|
|
8
8
|
const deadline = 120000;
|
|
9
|
-
// fakeOrigins are the origins of the fake Chests a test started in this
|
|
10
|
-
// process (testing.ts, fakeChest), each http://127.0.0.1:<port>: links and
|
|
11
|
-
// uploads a fake gives on them are taken as the Chest's https ones are. Only
|
|
12
|
-
// the testing module adds to it — the one module no production code
|
|
13
|
-
// imports —, and only for as long as its fake runs; an origin is never read
|
|
14
|
-
// from the environment, so nothing set around a tool widens what it accepts.
|
|
15
|
-
export const fakeOrigins = new Set();
|
|
16
9
|
// chestLink reads a link to the team host the Chest answered, at path (its
|
|
17
10
|
// links, its uploads): the token it carries, or undefined for an address
|
|
18
|
-
// that is not one — https, or the origin of
|
|
11
|
+
// that is not one — https, or the origin of the Chest's API itself
|
|
12
|
+
// (CHEST_API), where only a fake Chest of a tool's tests serves its links:
|
|
13
|
+
// the address the tool already trusts for every call, never another.
|
|
19
14
|
export function chestLink(url, path) {
|
|
20
15
|
if (typeof url !== "string")
|
|
21
16
|
return undefined;
|
|
22
17
|
const found = /^(https:\/\/[A-Za-z0-9.-]{1,253}(?::[0-9]{1,5})?|http:\/\/127\.0\.0\.1:[0-9]{1,5})(\/_chest\/[a-z/]+\/)([A-Za-z0-9_-]+\.[A-Za-z0-9_-]+)$/u.exec(url);
|
|
23
|
-
if (!found || found[2] !== path || (found[1].startsWith("http:") &&
|
|
18
|
+
if (!found || found[2] !== path || (found[1].startsWith("http:") && found[1] !== process.env["CHEST_API"]))
|
|
24
19
|
return undefined;
|
|
25
20
|
return found[3];
|
|
26
21
|
}
|
|
@@ -37,7 +32,7 @@ function base(capability) {
|
|
|
37
32
|
// deadline milliseconds (120 seconds unless said), or when the caller's
|
|
38
33
|
// signal aborts: its reason is then thrown.
|
|
39
34
|
export async function ask(capability, method, path, init = {}) {
|
|
40
|
-
const headers = {};
|
|
35
|
+
const headers = { ...init.headers };
|
|
41
36
|
if (init.type !== undefined)
|
|
42
37
|
headers["Content-Type"] = init.type;
|
|
43
38
|
const url = base(capability) + path;
|
|
@@ -87,23 +82,30 @@ export async function json(response) {
|
|
|
87
82
|
throw new Unavailable();
|
|
88
83
|
}
|
|
89
84
|
}
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
// errorCode is the code of a refusal of the Chest ({"error": code}), or
|
|
86
|
+
// "refused" for an answer that says none.
|
|
87
|
+
export async function errorCode(response) {
|
|
93
88
|
try {
|
|
94
89
|
const given = (await json(response))?.error;
|
|
95
90
|
if (typeof given === "string" && /^[a-z_]{1,40}$/u.test(given))
|
|
96
|
-
|
|
91
|
+
return given;
|
|
97
92
|
}
|
|
98
93
|
catch {
|
|
99
|
-
//
|
|
94
|
+
// No code of the Chest's.
|
|
100
95
|
}
|
|
96
|
+
return "refused";
|
|
97
|
+
}
|
|
98
|
+
// refusal turns an answer that is not a success into what the tool tests.
|
|
99
|
+
export async function refusal(response, capability) {
|
|
100
|
+
const code = await errorCode(response);
|
|
101
101
|
if (response.status === 403)
|
|
102
102
|
return new CapabilityNotGranted(capability);
|
|
103
103
|
if (response.status === 413)
|
|
104
104
|
return new TooLarge();
|
|
105
105
|
if (response.status === 429)
|
|
106
106
|
return code === "rate_limited" ? new RateLimited() : new QuotaExceeded();
|
|
107
|
+
if (response.status === 507 && code === "storage_full")
|
|
108
|
+
return new StorageFull();
|
|
107
109
|
if (response.status >= 500)
|
|
108
110
|
return new Unavailable();
|
|
109
111
|
return new ChestError(code, response.status, `the Chest refused: ${code}`);
|
package/dist/src/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../client/src/api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../client/src/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../client/src/database.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../client/src/database.ts"],"names":[],"mappings":"AAkBA,wBAAgB,WAAW,IAAI,MAAM,CAcpC"}
|
package/dist/src/database.js
CHANGED
|
@@ -7,9 +7,13 @@ import { CapabilityNotGranted } from "./errors.js";
|
|
|
7
7
|
// postgres (porsager) or pg; the SDK carries none. PGHOST, PGPORT, PGUSER,
|
|
8
8
|
// PGPASSWORD and PGDATABASE say the same for a client that reads them.
|
|
9
9
|
//
|
|
10
|
+
// Its user is the tool's role (t_<tool>), or, in the preview of a draft
|
|
11
|
+
// Perseus Code builds, the draft's (pb_<project>: its own empty database).
|
|
12
|
+
//
|
|
10
13
|
// Throws CapabilityNotGranted when the Chest gave no database: the version
|
|
11
14
|
// does not declare it, or a DATABASE_URL of the tool's own is not the
|
|
12
15
|
// Chest's. The value is a secret: never log it, never send it to a browser.
|
|
16
|
+
const role = /^(t_[a-z][a-z0-9_]{0,47}|pb_[a-z2-7]{26})$/u;
|
|
13
17
|
export function databaseUrl() {
|
|
14
18
|
const value = process.env["DATABASE_URL"];
|
|
15
19
|
if (typeof value !== "string" || value.length > 1024)
|
|
@@ -22,7 +26,7 @@ export function databaseUrl() {
|
|
|
22
26
|
throw new CapabilityNotGranted("database");
|
|
23
27
|
}
|
|
24
28
|
const port = Number(url.port);
|
|
25
|
-
if (url.protocol !== "postgres:" || url.hostname !== "127.0.0.1" || !Number.isInteger(port) || port < 1 || port > 65535 ||
|
|
29
|
+
if (url.protocol !== "postgres:" || url.hostname !== "127.0.0.1" || !Number.isInteger(port) || port < 1 || port > 65535 || !role.test(url.username) || url.pathname !== "/" + url.username || url.password === "" || url.search !== "?sslmode=disable" || url.hash !== "") {
|
|
26
30
|
throw new CapabilityNotGranted("database");
|
|
27
31
|
}
|
|
28
32
|
return value;
|
package/dist/src/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../client/src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,2EAA2E;AAC3E,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,uEAAuE;AACvE,EAAE;AACF,2EAA2E;AAC3E,sEAAsE;AACtE,4EAA4E;AAC5E,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjG,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../client/src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,2EAA2E;AAC3E,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,yEAAyE;AACzE,2EAA2E;AAC3E,uEAAuE;AACvE,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,sEAAsE;AACtE,4EAA4E;AAC5E,MAAM,IAAI,GAAG,6CAA6C,CAAC;AAE3D,MAAM,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QAAE,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IACjG,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,kBAAkB,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QAC1Q,MAAM,IAAI,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/src/errors.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ export declare class RateLimited extends ChestError {
|
|
|
15
15
|
export declare class TooLarge extends ChestError {
|
|
16
16
|
constructor();
|
|
17
17
|
}
|
|
18
|
+
export declare class StorageFull extends ChestError {
|
|
19
|
+
constructor();
|
|
20
|
+
}
|
|
18
21
|
export declare class Unavailable extends ChestError {
|
|
19
22
|
constructor();
|
|
20
23
|
}
|
|
@@ -34,4 +37,19 @@ export declare class AiModelNotAllowed extends ChestError {
|
|
|
34
37
|
export declare class AiRefused extends ChestError {
|
|
35
38
|
constructor();
|
|
36
39
|
}
|
|
40
|
+
export declare class MemberRequired extends ChestError {
|
|
41
|
+
constructor();
|
|
42
|
+
}
|
|
43
|
+
export declare class NotAllowed extends ChestError {
|
|
44
|
+
constructor();
|
|
45
|
+
}
|
|
46
|
+
export declare class SealedInvalid extends ChestError {
|
|
47
|
+
constructor();
|
|
48
|
+
}
|
|
49
|
+
export declare class SealedLocked extends ChestError {
|
|
50
|
+
constructor();
|
|
51
|
+
}
|
|
52
|
+
export declare class SealedLost extends ChestError {
|
|
53
|
+
constructor();
|
|
54
|
+
}
|
|
37
55
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/src/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../client/src/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAKxD;CACF;AAKD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,YAAY,UAAU,EAAE,MAAM,EAE7B;CACF;AAMD,qBAAa,aAAc,SAAQ,UAAU;IAC3C,cAEC;CACF;AAID,qBAAa,WAAY,SAAQ,UAAU;IACzC,cAEC;CACF;AAID,qBAAa,QAAS,SAAQ,UAAU;IACtC,cAEC;CACF;AAID,qBAAa,WAAY,SAAQ,UAAU;IACzC,cAEC;CACF;AAMD,qBAAa,YAAa,SAAQ,UAAU;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,YAAY,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAIlD;CACF;AAID,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAKnG,qBAAa,aAAc,SAAQ,UAAU;IAC3C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,YAAY,MAAM,EAAE,mBAAmB,EAGtC;CACF;AAID,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,cAEC;CACF;AAGD,qBAAa,SAAU,SAAQ,UAAU;IACvC,cAEC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../client/src/errors.ts"],"names":[],"mappings":"AAEA,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAKxD;CACF;AAKD,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,YAAY,UAAU,EAAE,MAAM,EAE7B;CACF;AAMD,qBAAa,aAAc,SAAQ,UAAU;IAC3C,cAEC;CACF;AAID,qBAAa,WAAY,SAAQ,UAAU;IACzC,cAEC;CACF;AAID,qBAAa,QAAS,SAAQ,UAAU;IACtC,cAEC;CACF;AAKD,qBAAa,WAAY,SAAQ,UAAU;IACzC,cAEC;CACF;AAID,qBAAa,WAAY,SAAQ,UAAU;IACzC,cAEC;CACF;AAMD,qBAAa,YAAa,SAAQ,UAAU;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,YAAY,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAIlD;CACF;AAID,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,sBAAsB,GAAG,sBAAsB,CAAC;AAKnG,qBAAa,aAAc,SAAQ,UAAU;IAC3C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,YAAY,MAAM,EAAE,mBAAmB,EAGtC;CACF;AAID,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,cAEC;CACF;AAGD,qBAAa,SAAU,SAAQ,UAAU;IACvC,cAEC;CACF;AAKD,qBAAa,cAAe,SAAQ,UAAU;IAC5C,cAEC;CACF;AAID,qBAAa,UAAW,SAAQ,UAAU;IACxC,cAEC;CACF;AAID,qBAAa,aAAc,SAAQ,UAAU;IAC3C,cAEC;CACF;AAID,qBAAa,YAAa,SAAQ,UAAU;IAC1C,cAEC;CACF;AAID,qBAAa,UAAW,SAAQ,UAAU;IACxC,cAEC;CACF"}
|
package/dist/src/errors.js
CHANGED
|
@@ -41,6 +41,14 @@ export class TooLarge extends ChestError {
|
|
|
41
41
|
super("too_large", 413, "the Chest refused: the object is too large");
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
// The server of the Chest has no more disk for files, whatever the tool's
|
|
45
|
+
// quota: nothing was kept. Its owner frees space or takes a larger server;
|
|
46
|
+
// the tool says the file could not be kept, and may try again later.
|
|
47
|
+
export class StorageFull extends ChestError {
|
|
48
|
+
constructor() {
|
|
49
|
+
super("storage_full", 507, "the Chest refused: its server's disk is full");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
44
52
|
// The Chest did not answer, or not as it does: nothing is known of what was
|
|
45
53
|
// asked — a write may or may not have happened.
|
|
46
54
|
export class Unavailable extends ChestError {
|
|
@@ -84,4 +92,40 @@ export class AiRefused extends ChestError {
|
|
|
84
92
|
super("content_refused", 422, "the AI provider refused the content of the request");
|
|
85
93
|
}
|
|
86
94
|
}
|
|
95
|
+
// Opening a sealed value needs a member on the request: none came with it,
|
|
96
|
+
// or their ticket expired (a request lasts 60 seconds). A public page, a
|
|
97
|
+
// schedule or an event opens nothing.
|
|
98
|
+
export class MemberRequired extends ChestError {
|
|
99
|
+
constructor() {
|
|
100
|
+
super("member_required", 401, "the Chest refused: sealed values open only on the request of a member");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// The member may not open this: they lost the tool since the request
|
|
104
|
+
// began, or the value was sealed for roles they do not hold.
|
|
105
|
+
export class NotAllowed extends ChestError {
|
|
106
|
+
constructor() {
|
|
107
|
+
super("not_allowed", 403, "the Chest refused: this member may not open this value");
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// The sealed value does not open: it was altered, it is another tool's, or
|
|
111
|
+
// it was sealed in another context.
|
|
112
|
+
export class SealedInvalid extends ChestError {
|
|
113
|
+
constructor() {
|
|
114
|
+
super("sealed_invalid", 400, "the sealed value does not open: altered, another tool's or of another context");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// The Chest was restored and its sealed data waits for the owner's recovery
|
|
118
|
+
// code: nothing is sealed or opened until they enter it (Settings).
|
|
119
|
+
export class SealedLocked extends ChestError {
|
|
120
|
+
constructor() {
|
|
121
|
+
super("sealed_locked", 503, "the Chest's sealed data is locked until its owner enters the recovery code");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// The key of this tool's sealed values is lost for good (the Chest key and
|
|
125
|
+
// its recovery code both): its sealed values never open again.
|
|
126
|
+
export class SealedLost extends ChestError {
|
|
127
|
+
constructor() {
|
|
128
|
+
super("sealed_lost", 503, "the key of this tool's sealed values is lost");
|
|
129
|
+
}
|
|
130
|
+
}
|
|
87
131
|
//# sourceMappingURL=errors.js.map
|
package/dist/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../client/src/errors.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,MAAM,CAAS;IACxB,YAAY,IAAY,EAAE,MAAc,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,4EAA4E;AAC5E,0EAA0E;AAC1E,WAAW;AACX,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,UAAkB;QAC5B,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,2CAA2C,UAAU,+BAA+B,CAAC,CAAC;IAC7H,CAAC;CACF;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C;QACE,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,uDAAuD,CAAC,CAAC;IACxF,CAAC;CACF;AAED,yEAAyE;AACzE,0DAA0D;AAC1D,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC;QACE,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAC;IACjF,CAAC;CACF;AAED,wEAAwE;AACxE,kEAAkE;AAClE,MAAM,OAAO,QAAS,SAAQ,UAAU;IACtC;QACE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,4CAA4C,CAAC,CAAC;IACxE,CAAC;CACF;AAED,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC;QACE,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACxD,CAAC;CACF;AAED,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,UAAU;AACV,MAAM,OAAO,YAAa,SAAQ,UAAU;IACjC,KAAK,CAAmB;IACxB,QAAQ,CAAO;IACxB,YAAY,KAAuB,EAAE,QAAc;QACjD,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,0BAA0B,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,2CAA2C,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAMD,4EAA4E;AAC5E,6EAA6E;AAC7E,iCAAiC;AACjC,MAAM,OAAO,aAAc,SAAQ,UAAU;IAClC,MAAM,CAAsB;IACrC,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,+DAA+D,CAAC,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;QACvR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C;QACE,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,6GAA6G,CAAC,CAAC;IACjJ,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC;QACE,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,oDAAoD,CAAC,CAAC;IACtF,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../client/src/errors.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,MAAM,CAAS;IACxB,YAAY,IAAY,EAAE,MAAc,EAAE,OAAe;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,4EAA4E;AAC5E,0EAA0E;AAC1E,WAAW;AACX,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,UAAkB;QAC5B,KAAK,CAAC,wBAAwB,EAAE,GAAG,EAAE,2CAA2C,UAAU,+BAA+B,CAAC,CAAC;IAC7H,CAAC;CACF;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C;QACE,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,uDAAuD,CAAC,CAAC;IACxF,CAAC;CACF;AAED,yEAAyE;AACzE,0DAA0D;AAC1D,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC;QACE,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,kDAAkD,CAAC,CAAC;IACjF,CAAC;CACF;AAED,wEAAwE;AACxE,kEAAkE;AAClE,MAAM,OAAO,QAAS,SAAQ,UAAU;IACtC;QACE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,4CAA4C,CAAC,CAAC;IACxE,CAAC;CACF;AAED,0EAA0E;AAC1E,2EAA2E;AAC3E,qEAAqE;AACrE,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC;QACE,KAAK,CAAC,cAAc,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;IAC7E,CAAC;CACF;AAED,4EAA4E;AAC5E,gDAAgD;AAChD,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC;QACE,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACxD,CAAC;CACF;AAED,uEAAuE;AACvE,4EAA4E;AAC5E,4EAA4E;AAC5E,UAAU;AACV,MAAM,OAAO,YAAa,SAAQ,UAAU;IACjC,KAAK,CAAmB;IACxB,QAAQ,CAAO;IACxB,YAAY,KAAuB,EAAE,QAAc;QACjD,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,0BAA0B,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,2CAA2C,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAChK,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAMD,4EAA4E;AAC5E,6EAA6E;AAC7E,iCAAiC;AACjC,MAAM,OAAO,aAAc,SAAQ,UAAU;IAClC,MAAM,CAAsB;IACrC,YAAY,MAA2B;QACrC,KAAK,CAAC,MAAM,EAAE,MAAM,KAAK,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,cAAc,CAAC,CAAC,CAAC,+DAA+D,CAAC,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,0CAA0C,CAAC,CAAC;QACvR,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,0EAA0E;AAC1E,uDAAuD;AACvD,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C;QACE,KAAK,CAAC,mBAAmB,EAAE,GAAG,EAAE,6GAA6G,CAAC,CAAC;IACjJ,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,OAAO,SAAU,SAAQ,UAAU;IACvC;QACE,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,oDAAoD,CAAC,CAAC;IACtF,CAAC;CACF;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,sCAAsC;AACtC,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C;QACE,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,uEAAuE,CAAC,CAAC;IACzG,CAAC;CACF;AAED,qEAAqE;AACrE,6DAA6D;AAC7D,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxC;QACE,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,wDAAwD,CAAC,CAAC;IACtF,CAAC;CACF;AAED,2EAA2E;AAC3E,oCAAoC;AACpC,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3C;QACE,KAAK,CAAC,gBAAgB,EAAE,GAAG,EAAE,+EAA+E,CAAC,CAAC;IAChH,CAAC;CACF;AAED,4EAA4E;AAC5E,oEAAoE;AACpE,MAAM,OAAO,YAAa,SAAQ,UAAU;IAC1C;QACE,KAAK,CAAC,eAAe,EAAE,GAAG,EAAE,4EAA4E,CAAC,CAAC;IAC5G,CAAC;CACF;AAED,2EAA2E;AAC3E,+DAA+D;AAC/D,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxC;QACE,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,8CAA8C,CAAC,CAAC;IAC5E,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const isToolEventType: (value: unknown) => value is string;
|
|
2
|
+
export declare const itemIdPattern: RegExp;
|
|
3
|
+
export declare const toolNamePattern: RegExp;
|
|
4
|
+
export declare const rolePattern: RegExp;
|
|
5
|
+
export declare const fieldNamePattern: RegExp;
|
|
6
|
+
export declare const maxData: number;
|
|
7
|
+
export declare const eventWindow: number;
|
|
8
|
+
export declare const clockSkew = 5000;
|
|
9
|
+
export declare function instantOf(value: unknown): number | null;
|
|
10
|
+
export declare function isDate(value: unknown): boolean;
|
|
11
|
+
export type FieldKind = "id" | "text" | "number" | "boolean" | "time" | "date" | "member" | "members";
|
|
12
|
+
export declare function fieldOf(declared: unknown): {
|
|
13
|
+
kind: FieldKind;
|
|
14
|
+
optional: boolean;
|
|
15
|
+
} | null;
|
|
16
|
+
export declare function isDeclaredData(data: unknown, declared: Record<string, string>, known: (id: string) => boolean): boolean;
|
|
17
|
+
export type Audience = {
|
|
18
|
+
members?: string[];
|
|
19
|
+
groups?: string[];
|
|
20
|
+
roles?: string[];
|
|
21
|
+
};
|
|
22
|
+
export declare function isAudience(value: unknown): value is Audience;
|
|
23
|
+
//# sourceMappingURL=eventrules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventrules.d.ts","sourceRoot":"","sources":["../../client/src/eventrules.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,KAAK,IAAI,MACkF,CAAC;AAI7I,eAAO,MAAM,aAAa,QAAyC,CAAC;AAEpE,eAAO,MAAM,eAAe,QAA4B,CAAC;AAGzD,eAAO,MAAM,WAAW,QAA4B,CAAC;AAErD,eAAO,MAAM,gBAAgB,QAA8B,CAAC;AAG5D,eAAO,MAAM,OAAO,QAAW,CAAC;AAIhC,eAAO,MAAM,WAAW,QAAgB,CAAC;AACzC,eAAO,MAAM,SAAS,OAAO,CAAC;AAS9B,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMvD;AAGD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAK9C;AASD,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAetG,wBAAgB,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAIxF;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAUvH;AAID,MAAM,MAAM,QAAQ,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAMnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAK5D"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { groupIdPattern, memberIdPattern } from "./member.js";
|
|
2
|
+
// The rules of events between tools, as the Chest applies them
|
|
3
|
+
// (chest/toolevents): what a type, an identifier, an instant, an audience
|
|
4
|
+
// and a declared field are. events reads a delivery and checks an emit with
|
|
5
|
+
// them before sending it; testing's fake Chest refuses what the Chest
|
|
6
|
+
// refuses with them. Not a published module.
|
|
7
|
+
// A type: two to four dotted segments of lowercase letters, digits and
|
|
8
|
+
// dashes, each starting with a letter, 64 characters at most; member.* and
|
|
9
|
+
// access.* are the Chest's own (the members' lifecycle).
|
|
10
|
+
const typePattern = /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*(?:\.[a-z][a-z0-9]*(?:-[a-z0-9]+)*){1,3}$/u;
|
|
11
|
+
export const isToolEventType = (value) => typeof value === "string" && value.length <= 64 && typePattern.test(value) && !value.startsWith("member.") && !value.startsWith("access.");
|
|
12
|
+
// An identifier of the publisher's own: the "id" kind of a field, an
|
|
13
|
+
// event's subject and its idempotency key.
|
|
14
|
+
export const itemIdPattern = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/u;
|
|
15
|
+
// The name of a tool, as an event's source.
|
|
16
|
+
export const toolNamePattern = /^[a-z][a-z0-9-]{0,47}$/u;
|
|
17
|
+
// A role of a tool's own (chest.json "roles"), as an audience or a
|
|
18
|
+
// broadcast names it.
|
|
19
|
+
export const rolePattern = /^[a-z][a-z0-9-]{0,47}$/u;
|
|
20
|
+
// A field of an event's data: a camelCase name.
|
|
21
|
+
export const fieldNamePattern = /^[a-z][A-Za-z0-9]{0,39}$/u;
|
|
22
|
+
// The largest data of one event, in bytes of its JSON (UTF-8).
|
|
23
|
+
export const maxData = 16 << 10;
|
|
24
|
+
// How far back an event's occurredAt may go — the Chest's 72 hours of
|
|
25
|
+
// retries — and how far ahead the clocks of the Chest and of the container
|
|
26
|
+
// may differ, in milliseconds.
|
|
27
|
+
export const eventWindow = 72 * 3600_000;
|
|
28
|
+
export const clockSkew = 5000;
|
|
29
|
+
const daysIn = (year, month) => month === 2 ? (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28) : [4, 6, 9, 11].includes(month) ? 30 : 31;
|
|
30
|
+
const instantPattern = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.\d{1,9})?(?:Z|[+-](\d{2}):(\d{2}))$/u;
|
|
31
|
+
const datePattern = /^(\d{4})-(\d{2})-(\d{2})$/u;
|
|
32
|
+
// instantOf is the time of an RFC 3339 instant (a date, a time to the
|
|
33
|
+
// second or finer, Z or an offset) in milliseconds, or null for anything
|
|
34
|
+
// else — a day or an hour that does not exist included.
|
|
35
|
+
export function instantOf(value) {
|
|
36
|
+
const parts = typeof value === "string" ? instantPattern.exec(value) : null;
|
|
37
|
+
if (!parts)
|
|
38
|
+
return null;
|
|
39
|
+
const [year, month, day, hour, minute, second, offsetHour, offsetMinute] = parts.slice(1).map(v => Number(v ?? "0"));
|
|
40
|
+
if (month < 1 || month > 12 || day < 1 || day > daysIn(year, month) || hour > 23 || minute > 59 || second > 59 || offsetHour > 23 || offsetMinute > 59)
|
|
41
|
+
return null;
|
|
42
|
+
return Date.parse(value);
|
|
43
|
+
}
|
|
44
|
+
// isDate says a value is a day that exists, YYYY-MM-DD.
|
|
45
|
+
export function isDate(value) {
|
|
46
|
+
const parts = typeof value === "string" ? datePattern.exec(value) : null;
|
|
47
|
+
if (!parts)
|
|
48
|
+
return false;
|
|
49
|
+
const [year, month, day] = parts.slice(1).map(Number);
|
|
50
|
+
return month >= 1 && month <= 12 && day >= 1 && day <= daysIn(year, month);
|
|
51
|
+
}
|
|
52
|
+
// Text: no control character (C0, C1) but line feeds and tabs, no format
|
|
53
|
+
// character (Cf: U+200B, U+202E…) and no unpaired surrogate; no length of
|
|
54
|
+
// its own (the data's 16 KiB bound it).
|
|
55
|
+
const isText = (value) => typeof value === "string" && !/[^\P{Cc}\n\t]|[\p{Cf}\p{Cs}]/u.test(value);
|
|
56
|
+
const kinds = {
|
|
57
|
+
id: value => typeof value === "string" && itemIdPattern.test(value),
|
|
58
|
+
text: isText,
|
|
59
|
+
number: value => typeof value === "number" && Number.isFinite(value),
|
|
60
|
+
boolean: value => typeof value === "boolean",
|
|
61
|
+
time: value => instantOf(value) !== null,
|
|
62
|
+
date: isDate,
|
|
63
|
+
member: (value, known) => typeof value === "string" && memberIdPattern.test(value) && known(value),
|
|
64
|
+
// A list, empty or not, of distinct members.
|
|
65
|
+
members: (value, known) => Array.isArray(value) && value.every(v => typeof v === "string" && memberIdPattern.test(v) && known(v)) && new Set(value).size === value.length,
|
|
66
|
+
};
|
|
67
|
+
// fieldOf reads a field's declaration in "emits" ("number", "text?"): its
|
|
68
|
+
// kind and whether it may be left out; null for one the Chest refuses.
|
|
69
|
+
export function fieldOf(declared) {
|
|
70
|
+
if (typeof declared !== "string")
|
|
71
|
+
return null;
|
|
72
|
+
const optional = declared.endsWith("?"), kind = optional ? declared.slice(0, -1) : declared;
|
|
73
|
+
return Object.hasOwn(kinds, kind) ? { kind: kind, optional } : null;
|
|
74
|
+
}
|
|
75
|
+
// isDeclaredData says data is what its type declares: an object with every
|
|
76
|
+
// required field, no field not declared, each value of its kind — null is
|
|
77
|
+
// a field left out. declared
|
|
78
|
+
// maps each field to its kind ("text?"), as "emits" names them; known says
|
|
79
|
+
// a member is one the publisher has or had. Its size (maxData) is checked
|
|
80
|
+
// apart.
|
|
81
|
+
export function isDeclaredData(data, declared, known) {
|
|
82
|
+
if (data === null || typeof data !== "object" || Array.isArray(data))
|
|
83
|
+
return false;
|
|
84
|
+
const given = data;
|
|
85
|
+
for (const name of Object.keys(given))
|
|
86
|
+
if (!Object.hasOwn(declared, name))
|
|
87
|
+
return false;
|
|
88
|
+
return Object.entries(declared).every(([name, spec]) => {
|
|
89
|
+
const field = fieldOf(spec);
|
|
90
|
+
if (!field)
|
|
91
|
+
return false;
|
|
92
|
+
if (!Object.hasOwn(given, name) || given[name] === null)
|
|
93
|
+
return field.optional;
|
|
94
|
+
return kinds[field.kind](given[name], known);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const audienceLists = { members: memberIdPattern, groups: groupIdPattern, roles: rolePattern };
|
|
98
|
+
// isAudience says a value is an audience the Chest takes: an object of
|
|
99
|
+
// members, groups and roles only, each a list of distinct identifiers of
|
|
100
|
+
// its grammar, one list at least not empty.
|
|
101
|
+
export function isAudience(value) {
|
|
102
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
103
|
+
return false;
|
|
104
|
+
const lists = Object.entries(value);
|
|
105
|
+
return lists.some(([, list]) => Array.isArray(list) && list.length > 0) && lists.every(([name, list]) => Object.hasOwn(audienceLists, name) && Array.isArray(list) && list.every(v => typeof v === "string" && audienceLists[name].test(v)) && new Set(list).size === list.length);
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=eventrules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventrules.js","sourceRoot":"","sources":["../../client/src/eventrules.ts"],"names":[],"mappings":"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"}
|
package/dist/src/events.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import { type Audience } from "./eventrules.js";
|
|
2
3
|
import { type Seen } from "./signed.js";
|
|
3
4
|
export type MemberChange = "name" | "photo" | "role" | "groups" | "email" | "language" | "timeZone";
|
|
4
5
|
export type MemberUpdated = {
|
|
@@ -38,16 +39,40 @@ export type MemberErased = {
|
|
|
38
39
|
};
|
|
39
40
|
export type ChestEvent = MemberUpdated | AccessRevoked | MemberRemoved | MemberErased;
|
|
40
41
|
export type ChestEventType = ChestEvent["type"];
|
|
41
|
-
export type
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
export type ToolEvent = {
|
|
43
|
+
id: string;
|
|
44
|
+
type: string;
|
|
45
|
+
source: string;
|
|
46
|
+
occurredAt: string;
|
|
47
|
+
subject?: string;
|
|
48
|
+
audience: "all" | string[];
|
|
49
|
+
data: Record<string, unknown>;
|
|
50
|
+
};
|
|
51
|
+
export type ReceivedEvent = ChestEvent | ToolEvent;
|
|
52
|
+
export type ToolEventType = `${string}.${string}`;
|
|
53
|
+
export type Handler<K extends string> = (event: K extends ChestEventType ? Extract<ChestEvent, {
|
|
54
|
+
type: K;
|
|
55
|
+
}> : ToolEvent) => void | Promise<void>;
|
|
56
|
+
export type Handlers<K extends ToolEventType = ChestEventType | ToolEventType> = {
|
|
57
|
+
[P in K]?: Handler<P>;
|
|
45
58
|
};
|
|
46
59
|
export { memorySeen, type Seen } from "./signed.js";
|
|
47
60
|
export declare const erasureIdPattern: RegExp;
|
|
48
|
-
export declare function verify(request: IncomingMessage | Request): Promise<
|
|
49
|
-
export declare function handle(request: IncomingMessage | Request, handlers: Handlers
|
|
61
|
+
export declare function verify(request: IncomingMessage | Request): Promise<ReceivedEvent | null>;
|
|
62
|
+
export declare function handle<K extends ToolEventType>(request: IncomingMessage | Request, handlers: Handlers<K>, options?: {
|
|
50
63
|
seen?: Seen;
|
|
51
64
|
}): Promise<number>;
|
|
65
|
+
export type EmitAudience = Audience;
|
|
66
|
+
export type EmitOptions = {
|
|
67
|
+
subject?: string;
|
|
68
|
+
key?: string;
|
|
69
|
+
occurredAt?: Date | string;
|
|
70
|
+
audience?: EmitAudience;
|
|
71
|
+
};
|
|
72
|
+
export type Emitted = {
|
|
73
|
+
id: string;
|
|
74
|
+
receivers: number;
|
|
75
|
+
};
|
|
76
|
+
export declare function emit(type: string, data: Record<string, unknown>, options?: EmitOptions): Promise<Emitted>;
|
|
52
77
|
export declare function acknowledgeErasure(erasure: string): Promise<void>;
|
|
53
78
|
//# sourceMappingURL=events.d.ts.map
|
package/dist/src/events.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../client/src/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../client/src/events.ts"],"names":[],"mappings":"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"}
|