keri 0.0.0-dev.9090ca4 → 0.0.0-dev.973a137
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/cesr/attachments-reader.js +41 -33
- package/dist/cesr/attachments-reader.js.map +1 -1
- package/dist/cesr/attachments.d.ts +1 -3
- package/dist/cesr/attachments.js +3 -11
- package/dist/cesr/attachments.js.map +1 -1
- package/dist/cesr/counter.d.ts +2 -5
- package/dist/cesr/counter.js +8 -23
- package/dist/cesr/counter.js.map +1 -1
- package/dist/cesr/frame.d.ts +8 -13
- package/dist/cesr/frame.js +4 -2
- package/dist/cesr/frame.js.map +1 -1
- package/dist/cesr/genus.d.ts +0 -3
- package/dist/cesr/genus.js +2 -11
- package/dist/cesr/genus.js.map +1 -1
- package/dist/cesr/groups/generic-map.d.ts +2 -2
- package/dist/cesr/groups/generic-map.js +4 -12
- package/dist/cesr/groups/generic-map.js.map +1 -1
- package/dist/cesr/indexer.d.ts +3 -5
- package/dist/cesr/indexer.js +2 -8
- package/dist/cesr/indexer.js.map +1 -1
- package/dist/cesr/{__main__.d.ts → main.d.ts} +1 -2
- package/dist/cesr/{__main__.js → main.js} +2 -3
- package/dist/cesr/main.js.map +1 -0
- package/dist/cesr/matter.d.ts +2 -5
- package/dist/cesr/matter.js +3 -13
- package/dist/cesr/matter.js.map +1 -1
- package/dist/cesr/message.js +1 -1
- package/dist/cesr/parse.js +8 -7
- package/dist/cesr/parse.js.map +1 -1
- package/dist/cesr/version-string.js +1 -2
- package/dist/cesr/version-string.js.map +1 -1
- package/dist/cli/cli.js +3 -3
- package/dist/cli/cli.js.map +1 -1
- package/dist/controller/controller.d.ts +28 -9
- package/dist/controller/controller.js +113 -22
- package/dist/controller/controller.js.map +1 -1
- package/dist/controller/main.d.ts +1 -0
- package/dist/controller/main.js +2 -0
- package/dist/controller/main.js.map +1 -0
- package/dist/core/credential-event.d.ts +1 -1
- package/dist/core/credential-event.js +1 -1
- package/dist/core/credential-event.js.map +1 -1
- package/dist/core/credential.d.ts +1 -1
- package/dist/core/credential.js +1 -1
- package/dist/core/credential.js.map +1 -1
- package/dist/core/digest.js +3 -3
- package/dist/core/digest.js.map +1 -1
- package/dist/core/endpoint-discovery.d.ts +1 -1
- package/dist/core/events.js +2 -2
- package/dist/core/events.js.map +1 -1
- package/dist/core/kawa.d.ts +1 -1
- package/dist/core/kawa.js +2 -2
- package/dist/core/kawa.js.map +1 -1
- package/dist/core/key-event-log.d.ts +39 -1
- package/dist/core/key-event-log.js +143 -10
- package/dist/core/key-event-log.js.map +1 -1
- package/dist/core/key-event.d.ts +16 -1
- package/dist/core/key-event.js +66 -1
- package/dist/core/key-event.js.map +1 -1
- package/dist/core/keys.js +7 -7
- package/dist/core/keys.js.map +1 -1
- package/dist/core/mailbox-client.d.ts +1 -1
- package/dist/core/mailbox-client.js +34 -18
- package/dist/core/mailbox-client.js.map +1 -1
- package/dist/core/main.d.ts +9 -4
- package/dist/core/main.js +8 -3
- package/dist/core/main.js.map +1 -1
- package/dist/core/receipt-event.d.ts +1 -1
- package/dist/core/receipt-event.js +1 -1
- package/dist/core/receipt-event.js.map +1 -1
- package/dist/core/registry-event.d.ts +1 -1
- package/dist/core/registry-event.js +1 -1
- package/dist/core/registry-event.js.map +1 -1
- package/dist/core/routed-event.d.ts +1 -1
- package/dist/core/routed-event.js +1 -1
- package/dist/core/routed-event.js.map +1 -1
- package/dist/core/said.js +9 -6
- package/dist/core/said.js.map +1 -1
- package/dist/core/sign.js +3 -3
- package/dist/core/sign.js.map +1 -1
- package/dist/core/verify.d.ts +1 -1
- package/dist/core/verify.js +1 -1
- package/dist/core/verify.js.map +1 -1
- package/dist/core/witness-client.d.ts +1 -1
- package/dist/core/witness-client.js +2 -2
- package/dist/core/witness-client.js.map +1 -1
- package/dist/encoding/main.d.ts +2 -0
- package/dist/encoding/main.js +3 -0
- package/dist/encoding/main.js.map +1 -0
- package/dist/logging/main.d.ts +15 -0
- package/dist/logging/main.js +25 -0
- package/dist/logging/main.js.map +1 -0
- package/dist/mailbox/mailbox-router.d.ts +6 -0
- package/dist/mailbox/mailbox-router.js +88 -0
- package/dist/mailbox/mailbox-router.js.map +1 -0
- package/dist/mailbox/mailbox.d.ts +27 -0
- package/dist/mailbox/mailbox.js +101 -0
- package/dist/mailbox/mailbox.js.map +1 -0
- package/dist/mailbox/main.d.ts +3 -0
- package/dist/mailbox/main.js +3 -0
- package/dist/mailbox/main.js.map +1 -0
- package/dist/main.d.ts +2 -2
- package/dist/main.js +1 -2
- package/dist/main.js.map +1 -1
- package/dist/nodejs-utils/main.d.ts +2 -0
- package/dist/nodejs-utils/main.js +2 -0
- package/dist/nodejs-utils/main.js.map +1 -0
- package/dist/nodejs-utils/serve.d.ts +4 -3
- package/dist/nodejs-utils/serve.js +29 -38
- package/dist/nodejs-utils/serve.js.map +1 -1
- package/dist/{storage/sqlite/storage-sqlite.d.ts → sqlite-storage/main.d.ts} +5 -6
- package/dist/{storage/sqlite/storage-sqlite.js → sqlite-storage/main.js} +34 -9
- package/dist/sqlite-storage/main.js.map +1 -0
- package/dist/sqlite-storage/node-sqlite.js.map +1 -0
- package/dist/{storage/sqlite → sqlite-storage}/schema.js +12 -0
- package/dist/sqlite-storage/schema.js.map +1 -0
- package/dist/sqlite-storage/sqlite-database.js.map +1 -0
- package/dist/storage/mailbox-server-storage.d.ts +9 -0
- package/dist/storage/mailbox-server-storage.js +2 -0
- package/dist/storage/mailbox-server-storage.js.map +1 -0
- package/dist/storage/main.d.ts +5 -0
- package/dist/storage/main.js +2 -0
- package/dist/storage/main.js.map +1 -0
- package/dist/witness/main.d.ts +2 -1
- package/dist/witness/main.js.map +1 -1
- package/dist/witness/witness-router.d.ts +5 -1
- package/dist/witness/witness-router.js +25 -9
- package/dist/witness/witness-router.js.map +1 -1
- package/dist/witness/witness.d.ts +4 -2
- package/dist/witness/witness.js +32 -7
- package/dist/witness/witness.js.map +1 -1
- package/package.json +5 -5
- package/dist/cesr/__main__.js.map +0 -1
- package/dist/cesr/codec.d.ts +0 -26
- package/dist/cesr/codec.js +0 -26
- package/dist/cesr/codec.js.map +0 -1
- package/dist/storage/sqlite/node-sqlite.js.map +0 -1
- package/dist/storage/sqlite/schema.js.map +0 -1
- package/dist/storage/sqlite/sqlite-database.js.map +0 -1
- package/dist/storage/sqlite/storage-sqlite.js.map +0 -1
- package/dist/witness/parser.d.ts +0 -3
- package/dist/witness/parser.js +0 -7
- package/dist/witness/parser.js.map +0 -1
- package/dist/witness/seed.d.ts +0 -1
- package/dist/witness/seed.js +0 -5
- package/dist/witness/seed.js.map +0 -1
- /package/dist/{storage/sqlite → sqlite-storage}/node-sqlite.d.ts +0 -0
- /package/dist/{storage/sqlite → sqlite-storage}/node-sqlite.js +0 -0
- /package/dist/{storage/sqlite → sqlite-storage}/schema.d.ts +0 -0
- /package/dist/{storage/sqlite → sqlite-storage}/sqlite-database.d.ts +0 -0
- /package/dist/{storage/sqlite → sqlite-storage}/sqlite-database.js +0 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
|
-
import {
|
|
3
|
-
function toWebRequest(req
|
|
2
|
+
import { KeriLogger } from "../logging/main.js";
|
|
3
|
+
function toWebRequest(req) {
|
|
4
|
+
const host = req.headers.host ?? "0.0.0.0";
|
|
5
|
+
const protocol = req.headers["x-forwarded-proto"] ?? "http";
|
|
6
|
+
const url = new URL(req.url ?? "/", `${protocol}://${host}`);
|
|
4
7
|
const headers = new Headers();
|
|
5
8
|
for (const [key, headerValue] of Object.entries(req.headers)) {
|
|
6
9
|
if (headerValue !== undefined) {
|
|
@@ -18,57 +21,45 @@ function toWebRequest(req, url) {
|
|
|
18
21
|
if (!["GET", "HEAD"].includes(req.method ?? "")) {
|
|
19
22
|
body = Readable.toWeb(req);
|
|
20
23
|
}
|
|
21
|
-
|
|
24
|
+
return new Request(url, {
|
|
22
25
|
method: req.method,
|
|
23
|
-
headers
|
|
26
|
+
headers,
|
|
24
27
|
body,
|
|
25
28
|
duplex: "half",
|
|
26
29
|
// Cast required because DOM types omit `duplex`, but Node.js undici fetch requires it when body is a stream
|
|
27
30
|
});
|
|
28
|
-
return request;
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
const protocol = req.headers["x-forwarded-proto"] ?? "http";
|
|
33
|
-
const url = new URL(req.url ?? "/", `${protocol}://${host}`);
|
|
34
|
-
const request = toWebRequest(req, url);
|
|
35
|
-
const response = await handler(request);
|
|
36
|
-
res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
37
|
-
const reader = response.body?.getReader();
|
|
38
|
-
if (reader) {
|
|
39
|
-
while (true) {
|
|
40
|
-
const { done, value } = await reader.read();
|
|
41
|
-
if (done)
|
|
42
|
-
break;
|
|
43
|
-
res.write(value);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
res.end();
|
|
47
|
-
}
|
|
48
|
-
export function createListener(handler, logger) {
|
|
32
|
+
export function createListener(handler, options = {}) {
|
|
33
|
+
const log = new KeriLogger(options.logger);
|
|
49
34
|
return async (req, res) => {
|
|
50
35
|
const start = Date.now();
|
|
51
|
-
const url = req.url ?? "/";
|
|
52
36
|
const method = req.method ?? "GET";
|
|
53
|
-
|
|
37
|
+
const url = req.url ?? "/";
|
|
54
38
|
res.on("finish", () => {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
response: {
|
|
63
|
-
status: res.statusCode,
|
|
64
|
-
},
|
|
39
|
+
const durationMs = Date.now() - start;
|
|
40
|
+
log.info(`${method} ${url} ${res.statusCode} ${durationMs}ms`, {
|
|
41
|
+
method,
|
|
42
|
+
url,
|
|
43
|
+
status: res.statusCode,
|
|
44
|
+
durationMs,
|
|
65
45
|
});
|
|
66
46
|
});
|
|
67
47
|
try {
|
|
68
|
-
await
|
|
48
|
+
const response = await handler(toWebRequest(req));
|
|
49
|
+
res.writeHead(response.status, Object.fromEntries(response.headers.entries()));
|
|
50
|
+
if (response.body) {
|
|
51
|
+
const reader = response.body.getReader();
|
|
52
|
+
while (true) {
|
|
53
|
+
const { done, value } = await reader.read();
|
|
54
|
+
if (done)
|
|
55
|
+
break;
|
|
56
|
+
res.write(value);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
res.end();
|
|
69
60
|
}
|
|
70
61
|
catch (err) {
|
|
71
|
-
|
|
62
|
+
log.error("handler threw", { method, url, error: err instanceof Error ? err.message : String(err) });
|
|
72
63
|
res.statusCode = 500;
|
|
73
64
|
res.end("Internal Server Error");
|
|
74
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/nodejs-utils/serve.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/nodejs-utils/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import type { Database } from "./sqlite-database.ts";
|
|
2
2
|
export { NodeSqliteDatabase } from "./node-sqlite.ts";
|
|
3
3
|
export type { Database, Params, Row, SQLValue } from "./sqlite-database.ts";
|
|
4
|
-
import { type CredentialBody, type IssueEvent, type KeyEvent, Message, type RegistryInceptEventBody, type ReplyEventBody, type RevokeEvent } from "
|
|
5
|
-
import type { CredentialStorage } from "../
|
|
6
|
-
|
|
7
|
-
import type { MailboxStorage } from "../mailbox-storage.ts";
|
|
8
|
-
import type { PrivateKeyStorage } from "../private-key-storage.ts";
|
|
9
|
-
export declare class SqliteControllerStorage implements KeyEventStorage, PrivateKeyStorage, CredentialStorage, MailboxStorage {
|
|
4
|
+
import { type CredentialBody, type IssueEvent, type KeyEvent, Message, type RegistryInceptEventBody, type ReplyEventBody, type RevokeEvent } from "../core/main.ts";
|
|
5
|
+
import type { CredentialStorage, KeyEventStorage, MailboxEntry, MailboxServerStorage, MailboxStorage, PrivateKeyStorage } from "../storage/main.ts";
|
|
6
|
+
export declare class SqliteControllerStorage implements KeyEventStorage, PrivateKeyStorage, CredentialStorage, MailboxStorage, MailboxServerStorage {
|
|
10
7
|
#private;
|
|
11
8
|
constructor(db: Database);
|
|
12
9
|
saveKey(publicKey: string, digest: string, encryptedPrivKey: string): void;
|
|
@@ -26,4 +23,6 @@ export declare class SqliteControllerStorage implements KeyEventStorage, Private
|
|
|
26
23
|
getCredentialsByRegistry(registryId: string): CredentialBody[];
|
|
27
24
|
getMailboxOffset(prefix: string, topic: string): number;
|
|
28
25
|
saveMailboxOffset(prefix: string, topic: string, offset: number): void;
|
|
26
|
+
saveMailboxEntry(pre: string, topic: string, message: Message): void;
|
|
27
|
+
getMailboxEntries(pre: string, topic: string, offset: number): Generator<MailboxEntry>;
|
|
29
28
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { migrate } from "./schema.js";
|
|
2
2
|
export { NodeSqliteDatabase } from "./node-sqlite.js";
|
|
3
|
-
import {
|
|
3
|
+
import { encodeText } from "../cesr/main.js";
|
|
4
|
+
import { Attachments, Message, } from "../core/main.js";
|
|
4
5
|
function parseRow(result) {
|
|
5
6
|
if (!("event_json" in result) || typeof result.event_json !== "string") {
|
|
6
7
|
throw new Error("Row does not contain event_json");
|
|
@@ -21,13 +22,15 @@ function prepareRow(message) {
|
|
|
21
22
|
type: "credential",
|
|
22
23
|
sn: null,
|
|
23
24
|
event_json: JSON.stringify(body),
|
|
24
|
-
attachments: message.attachments.
|
|
25
|
+
attachments: encodeText(message.attachments.frames()),
|
|
25
26
|
};
|
|
26
27
|
}
|
|
27
28
|
switch (message.body.t) {
|
|
28
29
|
case "icp":
|
|
29
30
|
case "rot":
|
|
30
|
-
case "ixn":
|
|
31
|
+
case "ixn":
|
|
32
|
+
case "dip":
|
|
33
|
+
case "drt": {
|
|
31
34
|
const body = message.body;
|
|
32
35
|
return {
|
|
33
36
|
event_id: body.d,
|
|
@@ -35,7 +38,7 @@ function prepareRow(message) {
|
|
|
35
38
|
type: body.t,
|
|
36
39
|
sn: parseInt(body.s, 16),
|
|
37
40
|
event_json: JSON.stringify(body),
|
|
38
|
-
attachments: message.attachments.
|
|
41
|
+
attachments: encodeText(message.attachments.frames()),
|
|
39
42
|
};
|
|
40
43
|
}
|
|
41
44
|
case "vcp": {
|
|
@@ -46,7 +49,7 @@ function prepareRow(message) {
|
|
|
46
49
|
type: body.t,
|
|
47
50
|
sn: null,
|
|
48
51
|
event_json: JSON.stringify(body),
|
|
49
|
-
attachments: message.attachments.
|
|
52
|
+
attachments: encodeText(message.attachments.frames()),
|
|
50
53
|
};
|
|
51
54
|
}
|
|
52
55
|
case "iss":
|
|
@@ -58,7 +61,7 @@ function prepareRow(message) {
|
|
|
58
61
|
type: body.t,
|
|
59
62
|
sn: null,
|
|
60
63
|
event_json: JSON.stringify(body),
|
|
61
|
-
attachments: message.attachments.
|
|
64
|
+
attachments: encodeText(message.attachments.frames()),
|
|
62
65
|
};
|
|
63
66
|
}
|
|
64
67
|
default: {
|
|
@@ -69,7 +72,7 @@ function prepareRow(message) {
|
|
|
69
72
|
type: typeof body.t === "string" ? body.t : null,
|
|
70
73
|
sn: null,
|
|
71
74
|
event_json: JSON.stringify(body),
|
|
72
|
-
attachments: message.attachments.
|
|
75
|
+
attachments: encodeText(message.attachments.frames()),
|
|
73
76
|
};
|
|
74
77
|
}
|
|
75
78
|
}
|
|
@@ -150,7 +153,7 @@ export class SqliteControllerStorage {
|
|
|
150
153
|
"SELECT event_json, attachments",
|
|
151
154
|
"FROM event",
|
|
152
155
|
"WHERE json_extract(event_json, '$.i') = $prefix",
|
|
153
|
-
"AND type in ('icp', 'rot', 'ixn')",
|
|
156
|
+
"AND type in ('icp', 'rot', 'ixn', 'dip', 'drt')",
|
|
154
157
|
"ORDER BY sn ASC",
|
|
155
158
|
].join("\n");
|
|
156
159
|
for (const result of this.#db.iterate(statement, { prefix })) {
|
|
@@ -210,5 +213,27 @@ export class SqliteControllerStorage {
|
|
|
210
213
|
this.#db.execute("INSERT INTO mailbox_cursor(prefix, topic, offset) VALUES ($prefix, $topic, $offset) " +
|
|
211
214
|
"ON CONFLICT(prefix, topic) DO UPDATE SET offset = $offset", { prefix, topic, offset });
|
|
212
215
|
}
|
|
216
|
+
saveMailboxEntry(pre, topic, message) {
|
|
217
|
+
this.#db.execute("INSERT INTO mailbox_entry(pre, topic, event_json, attachments) VALUES ($pre, $topic, $event_json, $attachments)", {
|
|
218
|
+
pre,
|
|
219
|
+
topic,
|
|
220
|
+
event_json: JSON.stringify(message.body),
|
|
221
|
+
attachments: encodeText(message.attachments.frames()),
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
*getMailboxEntries(pre, topic, offset) {
|
|
225
|
+
const statement = [
|
|
226
|
+
"SELECT id, event_json, attachments FROM mailbox_entry",
|
|
227
|
+
"WHERE pre = $pre AND topic = $topic AND id > $offset",
|
|
228
|
+
"ORDER BY id ASC",
|
|
229
|
+
].join("\n");
|
|
230
|
+
for (const row of this.#db.iterate(statement, { pre, topic, offset })) {
|
|
231
|
+
const id = row.id;
|
|
232
|
+
if (typeof id !== "number") {
|
|
233
|
+
throw new Error("mailbox_entry.id missing or not a number");
|
|
234
|
+
}
|
|
235
|
+
yield { id, message: parseRow(row) };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
213
238
|
}
|
|
214
|
-
//# sourceMappingURL=
|
|
239
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/sqlite-storage/main.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-sqlite.js","sourceRoot":"","sources":["../../src/sqlite-storage/node-sqlite.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B,GAAG,CAAe;IAElB,YAAY,EAAgB;QAC1B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,MAAe;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,MAAe;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,MAAyB,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,MAAe;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAkB,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -30,6 +30,18 @@ const migrations = [
|
|
|
30
30
|
")",
|
|
31
31
|
].join("\n"),
|
|
32
32
|
],
|
|
33
|
+
// Migration 3: mailbox entry (server-side message store)
|
|
34
|
+
[
|
|
35
|
+
[
|
|
36
|
+
"CREATE TABLE IF NOT EXISTS mailbox_entry (",
|
|
37
|
+
" id INTEGER PRIMARY KEY AUTOINCREMENT,",
|
|
38
|
+
" pre TEXT NOT NULL,",
|
|
39
|
+
" topic TEXT NOT NULL,",
|
|
40
|
+
" event_json JSON NOT NULL,",
|
|
41
|
+
" attachments TEXT",
|
|
42
|
+
")",
|
|
43
|
+
].join("\n"),
|
|
44
|
+
],
|
|
33
45
|
];
|
|
34
46
|
export function migrate(db) {
|
|
35
47
|
db.execute(`CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL)`);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/sqlite-storage/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAe;IAC7B,8BAA8B;IAC9B;QACE;YACE,oCAAoC;YACpC,iCAAiC;YACjC,8BAA8B;YAC9B,8BAA8B;YAC9B,wBAAwB;YACxB,8BAA8B;YAC9B,oBAAoB;YACpB,GAAG;SACJ,CAAC,IAAI,CAAC,IAAI,CAAC;QACZ;YACE,uCAAuC;YACvC,2CAA2C;YAC3C,wCAAwC;YACxC,uCAAuC;YACvC,GAAG;SACJ,CAAC,IAAI,CAAC,IAAI,CAAC;KACb;IACD,8BAA8B;IAC9B;QACE;YACE,6CAA6C;YAC7C,yBAAyB;YACzB,yBAAyB;YACzB,sCAAsC;YACtC,+BAA+B;YAC/B,GAAG;SACJ,CAAC,IAAI,CAAC,IAAI,CAAC;KACb;IACD,yDAAyD;IACzD;QACE;YACE,4CAA4C;YAC5C,kDAAkD;YAClD,8BAA8B;YAC9B,8BAA8B;YAC9B,8BAA8B;YAC9B,oBAAoB;YACpB,GAAG;SACJ,CAAC,IAAI,CAAC,IAAI,CAAC;KACb;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,EAAY;IAClC,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC;IACnF,EAAE,CAAC,OAAO,CAAC,+FAA+F,CAAC,CAAC;IAE5G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YACD,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-database.js","sourceRoot":"","sources":["../../src/sqlite-storage/sqlite-database.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Message } from "../cesr/main.ts";
|
|
2
|
+
export interface MailboxEntry {
|
|
3
|
+
id: number;
|
|
4
|
+
message: Message;
|
|
5
|
+
}
|
|
6
|
+
export interface MailboxServerStorage {
|
|
7
|
+
saveMailboxEntry(pre: string, topic: string, message: Message): void;
|
|
8
|
+
getMailboxEntries(pre: string, topic: string, offset: number): Generator<MailboxEntry>;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox-server-storage.js","sourceRoot":"","sources":["../../src/storage/mailbox-server-storage.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { CredentialStorage } from "./credential-storage.ts";
|
|
2
|
+
export type { KeyEventStorage } from "./key-event-storage.ts";
|
|
3
|
+
export type { MailboxEntry, MailboxServerStorage } from "./mailbox-server-storage.ts";
|
|
4
|
+
export type { MailboxStorage } from "./mailbox-storage.ts";
|
|
5
|
+
export type { PrivateKeyStorage } from "./private-key-storage.ts";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/storage/main.ts"],"names":[],"mappings":""}
|
package/dist/witness/main.d.ts
CHANGED
package/dist/witness/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/witness/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/witness/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,YAAY,EAA0C,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAsB,MAAM,qBAAqB,CAAC"}
|
|
@@ -1,2 +1,6 @@
|
|
|
1
|
+
import { type Logger } from "../logging/main.ts";
|
|
1
2
|
import { type Witness } from "./witness.ts";
|
|
2
|
-
export
|
|
3
|
+
export interface RouterOptions {
|
|
4
|
+
logger?: Logger;
|
|
5
|
+
}
|
|
6
|
+
export declare function createRouter(witness: Witness, options?: RouterOptions): (request: Request) => Promise<Response>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Attachments } from "../cesr/
|
|
2
|
-
import {
|
|
1
|
+
import { Attachments, encodeText, parse } from "../cesr/main.js";
|
|
2
|
+
import { KeriLogger } from "../logging/main.js";
|
|
3
3
|
import { WitnessError } from "./witness.js";
|
|
4
4
|
function createResponse(events) {
|
|
5
5
|
const body = events
|
|
@@ -10,7 +10,7 @@ function createResponse(events) {
|
|
|
10
10
|
NonTransReceiptCouples: message.attachments.NonTransReceiptCouples,
|
|
11
11
|
FirstSeenReplayCouples: [{ fnu: String(message.body.s ?? "0"), dt: timestamp }],
|
|
12
12
|
});
|
|
13
|
-
return [new TextDecoder().decode(message.raw), atc.
|
|
13
|
+
return [new TextDecoder().decode(message.raw), encodeText(atc.frames())];
|
|
14
14
|
})
|
|
15
15
|
.join("");
|
|
16
16
|
return new Response(body, {
|
|
@@ -18,26 +18,30 @@ function createResponse(events) {
|
|
|
18
18
|
headers: { "Content-Type": "application/json+cesr" },
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
export function createRouter(witness) {
|
|
21
|
+
export function createRouter(witness, options = {}) {
|
|
22
|
+
const log = new KeriLogger(options.logger);
|
|
22
23
|
async function handleReceiptRequest(request) {
|
|
23
24
|
const atc = request.headers.get("CESR-ATTACHMENT");
|
|
24
25
|
if (!atc) {
|
|
26
|
+
log.warn("rejecting POST /receipts: missing CESR-ATTACHMENT");
|
|
25
27
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
26
28
|
}
|
|
27
29
|
const bodyText = await request.text();
|
|
28
30
|
const receipts = [];
|
|
29
|
-
for await (const witnessEvent of
|
|
31
|
+
for await (const witnessEvent of parse(bodyText + atc)) {
|
|
30
32
|
try {
|
|
31
|
-
const receipt = witness.receipt(witnessEvent
|
|
33
|
+
const receipt = witness.receipt(witnessEvent);
|
|
32
34
|
receipts.push({ message: receipt, timestamp: new Date() });
|
|
33
35
|
}
|
|
34
36
|
catch (err) {
|
|
35
37
|
if (err instanceof WitnessError) {
|
|
38
|
+
log.warn("rejecting POST /receipts", { error: err.message });
|
|
36
39
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
37
40
|
}
|
|
38
41
|
throw err;
|
|
39
42
|
}
|
|
40
43
|
}
|
|
44
|
+
log.debug("POST /receipts: issued receipts", { count: receipts.length });
|
|
41
45
|
return createResponse(receipts);
|
|
42
46
|
}
|
|
43
47
|
async function handleOobiRequest(request) {
|
|
@@ -45,6 +49,7 @@ export function createRouter(witness) {
|
|
|
45
49
|
const aid = url.pathname.split("/")[2];
|
|
46
50
|
let response;
|
|
47
51
|
if (aid === undefined || aid === witness.aid) {
|
|
52
|
+
log.debug("GET /oobi: serving self", { count: witness.events.length });
|
|
48
53
|
response = createResponse(witness.events);
|
|
49
54
|
}
|
|
50
55
|
else {
|
|
@@ -52,7 +57,14 @@ export function createRouter(witness) {
|
|
|
52
57
|
message: event,
|
|
53
58
|
timestamp: event.attachments.FirstSeenReplayCouples[0]?.dt ?? new Date(0),
|
|
54
59
|
}));
|
|
55
|
-
|
|
60
|
+
if (events.length === 0) {
|
|
61
|
+
log.debug("GET /oobi: not found", { aid });
|
|
62
|
+
response = new Response("Not Found", { status: 404 });
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
log.debug("GET /oobi: serving events", { aid, count: events.length });
|
|
66
|
+
response = createResponse(events);
|
|
67
|
+
}
|
|
56
68
|
}
|
|
57
69
|
response.headers.set("Keri-Aid", witness.aid);
|
|
58
70
|
return response;
|
|
@@ -60,12 +72,16 @@ export function createRouter(witness) {
|
|
|
60
72
|
async function handleMessageRequest(request) {
|
|
61
73
|
const atc = request.headers.get("CESR-ATTACHMENT");
|
|
62
74
|
if (!atc) {
|
|
75
|
+
log.warn("rejecting POST /: missing CESR-ATTACHMENT");
|
|
63
76
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
64
77
|
}
|
|
65
78
|
const bodyText = await request.text();
|
|
66
|
-
|
|
67
|
-
|
|
79
|
+
let count = 0;
|
|
80
|
+
for await (const event of parse(bodyText + atc)) {
|
|
81
|
+
witness.handleMessage(event);
|
|
82
|
+
count++;
|
|
68
83
|
}
|
|
84
|
+
log.debug("POST /: handled messages", { count });
|
|
69
85
|
return new Response(null, { status: 200 });
|
|
70
86
|
}
|
|
71
87
|
return async function handler(request) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"witness-router.js","sourceRoot":"","sources":["../../src/witness/witness-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"witness-router.js","sourceRoot":"","sources":["../../src/witness/witness-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { Message } from "../cesr/
|
|
1
|
+
import { Message } from "../cesr/main.ts";
|
|
2
2
|
import { type KeyEvent, type KeyEventBody, KeyEventLog, type ReceiptEventBody } from "../core/main.ts";
|
|
3
|
-
import type
|
|
3
|
+
import { type Logger } from "../logging/main.ts";
|
|
4
|
+
import type { KeyEventStorage } from "../storage/main.ts";
|
|
4
5
|
export interface WitnessOptions {
|
|
5
6
|
privateKey?: Uint8Array;
|
|
6
7
|
url?: string;
|
|
7
8
|
storage: KeyEventStorage;
|
|
9
|
+
logger?: Logger;
|
|
8
10
|
}
|
|
9
11
|
export interface WitnessEvent {
|
|
10
12
|
readonly message: Message;
|
package/dist/witness/witness.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ed25519 } from "@noble/curves/ed25519.js";
|
|
2
|
-
import { Attachments, Indexer, Matter, Message } from "../cesr/
|
|
2
|
+
import { Attachments, encodeText, Indexer, Matter, Message } from "../cesr/main.js";
|
|
3
3
|
import { KeyEventLog, keri } from "../core/main.js";
|
|
4
|
+
import { KeriLogger } from "../logging/main.js";
|
|
4
5
|
export class WitnessError extends Error {
|
|
5
6
|
}
|
|
6
7
|
export class Witness {
|
|
@@ -8,17 +9,18 @@ export class Witness {
|
|
|
8
9
|
#storage;
|
|
9
10
|
#privateKey;
|
|
10
11
|
#kel;
|
|
12
|
+
#log;
|
|
11
13
|
get aid() {
|
|
12
14
|
return this.#kel.state.identifier;
|
|
13
15
|
}
|
|
14
16
|
static createKEL(privateKey) {
|
|
15
|
-
const publicKey = new Matter({ code: Matter.Code.Ed25519N, raw: ed25519.getPublicKey(privateKey) })
|
|
17
|
+
const publicKey = encodeText(new Matter({ code: Matter.Code.Ed25519N, raw: ed25519.getPublicKey(privateKey) }));
|
|
16
18
|
const icp = keri.incept({
|
|
17
19
|
signingKeys: [publicKey],
|
|
18
20
|
nextKeys: [],
|
|
19
21
|
});
|
|
20
22
|
icp.attachments = {
|
|
21
|
-
ControllerIdxSigs: [Indexer.crypto.ed25519_sig(ed25519.sign(icp.raw, privateKey), 0)
|
|
23
|
+
ControllerIdxSigs: [encodeText(Indexer.crypto.ed25519_sig(ed25519.sign(icp.raw, privateKey), 0))],
|
|
22
24
|
};
|
|
23
25
|
return KeyEventLog.from([icp]);
|
|
24
26
|
}
|
|
@@ -26,6 +28,7 @@ export class Witness {
|
|
|
26
28
|
this.#storage = options.storage;
|
|
27
29
|
this.#privateKey = options.privateKey ?? ed25519.utils.randomSecretKey();
|
|
28
30
|
this.#kel = Witness.createKEL(this.#privateKey);
|
|
31
|
+
this.#log = new KeriLogger(options.logger);
|
|
29
32
|
const events = [{ message: this.#kel.events[0], timestamp: new Date() }];
|
|
30
33
|
if (options.url) {
|
|
31
34
|
const url = new URL(options.url);
|
|
@@ -60,9 +63,11 @@ export class Witness {
|
|
|
60
63
|
receipt(message) {
|
|
61
64
|
const body = message.body;
|
|
62
65
|
if (typeof body.i !== "string" || typeof body.d !== "string" || typeof body.s !== "string") {
|
|
66
|
+
this.#log.warn("rejecting receipt: missing required fields i/d/s");
|
|
63
67
|
throw new WitnessError("Missing required fields i, d, s");
|
|
64
68
|
}
|
|
65
69
|
if (message.attachments.ControllerIdxSigs.length === 0) {
|
|
70
|
+
this.#log.warn("rejecting receipt: no controller signatures", { aid: body.i, s: body.s, d: body.d });
|
|
66
71
|
throw new WitnessError("Missing controller signatures");
|
|
67
72
|
}
|
|
68
73
|
let kel = KeyEventLog.from(this.#storage.getKeyEvents(body.i));
|
|
@@ -71,16 +76,27 @@ export class Witness {
|
|
|
71
76
|
}
|
|
72
77
|
catch (error) {
|
|
73
78
|
if (error instanceof Error) {
|
|
79
|
+
this.#log.warn("rejecting receipt: KEL append failed", {
|
|
80
|
+
aid: body.i,
|
|
81
|
+
s: body.s,
|
|
82
|
+
d: body.d,
|
|
83
|
+
error: error.message,
|
|
84
|
+
});
|
|
74
85
|
throw new WitnessError(`Failed to append message to KEL: ${error.message}`);
|
|
75
86
|
}
|
|
76
87
|
}
|
|
77
|
-
const sig = this.#sign(message);
|
|
78
88
|
const witnessIndex = kel.state.backers.indexOf(this.aid);
|
|
89
|
+
if (witnessIndex < 0) {
|
|
90
|
+
this.#log.warn("rejecting receipt: not a backer for this AID", { aid: body.i, s: body.s, d: body.d });
|
|
91
|
+
throw new WitnessError("Witness is not a backer for this AID");
|
|
92
|
+
}
|
|
93
|
+
this.#log.debug("issuing receipt", { aid: body.i, s: body.s, d: body.d });
|
|
94
|
+
const sig = this.#sign(message);
|
|
79
95
|
const receipt = keri.receipt({ d: message.body.d, i: message.body.i, s: message.body.s });
|
|
80
96
|
receipt.attachments = {
|
|
81
97
|
NonTransReceiptCouples: [{ prefix: this.#kel.state.identifier, sig }],
|
|
82
98
|
};
|
|
83
|
-
const WitnessIdxSigs =
|
|
99
|
+
const WitnessIdxSigs = [encodeText(Indexer.convert(Matter.parse(sig), witnessIndex))];
|
|
84
100
|
const storedMessage = new Message(message.body, {
|
|
85
101
|
ControllerIdxSigs: message.attachments.ControllerIdxSigs,
|
|
86
102
|
WitnessIdxSigs,
|
|
@@ -92,20 +108,28 @@ export class Witness {
|
|
|
92
108
|
handleMessage(message) {
|
|
93
109
|
const body = message.body;
|
|
94
110
|
if (body.t !== "rct") {
|
|
111
|
+
this.#log.debug("ignoring message: only rct handled", { t: body.t });
|
|
95
112
|
return;
|
|
96
113
|
}
|
|
97
114
|
if (typeof body.i !== "string" || typeof body.d !== "string") {
|
|
115
|
+
this.#log.warn("ignoring receipt: missing i/d");
|
|
98
116
|
return;
|
|
99
117
|
}
|
|
100
118
|
const kel = KeyEventLog.from(this.#storage.getKeyEvents(body.i), {
|
|
101
119
|
// TODO: This should only be for the event that is this receit
|
|
102
120
|
allowPartiallyWitnessed: true,
|
|
103
121
|
});
|
|
122
|
+
if (kel.events.length === 0) {
|
|
123
|
+
this.#log.debug("ignoring receipt: no events stored for aid", { aid: body.i, d: body.d });
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
104
126
|
if (!kel.state.backers.includes(this.aid)) {
|
|
127
|
+
this.#log.debug("ignoring receipt: not a backer", { aid: body.i, d: body.d });
|
|
105
128
|
return;
|
|
106
129
|
}
|
|
107
130
|
const storedEvent = kel.events.find((event) => event.body.d === body.d);
|
|
108
131
|
if (!storedEvent) {
|
|
132
|
+
this.#log.debug("ignoring receipt: no matching stored event", { aid: body.i, d: body.d });
|
|
109
133
|
return;
|
|
110
134
|
}
|
|
111
135
|
const existingWigsByIndex = new Map();
|
|
@@ -118,7 +142,7 @@ export class Witness {
|
|
|
118
142
|
if (witnessIndex === -1) {
|
|
119
143
|
continue;
|
|
120
144
|
}
|
|
121
|
-
const wigSig = Indexer.convert(Matter.parse(couple.sig), witnessIndex)
|
|
145
|
+
const wigSig = encodeText(Indexer.convert(Matter.parse(couple.sig), witnessIndex));
|
|
122
146
|
existingWigsByIndex.set(witnessIndex, wigSig);
|
|
123
147
|
}
|
|
124
148
|
const mergedAttachments = new Attachments({
|
|
@@ -126,6 +150,7 @@ export class Witness {
|
|
|
126
150
|
WitnessIdxSigs: Array.from(existingWigsByIndex.values()),
|
|
127
151
|
FirstSeenReplayCouples: storedEvent.attachments.FirstSeenReplayCouples,
|
|
128
152
|
});
|
|
153
|
+
this.#log.debug("merged witness sigs", { aid: body.i, d: body.d, count: existingWigsByIndex.size });
|
|
129
154
|
this.#storage.saveMessage(new Message(storedEvent.body, mergedAttachments));
|
|
130
155
|
}
|
|
131
156
|
*getKeyEvents(aid) {
|
|
@@ -133,7 +158,7 @@ export class Witness {
|
|
|
133
158
|
}
|
|
134
159
|
#sign(message) {
|
|
135
160
|
const rawSignature = ed25519.sign(message.raw, this.#privateKey);
|
|
136
|
-
return new Matter({ code: Matter.Code.Ed25519_Sig, raw: rawSignature })
|
|
161
|
+
return encodeText(new Matter({ code: Matter.Code.Ed25519_Sig, raw: rawSignature }));
|
|
137
162
|
}
|
|
138
163
|
}
|
|
139
164
|
//# sourceMappingURL=witness.js.map
|