keri 0.0.0-dev.1238b11 → 0.0.0-dev.1dab5a8
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/controller/controller.d.ts +2 -0
- package/dist/controller/controller.js +54 -2
- package/dist/controller/controller.js.map +1 -1
- package/dist/core/mailbox-client.js +32 -16
- package/dist/core/mailbox-client.js.map +1 -1
- 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 +1 -0
- 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/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 +1 -0
- package/dist/storage/sqlite/schema.js +12 -0
- package/dist/storage/sqlite/schema.js.map +1 -1
- package/dist/storage/sqlite/storage-sqlite.d.ts +4 -1
- package/dist/storage/sqlite/storage-sqlite.js +22 -0
- package/dist/storage/sqlite/storage-sqlite.js.map +1 -1
- 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 +19 -2
- package/dist/witness/witness-router.js.map +1 -1
- package/dist/witness/witness.d.ts +2 -0
- package/dist/witness/witness.js +17 -0
- package/dist/witness/witness.js.map +1 -1
- package/package.json +22 -14
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ed25519 } from "@noble/curves/ed25519.js";
|
|
2
|
+
import { encodeText, Indexer, Matter, Message } from "#keri/cesr";
|
|
3
|
+
import { KeyEventLog, keri } from "#keri/core";
|
|
4
|
+
import { KeriLogger } from "#keri/logging";
|
|
5
|
+
export class Mailbox {
|
|
6
|
+
#storage;
|
|
7
|
+
#privateKey;
|
|
8
|
+
#kel;
|
|
9
|
+
#log;
|
|
10
|
+
events;
|
|
11
|
+
static createKEL(privateKey) {
|
|
12
|
+
const publicKey = encodeText(new Matter({ code: Matter.Code.Ed25519N, raw: ed25519.getPublicKey(privateKey) }));
|
|
13
|
+
const icp = keri.incept({ signingKeys: [publicKey], nextKeys: [] });
|
|
14
|
+
icp.attachments = {
|
|
15
|
+
ControllerIdxSigs: [encodeText(Indexer.crypto.ed25519_sig(ed25519.sign(icp.raw, privateKey), 0))],
|
|
16
|
+
};
|
|
17
|
+
return KeyEventLog.from([icp]);
|
|
18
|
+
}
|
|
19
|
+
get aid() {
|
|
20
|
+
return this.#kel.state.identifier;
|
|
21
|
+
}
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.#storage = options.storage;
|
|
24
|
+
this.#privateKey = options.privateKey ?? ed25519.utils.randomSecretKey();
|
|
25
|
+
this.#kel = Mailbox.createKEL(this.#privateKey);
|
|
26
|
+
this.#log = new KeriLogger(options.logger);
|
|
27
|
+
const events = [{ message: this.#kel.events[0], timestamp: new Date() }];
|
|
28
|
+
if (options.url) {
|
|
29
|
+
const url = new URL(options.url);
|
|
30
|
+
const scheme = url.protocol.replace(":", "");
|
|
31
|
+
const location = keri.reply({
|
|
32
|
+
r: "/loc/scheme",
|
|
33
|
+
a: { eid: this.aid, scheme, url: options.url },
|
|
34
|
+
});
|
|
35
|
+
const endrole = keri.reply({
|
|
36
|
+
r: "/end/role/add",
|
|
37
|
+
a: { cid: this.aid, role: "mailbox", eid: this.aid },
|
|
38
|
+
});
|
|
39
|
+
location.attachments = {
|
|
40
|
+
NonTransReceiptCouples: [{ prefix: this.aid, sig: this.#sign(location) }],
|
|
41
|
+
};
|
|
42
|
+
endrole.attachments = {
|
|
43
|
+
NonTransReceiptCouples: [{ prefix: this.aid, sig: this.#sign(endrole) }],
|
|
44
|
+
};
|
|
45
|
+
events.push({ message: location, timestamp: new Date() });
|
|
46
|
+
events.push({ message: endrole, timestamp: new Date() });
|
|
47
|
+
}
|
|
48
|
+
this.events = events;
|
|
49
|
+
}
|
|
50
|
+
async *handleMessage(message) {
|
|
51
|
+
const { t, r } = message.body;
|
|
52
|
+
if (t === "exn" && r === "/fwd") {
|
|
53
|
+
this.#log.debug("handling exn /fwd");
|
|
54
|
+
this.#handleForward(message);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (t === "qry" && r === "mbx") {
|
|
58
|
+
this.#log.debug("handling qry mbx");
|
|
59
|
+
yield* this.#handleQuery(message);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.#log.debug("ignoring message", { t, r });
|
|
63
|
+
}
|
|
64
|
+
#handleForward(message) {
|
|
65
|
+
const { q, e } = message.body;
|
|
66
|
+
const pre = q.pre;
|
|
67
|
+
const topic = q.topic;
|
|
68
|
+
if (!pre || !topic) {
|
|
69
|
+
this.#log.warn("ignoring forward: missing q.pre or q.topic");
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const evtBody = e?.evt;
|
|
73
|
+
if (!evtBody) {
|
|
74
|
+
this.#log.warn("ignoring forward: missing e.evt", { pre, topic });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const evtCouple = message.attachments.PathedMaterialCouples.find((c) => c.path === "-e-evt");
|
|
78
|
+
const innerMessage = new Message(evtBody, evtCouple?.attachments);
|
|
79
|
+
this.#log.debug("saving mailbox entry", { pre, topic });
|
|
80
|
+
this.#storage.saveMailboxEntry(pre, topic, innerMessage);
|
|
81
|
+
}
|
|
82
|
+
*#handleQuery(message) {
|
|
83
|
+
const { i, topics } = message.body.q;
|
|
84
|
+
if (!i || !topics) {
|
|
85
|
+
this.#log.warn("ignoring query: missing q.i or q.topics");
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.#log.debug("querying mailbox", { aid: i, topics });
|
|
89
|
+
for (const [topicPath, offset] of Object.entries(topics)) {
|
|
90
|
+
const storageTopic = topicPath.replace(/^\//, "");
|
|
91
|
+
for (const entry of this.#storage.getMailboxEntries(i, storageTopic, offset)) {
|
|
92
|
+
yield { id: entry.id, topic: topicPath, message: entry.message };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
#sign(message) {
|
|
97
|
+
const rawSignature = ed25519.sign(message.raw, this.#privateKey);
|
|
98
|
+
return encodeText(new Matter({ code: Matter.Code.Ed25519_Sig, raw: rawSignature }));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=mailbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailbox.js","sourceRoot":"","sources":["../../src/mailbox/mailbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/mailbox/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC"}
|
package/dist/main.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/nodejs-utils/main.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAwB,MAAM,YAAY,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { RequestListener } from "node:http";
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
import { type Logger } from "#keri/logging";
|
|
3
|
+
export interface ListenerOptions {
|
|
4
|
+
logger?: Logger;
|
|
4
5
|
}
|
|
5
|
-
export declare function createListener(handler: (request: Request) => Promise<Response>,
|
|
6
|
+
export declare function createListener(handler: (request: Request) => Promise<Response>, options?: ListenerOptions): RequestListener;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
|
-
import {
|
|
3
|
-
function toWebRequest(req
|
|
2
|
+
import { KeriLogger } from "#keri/logging";
|
|
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":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAe,MAAM,eAAe,CAAC;AAMxD,SAAS,YAAY,CAAC,GAAoB;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC;IAC5D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC,CAAC;IAE7D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;oBAChC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,IAAI,GAAoB,IAAI,CAAC;IACjC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC;IAC3D,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;QACtB,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO;QACP,IAAI;QACJ,MAAM,EAAE,MAAM;QACd,4GAA4G;KACzE,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAgD,EAChD,UAA2B,EAAE;IAE7B,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;QACnC,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;QAE3B,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACtC,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,UAAU,IAAI,EAAE;gBAC7D,MAAM;gBACN,GAAG;gBACH,MAAM,EAAE,GAAG,CAAC,UAAU;gBACtB,UAAU;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAE/E,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACzC,OAAO,IAAI,EAAE,CAAC;oBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;oBAC5C,IAAI,IAAI;wBAAE,MAAM;oBAChB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrG,GAAG,CAAC,UAAU,GAAG,GAAG,CAAC;YACrB,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Message } from "#keri/cesr";
|
|
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":""}
|
package/dist/storage/main.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type { CredentialStorage } from "./credential-storage.ts";
|
|
2
2
|
export type { KeyEventStorage } from "./key-event-storage.ts";
|
|
3
|
+
export type { MailboxEntry, MailboxServerStorage } from "./mailbox-server-storage.ts";
|
|
3
4
|
export type { MailboxStorage } from "./mailbox-storage.ts";
|
|
4
5
|
export type { PrivateKeyStorage } from "./private-key-storage.ts";
|
|
@@ -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)`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/storage/sqlite/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;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"}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/storage/sqlite/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"}
|
|
@@ -4,9 +4,10 @@ export type { Database, Params, Row, SQLValue } from "./sqlite-database.ts";
|
|
|
4
4
|
import { type CredentialBody, type IssueEvent, type KeyEvent, Message, type RegistryInceptEventBody, type ReplyEventBody, type RevokeEvent } from "#keri/core";
|
|
5
5
|
import type { CredentialStorage } from "../credential-storage.ts";
|
|
6
6
|
import type { KeyEventStorage } from "../key-event-storage.ts";
|
|
7
|
+
import type { MailboxEntry, MailboxServerStorage } from "../mailbox-server-storage.ts";
|
|
7
8
|
import type { MailboxStorage } from "../mailbox-storage.ts";
|
|
8
9
|
import type { PrivateKeyStorage } from "../private-key-storage.ts";
|
|
9
|
-
export declare class SqliteControllerStorage implements KeyEventStorage, PrivateKeyStorage, CredentialStorage, MailboxStorage {
|
|
10
|
+
export declare class SqliteControllerStorage implements KeyEventStorage, PrivateKeyStorage, CredentialStorage, MailboxStorage, MailboxServerStorage {
|
|
10
11
|
#private;
|
|
11
12
|
constructor(db: Database);
|
|
12
13
|
saveKey(publicKey: string, digest: string, encryptedPrivKey: string): void;
|
|
@@ -26,4 +27,6 @@ export declare class SqliteControllerStorage implements KeyEventStorage, Private
|
|
|
26
27
|
getCredentialsByRegistry(registryId: string): CredentialBody[];
|
|
27
28
|
getMailboxOffset(prefix: string, topic: string): number;
|
|
28
29
|
saveMailboxOffset(prefix: string, topic: string, offset: number): void;
|
|
30
|
+
saveMailboxEntry(pre: string, topic: string, message: Message): void;
|
|
31
|
+
getMailboxEntries(pre: string, topic: string, offset: number): Generator<MailboxEntry>;
|
|
29
32
|
}
|
|
@@ -211,5 +211,27 @@ export class SqliteControllerStorage {
|
|
|
211
211
|
this.#db.execute("INSERT INTO mailbox_cursor(prefix, topic, offset) VALUES ($prefix, $topic, $offset) " +
|
|
212
212
|
"ON CONFLICT(prefix, topic) DO UPDATE SET offset = $offset", { prefix, topic, offset });
|
|
213
213
|
}
|
|
214
|
+
saveMailboxEntry(pre, topic, message) {
|
|
215
|
+
this.#db.execute("INSERT INTO mailbox_entry(pre, topic, event_json, attachments) VALUES ($pre, $topic, $event_json, $attachments)", {
|
|
216
|
+
pre,
|
|
217
|
+
topic,
|
|
218
|
+
event_json: JSON.stringify(message.body),
|
|
219
|
+
attachments: encodeText(message.attachments.frames()),
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
*getMailboxEntries(pre, topic, offset) {
|
|
223
|
+
const statement = [
|
|
224
|
+
"SELECT id, event_json, attachments FROM mailbox_entry",
|
|
225
|
+
"WHERE pre = $pre AND topic = $topic AND id > $offset",
|
|
226
|
+
"ORDER BY id ASC",
|
|
227
|
+
].join("\n");
|
|
228
|
+
for (const row of this.#db.iterate(statement, { pre, topic, offset })) {
|
|
229
|
+
const id = row.id;
|
|
230
|
+
if (typeof id !== "number") {
|
|
231
|
+
throw new Error("mailbox_entry.id missing or not a number");
|
|
232
|
+
}
|
|
233
|
+
yield { id, message: parseRow(row) };
|
|
234
|
+
}
|
|
235
|
+
}
|
|
214
236
|
}
|
|
215
237
|
//# sourceMappingURL=storage-sqlite.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-sqlite.js","sourceRoot":"","sources":["../../../src/storage/sqlite/storage-sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,UAAU,EAAoB,MAAM,YAAY,CAAC;AAC1D,OAAO,EACL,WAAW,EAKX,OAAO,GAIR,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"storage-sqlite.js","sourceRoot":"","sources":["../../../src/storage/sqlite/storage-sqlite.ts"],"names":[],"mappings":"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"}
|
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 "#keri/logging";
|
|
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,4 +1,5 @@
|
|
|
1
1
|
import { Attachments, encodeText, parse } from "#keri/cesr";
|
|
2
|
+
import { KeriLogger } from "#keri/logging";
|
|
2
3
|
import { WitnessError } from "./witness.js";
|
|
3
4
|
function createResponse(events) {
|
|
4
5
|
const body = events
|
|
@@ -17,10 +18,12 @@ function createResponse(events) {
|
|
|
17
18
|
headers: { "Content-Type": "application/json+cesr" },
|
|
18
19
|
});
|
|
19
20
|
}
|
|
20
|
-
export function createRouter(witness) {
|
|
21
|
+
export function createRouter(witness, options = {}) {
|
|
22
|
+
const log = new KeriLogger(options.logger);
|
|
21
23
|
async function handleReceiptRequest(request) {
|
|
22
24
|
const atc = request.headers.get("CESR-ATTACHMENT");
|
|
23
25
|
if (!atc) {
|
|
26
|
+
log.warn("rejecting POST /receipts: missing CESR-ATTACHMENT");
|
|
24
27
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
25
28
|
}
|
|
26
29
|
const bodyText = await request.text();
|
|
@@ -32,11 +35,13 @@ export function createRouter(witness) {
|
|
|
32
35
|
}
|
|
33
36
|
catch (err) {
|
|
34
37
|
if (err instanceof WitnessError) {
|
|
38
|
+
log.warn("rejecting POST /receipts", { error: err.message });
|
|
35
39
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
36
40
|
}
|
|
37
41
|
throw err;
|
|
38
42
|
}
|
|
39
43
|
}
|
|
44
|
+
log.debug("POST /receipts: issued receipts", { count: receipts.length });
|
|
40
45
|
return createResponse(receipts);
|
|
41
46
|
}
|
|
42
47
|
async function handleOobiRequest(request) {
|
|
@@ -44,6 +49,7 @@ export function createRouter(witness) {
|
|
|
44
49
|
const aid = url.pathname.split("/")[2];
|
|
45
50
|
let response;
|
|
46
51
|
if (aid === undefined || aid === witness.aid) {
|
|
52
|
+
log.debug("GET /oobi: serving self", { count: witness.events.length });
|
|
47
53
|
response = createResponse(witness.events);
|
|
48
54
|
}
|
|
49
55
|
else {
|
|
@@ -51,7 +57,14 @@ export function createRouter(witness) {
|
|
|
51
57
|
message: event,
|
|
52
58
|
timestamp: event.attachments.FirstSeenReplayCouples[0]?.dt ?? new Date(0),
|
|
53
59
|
}));
|
|
54
|
-
|
|
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
|
+
}
|
|
55
68
|
}
|
|
56
69
|
response.headers.set("Keri-Aid", witness.aid);
|
|
57
70
|
return response;
|
|
@@ -59,12 +72,16 @@ export function createRouter(witness) {
|
|
|
59
72
|
async function handleMessageRequest(request) {
|
|
60
73
|
const atc = request.headers.get("CESR-ATTACHMENT");
|
|
61
74
|
if (!atc) {
|
|
75
|
+
log.warn("rejecting POST /: missing CESR-ATTACHMENT");
|
|
62
76
|
return Response.json({ error: "Bad Request" }, { status: 400 });
|
|
63
77
|
}
|
|
64
78
|
const bodyText = await request.text();
|
|
79
|
+
let count = 0;
|
|
65
80
|
for await (const event of parse(bodyText + atc)) {
|
|
66
81
|
witness.handleMessage(event);
|
|
82
|
+
count++;
|
|
67
83
|
}
|
|
84
|
+
log.debug("POST /: handled messages", { count });
|
|
68
85
|
return new Response(null, { status: 200 });
|
|
69
86
|
}
|
|
70
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,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAgB,YAAY,EAAqB,MAAM,cAAc,CAAC;
|
|
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
1
|
import { Message } from "#keri/cesr";
|
|
2
2
|
import { type KeyEvent, type KeyEventBody, KeyEventLog, type ReceiptEventBody } from "#keri/core";
|
|
3
|
+
import { type Logger } from "#keri/logging";
|
|
3
4
|
import type { KeyEventStorage } from "#keri/storage";
|
|
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
2
|
import { Attachments, encodeText, Indexer, Matter, Message } from "#keri/cesr";
|
|
3
3
|
import { KeyEventLog, keri } from "#keri/core";
|
|
4
|
+
import { KeriLogger } from "#keri/logging";
|
|
4
5
|
export class WitnessError extends Error {
|
|
5
6
|
}
|
|
6
7
|
export class Witness {
|
|
@@ -8,6 +9,7 @@ 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
|
}
|
|
@@ -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,9 +76,16 @@ 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
|
}
|
|
88
|
+
this.#log.debug("issuing receipt", { aid: body.i, s: body.s, d: body.d });
|
|
77
89
|
const sig = this.#sign(message);
|
|
78
90
|
const witnessIndex = kel.state.backers.indexOf(this.aid);
|
|
79
91
|
const receipt = keri.receipt({ d: message.body.d, i: message.body.i, s: message.body.s });
|
|
@@ -92,9 +104,11 @@ export class Witness {
|
|
|
92
104
|
handleMessage(message) {
|
|
93
105
|
const body = message.body;
|
|
94
106
|
if (body.t !== "rct") {
|
|
107
|
+
this.#log.debug("ignoring message: only rct handled", { t: body.t });
|
|
95
108
|
return;
|
|
96
109
|
}
|
|
97
110
|
if (typeof body.i !== "string" || typeof body.d !== "string") {
|
|
111
|
+
this.#log.warn("ignoring receipt: missing i/d");
|
|
98
112
|
return;
|
|
99
113
|
}
|
|
100
114
|
const kel = KeyEventLog.from(this.#storage.getKeyEvents(body.i), {
|
|
@@ -102,10 +116,12 @@ export class Witness {
|
|
|
102
116
|
allowPartiallyWitnessed: true,
|
|
103
117
|
});
|
|
104
118
|
if (!kel.state.backers.includes(this.aid)) {
|
|
119
|
+
this.#log.debug("ignoring receipt: not a backer", { aid: body.i, d: body.d });
|
|
105
120
|
return;
|
|
106
121
|
}
|
|
107
122
|
const storedEvent = kel.events.find((event) => event.body.d === body.d);
|
|
108
123
|
if (!storedEvent) {
|
|
124
|
+
this.#log.debug("ignoring receipt: no matching stored event", { aid: body.i, d: body.d });
|
|
109
125
|
return;
|
|
110
126
|
}
|
|
111
127
|
const existingWigsByIndex = new Map();
|
|
@@ -126,6 +142,7 @@ export class Witness {
|
|
|
126
142
|
WitnessIdxSigs: Array.from(existingWigsByIndex.values()),
|
|
127
143
|
FirstSeenReplayCouples: storedEvent.attachments.FirstSeenReplayCouples,
|
|
128
144
|
});
|
|
145
|
+
this.#log.debug("merged witness sigs", { aid: body.i, d: body.d, count: existingWigsByIndex.size });
|
|
129
146
|
this.#storage.saveMessage(new Message(storedEvent.body, mergedAttachments));
|
|
130
147
|
}
|
|
131
148
|
*getKeyEvents(aid) {
|