keri 0.0.0-dev.0ddd65e → 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.
Files changed (234) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/dist/cesr/__main__.d.ts +9 -0
  4. package/dist/cesr/__main__.js +10 -0
  5. package/dist/cesr/__main__.js.map +1 -0
  6. package/dist/cesr/array-utils.d.ts +3 -0
  7. package/dist/cesr/array-utils.js +29 -0
  8. package/dist/cesr/array-utils.js.map +1 -0
  9. package/dist/cesr/attachments-reader.d.ts +10 -0
  10. package/dist/cesr/attachments-reader.js +281 -0
  11. package/dist/cesr/attachments-reader.js.map +1 -0
  12. package/dist/cesr/attachments.d.ts +66 -0
  13. package/dist/cesr/attachments.js +108 -0
  14. package/dist/cesr/attachments.js.map +1 -0
  15. package/dist/cesr/codes.d.ts +1208 -0
  16. package/dist/cesr/codes.js +309 -0
  17. package/dist/cesr/codes.js.map +1 -0
  18. package/dist/cesr/counter.d.ts +114 -0
  19. package/dist/cesr/counter.js +78 -0
  20. package/dist/cesr/counter.js.map +1 -0
  21. package/dist/cesr/frame.d.ts +31 -0
  22. package/dist/cesr/frame.js +99 -0
  23. package/dist/cesr/frame.js.map +1 -0
  24. package/dist/cesr/genus.d.ts +18 -0
  25. package/dist/cesr/genus.js +57 -0
  26. package/dist/cesr/genus.js.map +1 -0
  27. package/dist/cesr/groups/generic-map.d.ts +11 -0
  28. package/dist/cesr/groups/generic-map.js +51 -0
  29. package/dist/cesr/groups/generic-map.js.map +1 -0
  30. package/dist/cesr/indexer.d.ts +68 -0
  31. package/dist/cesr/indexer.js +171 -0
  32. package/dist/cesr/indexer.js.map +1 -0
  33. package/dist/cesr/matter.d.ts +160 -0
  34. package/dist/cesr/matter.js +301 -0
  35. package/dist/cesr/matter.js.map +1 -0
  36. package/dist/cesr/message.d.ts +17 -0
  37. package/dist/cesr/message.js +81 -0
  38. package/dist/cesr/message.js.map +1 -0
  39. package/dist/cesr/parse.d.ts +37 -0
  40. package/dist/cesr/parse.js +138 -0
  41. package/dist/cesr/parse.js.map +1 -0
  42. package/dist/cesr/shifting.d.ts +7 -0
  43. package/dist/cesr/shifting.js +10 -0
  44. package/dist/cesr/shifting.js.map +1 -0
  45. package/dist/cesr/version-string.d.ts +35 -0
  46. package/dist/cesr/version-string.js +146 -0
  47. package/dist/cesr/version-string.js.map +1 -0
  48. package/dist/cli/cli.d.ts +5 -0
  49. package/dist/cli/cli.js +73 -0
  50. package/dist/cli/cli.js.map +1 -0
  51. package/dist/cli/input.d.ts +1 -0
  52. package/dist/cli/input.js +22 -0
  53. package/dist/cli/input.js.map +1 -0
  54. package/dist/cli/node-cli.js +19 -0
  55. package/dist/cli/node-cli.js.map +1 -0
  56. package/dist/controller/controller.d.ts +97 -0
  57. package/dist/controller/controller.js +601 -0
  58. package/dist/controller/controller.js.map +1 -0
  59. package/dist/controller/encrypt.d.ts +45 -0
  60. package/dist/controller/encrypt.js +120 -0
  61. package/dist/controller/encrypt.js.map +1 -0
  62. package/dist/core/credential-event.d.ts +54 -0
  63. package/dist/core/credential-event.js +28 -0
  64. package/dist/core/credential-event.js.map +1 -0
  65. package/dist/core/credential.d.ts +79 -0
  66. package/dist/core/credential.js +25 -0
  67. package/dist/core/credential.js.map +1 -0
  68. package/dist/core/digest.d.ts +1 -0
  69. package/dist/core/digest.js +7 -0
  70. package/dist/core/digest.js.map +1 -0
  71. package/dist/core/endpoint-discovery.d.ts +20 -0
  72. package/dist/core/endpoint-discovery.js +60 -0
  73. package/dist/core/endpoint-discovery.js.map +1 -0
  74. package/dist/core/events.d.ts +12 -0
  75. package/dist/core/events.js +25 -0
  76. package/dist/core/events.js.map +1 -0
  77. package/dist/core/kawa.d.ts +17 -0
  78. package/dist/core/kawa.js +48 -0
  79. package/dist/core/kawa.js.map +1 -0
  80. package/dist/core/key-event-log.d.ts +19 -0
  81. package/dist/core/key-event-log.js +155 -0
  82. package/dist/core/key-event-log.js.map +1 -0
  83. package/dist/core/key-event.d.ts +94 -0
  84. package/dist/core/key-event.js +88 -0
  85. package/dist/core/key-event.js.map +1 -0
  86. package/dist/core/keys.d.ts +10 -0
  87. package/dist/core/keys.js +17 -0
  88. package/dist/core/keys.js.map +1 -0
  89. package/dist/core/mailbox-client.d.ts +23 -0
  90. package/dist/core/mailbox-client.js +75 -0
  91. package/dist/core/mailbox-client.js.map +1 -0
  92. package/dist/core/main.d.ts +53 -0
  93. package/dist/core/main.js +45 -0
  94. package/dist/core/main.js.map +1 -0
  95. package/dist/core/receipt-event.d.ts +15 -0
  96. package/dist/core/receipt-event.js +13 -0
  97. package/dist/core/receipt-event.js.map +1 -0
  98. package/dist/core/registry-event.d.ts +26 -0
  99. package/dist/core/registry-event.js +18 -0
  100. package/dist/core/registry-event.js.map +1 -0
  101. package/dist/core/routed-event.d.ts +67 -0
  102. package/dist/core/routed-event.js +53 -0
  103. package/dist/core/routed-event.js.map +1 -0
  104. package/dist/core/said.d.ts +4 -0
  105. package/dist/core/said.js +29 -0
  106. package/dist/core/said.js.map +1 -0
  107. package/dist/core/sign.d.ts +5 -0
  108. package/dist/core/sign.js +10 -0
  109. package/dist/core/sign.js.map +1 -0
  110. package/dist/core/threshold.d.ts +6 -0
  111. package/dist/core/threshold.js +58 -0
  112. package/dist/core/threshold.js.map +1 -0
  113. package/dist/core/verify.d.ts +23 -0
  114. package/dist/core/verify.js +62 -0
  115. package/dist/core/verify.js.map +1 -0
  116. package/dist/core/witness-client.d.ts +8 -0
  117. package/dist/core/witness-client.js +39 -0
  118. package/dist/core/witness-client.js.map +1 -0
  119. package/dist/encoding/base64.d.ts +4 -0
  120. package/dist/encoding/base64.js +82 -0
  121. package/dist/encoding/base64.js.map +1 -0
  122. package/dist/encoding/main.d.ts +2 -0
  123. package/dist/encoding/main.js +3 -0
  124. package/dist/encoding/main.js.map +1 -0
  125. package/dist/encoding/utf8.d.ts +2 -0
  126. package/dist/encoding/utf8.js +9 -0
  127. package/dist/encoding/utf8.js.map +1 -0
  128. package/dist/logging/main.d.ts +15 -0
  129. package/dist/logging/main.js +25 -0
  130. package/dist/logging/main.js.map +1 -0
  131. package/dist/mailbox/mailbox-router.d.ts +6 -0
  132. package/dist/mailbox/mailbox-router.js +88 -0
  133. package/dist/mailbox/mailbox-router.js.map +1 -0
  134. package/dist/mailbox/mailbox.d.ts +27 -0
  135. package/dist/mailbox/mailbox.js +101 -0
  136. package/dist/mailbox/mailbox.js.map +1 -0
  137. package/dist/mailbox/main.d.ts +3 -0
  138. package/dist/mailbox/main.js +3 -0
  139. package/dist/mailbox/main.js.map +1 -0
  140. package/dist/main.d.ts +3 -2
  141. package/dist/main.js +3 -2
  142. package/dist/main.js.map +1 -0
  143. package/dist/nodejs-utils/main.d.ts +2 -0
  144. package/dist/nodejs-utils/main.js +2 -0
  145. package/dist/nodejs-utils/main.js.map +1 -0
  146. package/dist/nodejs-utils/serve.d.ts +6 -0
  147. package/dist/nodejs-utils/serve.js +68 -0
  148. package/dist/nodejs-utils/serve.js.map +1 -0
  149. package/dist/storage/credential-storage.d.ts +8 -0
  150. package/dist/storage/credential-storage.js +2 -0
  151. package/dist/storage/credential-storage.js.map +1 -0
  152. package/dist/storage/key-event-storage.d.ts +10 -0
  153. package/dist/storage/key-event-storage.js +2 -0
  154. package/dist/storage/key-event-storage.js.map +1 -0
  155. package/dist/storage/mailbox-server-storage.d.ts +9 -0
  156. package/dist/storage/mailbox-server-storage.js +2 -0
  157. package/dist/storage/mailbox-server-storage.js.map +1 -0
  158. package/dist/storage/mailbox-storage.d.ts +4 -0
  159. package/dist/storage/mailbox-storage.js +2 -0
  160. package/dist/storage/mailbox-storage.js.map +1 -0
  161. package/dist/storage/main.d.ts +5 -0
  162. package/dist/storage/main.js +2 -0
  163. package/dist/storage/main.js.map +1 -0
  164. package/dist/storage/private-key-storage.d.ts +5 -0
  165. package/dist/storage/private-key-storage.js +2 -0
  166. package/dist/storage/private-key-storage.js.map +1 -0
  167. package/dist/storage/sqlite/node-sqlite.d.ts +12 -0
  168. package/dist/storage/sqlite/node-sqlite.js +25 -0
  169. package/dist/storage/sqlite/node-sqlite.js.map +1 -0
  170. package/dist/storage/sqlite/schema.d.ts +2 -0
  171. package/dist/storage/sqlite/schema.js +67 -0
  172. package/dist/storage/sqlite/schema.js.map +1 -0
  173. package/dist/storage/sqlite/sqlite-database.d.ts +13 -0
  174. package/dist/storage/sqlite/sqlite-database.js +2 -0
  175. package/dist/storage/sqlite/sqlite-database.js.map +1 -0
  176. package/dist/storage/sqlite/storage-sqlite.d.ts +32 -0
  177. package/dist/storage/sqlite/storage-sqlite.js +237 -0
  178. package/dist/storage/sqlite/storage-sqlite.js.map +1 -0
  179. package/dist/witness/main.d.ts +3 -0
  180. package/dist/witness/main.js +3 -0
  181. package/dist/witness/main.js.map +1 -0
  182. package/dist/witness/witness-router.d.ts +6 -0
  183. package/dist/witness/witness-router.js +120 -0
  184. package/dist/witness/witness-router.js.map +1 -0
  185. package/dist/witness/witness.d.ts +26 -0
  186. package/dist/witness/witness.js +156 -0
  187. package/dist/witness/witness.js.map +1 -0
  188. package/package.json +84 -26
  189. package/dist/cli/main.js +0 -72
  190. package/dist/data-type.d.ts +0 -9
  191. package/dist/data-type.js +0 -1
  192. package/dist/db/event-store.d.ts +0 -20
  193. package/dist/db/event-store.js +0 -1
  194. package/dist/db/sqlite-db.d.ts +0 -13
  195. package/dist/db/sqlite-db.js +0 -123
  196. package/dist/events/common.d.ts +0 -6
  197. package/dist/events/common.js +0 -1
  198. package/dist/events/incept.d.ts +0 -26
  199. package/dist/events/incept.js +0 -28
  200. package/dist/events/interact.d.ts +0 -17
  201. package/dist/events/interact.js +0 -21
  202. package/dist/events/main.d.ts +0 -4
  203. package/dist/events/main.js +0 -4
  204. package/dist/events/reply.d.ts +0 -15
  205. package/dist/events/reply.js +0 -20
  206. package/dist/keri/habitat.d.ts +0 -20
  207. package/dist/keri/habitat.js +0 -130
  208. package/dist/keri/keri.d.ts +0 -26
  209. package/dist/keri/keri.js +0 -43
  210. package/dist/keystore/encrypt.d.ts +0 -2
  211. package/dist/keystore/encrypt.js +0 -38
  212. package/dist/keystore/keystore-fs.d.ts +0 -13
  213. package/dist/keystore/keystore-fs.js +0 -50
  214. package/dist/keystore/keystore-web.d.ts +0 -12
  215. package/dist/keystore/keystore-web.js +0 -48
  216. package/dist/keystore/keystore.d.ts +0 -15
  217. package/dist/keystore/keystore.js +0 -1
  218. package/dist/main-common.d.ts +0 -9
  219. package/dist/main-common.js +0 -8
  220. package/dist/main-web.d.ts +0 -2
  221. package/dist/main-web.js +0 -2
  222. package/dist/parser/base64.d.ts +0 -6
  223. package/dist/parser/base64.js +0 -74
  224. package/dist/parser/buffered-reader.d.ts +0 -5
  225. package/dist/parser/buffered-reader.js +0 -47
  226. package/dist/parser/cesr-encoding.d.ts +0 -34
  227. package/dist/parser/cesr-encoding.js +0 -158
  228. package/dist/parser/codes.d.ts +0 -143
  229. package/dist/parser/codes.js +0 -266
  230. package/dist/parser/parser.d.ts +0 -16
  231. package/dist/parser/parser.js +0 -161
  232. package/dist/parser/version.d.ts +0 -11
  233. package/dist/parser/version.js +0 -56
  234. /package/dist/cli/{main.d.ts → node-cli.d.ts} +0 -0
@@ -0,0 +1,32 @@
1
+ import type { Database } from "./sqlite-database.ts";
2
+ export { NodeSqliteDatabase } from "./node-sqlite.ts";
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 "#keri/core";
5
+ import type { CredentialStorage } from "../credential-storage.ts";
6
+ import type { KeyEventStorage } from "../key-event-storage.ts";
7
+ import type { MailboxEntry, MailboxServerStorage } from "../mailbox-server-storage.ts";
8
+ import type { MailboxStorage } from "../mailbox-storage.ts";
9
+ import type { PrivateKeyStorage } from "../private-key-storage.ts";
10
+ export declare class SqliteControllerStorage implements KeyEventStorage, PrivateKeyStorage, CredentialStorage, MailboxStorage, MailboxServerStorage {
11
+ #private;
12
+ constructor(db: Database);
13
+ saveKey(publicKey: string, digest: string, encryptedPrivKey: string): void;
14
+ getEncryptedPrivateKey(publicKey: string): string;
15
+ getPublicKeyByDigest(digest: string): string;
16
+ saveMessage(message: Message): void;
17
+ getReplies(filter?: {
18
+ route?: string;
19
+ eid?: string;
20
+ cid?: string;
21
+ }): Generator<Message<ReplyEventBody>>;
22
+ getKeyEvents(prefix: string): Generator<KeyEvent>;
23
+ getCredentialEvents(id: string): Generator<Message<IssueEvent | RevokeEvent>>;
24
+ getRegistry(id: string): Message<RegistryInceptEventBody> | null;
25
+ getRegistriesByOwner(owner: string): Generator<Message<RegistryInceptEventBody>>;
26
+ getCredential(id: string): CredentialBody | null;
27
+ getCredentialsByRegistry(registryId: string): CredentialBody[];
28
+ getMailboxOffset(prefix: string, topic: string): number;
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>;
32
+ }
@@ -0,0 +1,237 @@
1
+ import { migrate } from "./schema.js";
2
+ export { NodeSqliteDatabase } from "./node-sqlite.js";
3
+ import { encodeText } from "#keri/cesr";
4
+ import { Attachments, Message, } from "#keri/core";
5
+ function parseRow(result) {
6
+ if (!("event_json" in result) || typeof result.event_json !== "string") {
7
+ throw new Error("Row does not contain event_json");
8
+ }
9
+ if (!("attachments" in result) || typeof result.attachments !== "string") {
10
+ throw new Error("Row does not contain attachments");
11
+ }
12
+ const body = JSON.parse(result.event_json);
13
+ const atc = Attachments.parse(new TextEncoder().encode(result.attachments)) ?? new Attachments();
14
+ return new Message(body, atc);
15
+ }
16
+ function prepareRow(message) {
17
+ if (message.version.protocol === "ACDC") {
18
+ const body = message.body;
19
+ return {
20
+ event_id: body.d,
21
+ protocol: message.version.protocol,
22
+ type: "credential",
23
+ sn: null,
24
+ event_json: JSON.stringify(body),
25
+ attachments: encodeText(message.attachments.frames()),
26
+ };
27
+ }
28
+ switch (message.body.t) {
29
+ case "icp":
30
+ case "rot":
31
+ case "ixn": {
32
+ const body = message.body;
33
+ return {
34
+ event_id: body.d,
35
+ protocol: message.version.protocol,
36
+ type: body.t,
37
+ sn: parseInt(body.s, 16),
38
+ event_json: JSON.stringify(body),
39
+ attachments: encodeText(message.attachments.frames()),
40
+ };
41
+ }
42
+ case "vcp": {
43
+ const body = message.body;
44
+ return {
45
+ event_id: body.d,
46
+ protocol: message.version.protocol,
47
+ type: body.t,
48
+ sn: null,
49
+ event_json: JSON.stringify(body),
50
+ attachments: encodeText(message.attachments.frames()),
51
+ };
52
+ }
53
+ case "iss":
54
+ case "rev": {
55
+ const body = message.body;
56
+ return {
57
+ event_id: body.d,
58
+ protocol: message.version.protocol,
59
+ type: body.t,
60
+ sn: null,
61
+ event_json: JSON.stringify(body),
62
+ attachments: encodeText(message.attachments.frames()),
63
+ };
64
+ }
65
+ default: {
66
+ const body = message.body;
67
+ return {
68
+ event_id: typeof body.d === "string" ? body.d : null,
69
+ protocol: message.version.protocol,
70
+ type: typeof body.t === "string" ? body.t : null,
71
+ sn: null,
72
+ event_json: JSON.stringify(body),
73
+ attachments: encodeText(message.attachments.frames()),
74
+ };
75
+ }
76
+ }
77
+ }
78
+ export class SqliteControllerStorage {
79
+ #db;
80
+ constructor(db) {
81
+ migrate(db);
82
+ this.#db = db;
83
+ }
84
+ #queryOne(sql, params) {
85
+ const result = Array.from(this.#db.iterate(sql, params))[0];
86
+ return result ? result : undefined;
87
+ }
88
+ saveKey(publicKey, digest, encryptedPrivKey) {
89
+ const statement = [
90
+ "INSERT INTO key_info(public_key, public_key_digest, encrypted_private_key)",
91
+ "VALUES ($public_key, $digest, $encrypted_private_key)",
92
+ "ON CONFLICT (public_key) DO NOTHING",
93
+ ].join("\n");
94
+ this.#db.execute(statement, {
95
+ public_key: publicKey,
96
+ digest,
97
+ encrypted_private_key: encryptedPrivKey,
98
+ });
99
+ }
100
+ getEncryptedPrivateKey(publicKey) {
101
+ const statement = ["SELECT encrypted_private_key FROM key_info", "WHERE public_key = $public_key", "LIMIT 1"].join("\n");
102
+ const result = this.#queryOne(statement, { public_key: publicKey });
103
+ if (!result || typeof result.encrypted_private_key !== "string") {
104
+ throw new Error(`Key not found for public key: ${publicKey}`);
105
+ }
106
+ return result.encrypted_private_key;
107
+ }
108
+ getPublicKeyByDigest(digest) {
109
+ const statement = ["SELECT public_key FROM key_info", "WHERE public_key_digest = $digest", "LIMIT 1"].join("\n");
110
+ const result = this.#queryOne(statement, { digest });
111
+ if (!result || typeof result.public_key !== "string") {
112
+ throw new Error(`Key not found for digest: ${digest}`);
113
+ }
114
+ return result.public_key;
115
+ }
116
+ saveMessage(message) {
117
+ // TODO: Should we use a flag to indicate "upsert" or "insert" ?
118
+ const statement = [
119
+ "INSERT INTO event(event_id, protocol, type, sn, event_json, attachments)",
120
+ "VALUES ($event_id, $protocol, $type, $sn, $event_json, $attachments)",
121
+ "ON CONFLICT(event_id) DO UPDATE SET attachments = excluded.attachments",
122
+ ].join("\n");
123
+ this.#db.execute(statement, prepareRow(message));
124
+ }
125
+ *getReplies(filter = {}) {
126
+ const conditions = ["type = 'rpy'"];
127
+ const params = {};
128
+ if (filter.eid !== undefined) {
129
+ conditions.push("json_extract(event_json, '$.a.eid') = $eid");
130
+ params.eid = filter.eid;
131
+ }
132
+ if (filter.route !== undefined) {
133
+ conditions.push("json_extract(event_json, '$.r') = $route");
134
+ params.route = filter.route;
135
+ }
136
+ if (filter.cid !== undefined) {
137
+ conditions.push("json_extract(event_json, '$.a.cid') = $cid");
138
+ params.cid = filter.cid;
139
+ }
140
+ const statement = [
141
+ "SELECT event_json, attachments FROM event",
142
+ `WHERE ${conditions.join(" AND ")}`,
143
+ "ORDER BY sn ASC",
144
+ ].join("\n");
145
+ for (const result of this.#db.iterate(statement, params)) {
146
+ yield parseRow(result);
147
+ }
148
+ }
149
+ *getKeyEvents(prefix) {
150
+ const statement = [
151
+ "SELECT event_json, attachments",
152
+ "FROM event",
153
+ "WHERE json_extract(event_json, '$.i') = $prefix",
154
+ "AND type in ('icp', 'rot', 'ixn')",
155
+ "ORDER BY sn ASC",
156
+ ].join("\n");
157
+ for (const result of this.#db.iterate(statement, { prefix })) {
158
+ yield parseRow(result);
159
+ }
160
+ }
161
+ *getCredentialEvents(id) {
162
+ const statement = [
163
+ "SELECT event_json, attachments",
164
+ "FROM event",
165
+ "WHERE type IN ('iss', 'rev') AND json_extract(event_json, '$.i') = $id",
166
+ "ORDER BY rowid ASC",
167
+ ].join("\n");
168
+ for (const row of this.#db.iterate(statement, { id })) {
169
+ yield parseRow(row);
170
+ }
171
+ }
172
+ getRegistry(id) {
173
+ const statement = [
174
+ "SELECT event_json, attachments",
175
+ "FROM event",
176
+ "WHERE type = 'vcp' AND json_extract(event_json, '$.i') = $id",
177
+ "LIMIT 1",
178
+ ].join("\n");
179
+ const result = this.#queryOne(statement, { id });
180
+ return result ? parseRow(result) : null;
181
+ }
182
+ *getRegistriesByOwner(owner) {
183
+ const statement = [
184
+ "SELECT event_json, attachments",
185
+ "FROM event",
186
+ "WHERE type = 'vcp' AND json_extract(event_json, '$.ii') = $owner",
187
+ "ORDER BY rowid ASC",
188
+ ].join("\n");
189
+ for (const row of this.#db.iterate(statement, { owner })) {
190
+ yield parseRow(row);
191
+ }
192
+ }
193
+ getCredential(id) {
194
+ const statement = ["SELECT event_json, attachments", "FROM event", "WHERE event_id = $id", "LIMIT 1"].join("\n");
195
+ const result = this.#queryOne(statement, { id });
196
+ return result ? parseRow(result).body : null;
197
+ }
198
+ getCredentialsByRegistry(registryId) {
199
+ const statement = [
200
+ "SELECT event_json, attachments",
201
+ "FROM event",
202
+ "WHERE json_extract(event_json, '$.ri') = $registry_id",
203
+ ].join("\n");
204
+ return Array.from(this.#db.iterate(statement, { registry_id: registryId })).map((row) => parseRow(row).body);
205
+ }
206
+ getMailboxOffset(prefix, topic) {
207
+ const result = this.#queryOne("SELECT offset FROM mailbox_cursor WHERE prefix = $prefix AND topic = $topic LIMIT 1", { prefix, topic });
208
+ return typeof result?.offset === "number" ? result.offset : 0;
209
+ }
210
+ saveMailboxOffset(prefix, topic, offset) {
211
+ this.#db.execute("INSERT INTO mailbox_cursor(prefix, topic, offset) VALUES ($prefix, $topic, $offset) " +
212
+ "ON CONFLICT(prefix, topic) DO UPDATE SET offset = $offset", { prefix, topic, offset });
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
+ }
236
+ }
237
+ //# sourceMappingURL=storage-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-sqlite.js","sourceRoot":"","sources":["../../../src/storage/sqlite/storage-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type { Logger } from "#keri/logging";
2
+ export { Witness, WitnessError, type WitnessEvent, type WitnessOptions } from "./witness.ts";
3
+ export { createRouter, type RouterOptions } from "./witness-router.ts";
@@ -0,0 +1,3 @@
1
+ export { Witness, WitnessError } from "./witness.js";
2
+ export { createRouter } from "./witness-router.js";
3
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,6 @@
1
+ import { type Logger } from "#keri/logging";
2
+ import { type Witness } from "./witness.ts";
3
+ export interface RouterOptions {
4
+ logger?: Logger;
5
+ }
6
+ export declare function createRouter(witness: Witness, options?: RouterOptions): (request: Request) => Promise<Response>;
@@ -0,0 +1,120 @@
1
+ import { Attachments, encodeText, parse } from "#keri/cesr";
2
+ import { KeriLogger } from "#keri/logging";
3
+ import { WitnessError } from "./witness.js";
4
+ function createResponse(events) {
5
+ const body = events
6
+ .flatMap(({ message, timestamp }) => {
7
+ const atc = new Attachments({
8
+ ControllerIdxSigs: message.attachments.ControllerIdxSigs,
9
+ WitnessIdxSigs: message.attachments.WitnessIdxSigs,
10
+ NonTransReceiptCouples: message.attachments.NonTransReceiptCouples,
11
+ FirstSeenReplayCouples: [{ fnu: String(message.body.s ?? "0"), dt: timestamp }],
12
+ });
13
+ return [new TextDecoder().decode(message.raw), encodeText(atc.frames())];
14
+ })
15
+ .join("");
16
+ return new Response(body, {
17
+ status: 200,
18
+ headers: { "Content-Type": "application/json+cesr" },
19
+ });
20
+ }
21
+ export function createRouter(witness, options = {}) {
22
+ const log = new KeriLogger(options.logger);
23
+ async function handleReceiptRequest(request) {
24
+ const atc = request.headers.get("CESR-ATTACHMENT");
25
+ if (!atc) {
26
+ log.warn("rejecting POST /receipts: missing CESR-ATTACHMENT");
27
+ return Response.json({ error: "Bad Request" }, { status: 400 });
28
+ }
29
+ const bodyText = await request.text();
30
+ const receipts = [];
31
+ for await (const witnessEvent of parse(bodyText + atc)) {
32
+ try {
33
+ const receipt = witness.receipt(witnessEvent);
34
+ receipts.push({ message: receipt, timestamp: new Date() });
35
+ }
36
+ catch (err) {
37
+ if (err instanceof WitnessError) {
38
+ log.warn("rejecting POST /receipts", { error: err.message });
39
+ return Response.json({ error: "Bad Request" }, { status: 400 });
40
+ }
41
+ throw err;
42
+ }
43
+ }
44
+ log.debug("POST /receipts: issued receipts", { count: receipts.length });
45
+ return createResponse(receipts);
46
+ }
47
+ async function handleOobiRequest(request) {
48
+ const url = new URL(request.url);
49
+ const aid = url.pathname.split("/")[2];
50
+ let response;
51
+ if (aid === undefined || aid === witness.aid) {
52
+ log.debug("GET /oobi: serving self", { count: witness.events.length });
53
+ response = createResponse(witness.events);
54
+ }
55
+ else {
56
+ const events = Array.from(witness.getKeyEvents(aid)).map((event) => ({
57
+ message: event,
58
+ timestamp: event.attachments.FirstSeenReplayCouples[0]?.dt ?? new Date(0),
59
+ }));
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
+ }
68
+ }
69
+ response.headers.set("Keri-Aid", witness.aid);
70
+ return response;
71
+ }
72
+ async function handleMessageRequest(request) {
73
+ const atc = request.headers.get("CESR-ATTACHMENT");
74
+ if (!atc) {
75
+ log.warn("rejecting POST /: missing CESR-ATTACHMENT");
76
+ return Response.json({ error: "Bad Request" }, { status: 400 });
77
+ }
78
+ const bodyText = await request.text();
79
+ let count = 0;
80
+ for await (const event of parse(bodyText + atc)) {
81
+ witness.handleMessage(event);
82
+ count++;
83
+ }
84
+ log.debug("POST /: handled messages", { count });
85
+ return new Response(null, { status: 200 });
86
+ }
87
+ return async function handler(request) {
88
+ const { method } = request;
89
+ const pathname = new URL(request.url).pathname;
90
+ if (pathname === "/") {
91
+ switch (method) {
92
+ case "GET":
93
+ return Response.json({ status: "OK" });
94
+ case "POST": {
95
+ return handleMessageRequest(request);
96
+ }
97
+ default:
98
+ return new Response("Method Not Allowed", { status: 405 });
99
+ }
100
+ }
101
+ if (pathname.startsWith("/oobi")) {
102
+ switch (method) {
103
+ case "GET":
104
+ return handleOobiRequest(request);
105
+ default:
106
+ return new Response("Method Not Allowed", { status: 405 });
107
+ }
108
+ }
109
+ if (pathname === "/receipts") {
110
+ switch (method) {
111
+ case "POST":
112
+ return handleReceiptRequest(request);
113
+ default:
114
+ return new Response("Method Not Allowed", { status: 405 });
115
+ }
116
+ }
117
+ return new Response("Not Found", { status: 404 });
118
+ };
119
+ }
120
+ //# sourceMappingURL=witness-router.js.map
@@ -0,0 +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,EAAE,UAAU,EAAe,MAAM,eAAe,CAAC;AACxD,OAAO,EAAgB,YAAY,EAAqB,MAAM,cAAc,CAAC;AAM7E,SAAS,cAAc,CAAC,MAA+B;IACrD,MAAM,IAAI,GAAG,MAAM;SAChB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC;YAC1B,iBAAiB,EAAE,OAAO,CAAC,WAAW,CAAC,iBAAiB;YACxD,cAAc,EAAE,OAAO,CAAC,WAAW,CAAC,cAAc;YAClD,sBAAsB,EAAE,OAAO,CAAC,WAAW,CAAC,sBAAsB;YAClE,sBAAsB,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAE,OAAO,CAAC,IAAqB,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;SAClG,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,EAAE,cAAc,EAAE,uBAAuB,EAAE;KACrD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB,EAAE,UAAyB,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3C,KAAK,UAAU,oBAAoB,CAAC,OAAgB;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAC9D,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAmB,EAAE,CAAC;QAEpC,IAAI,KAAK,EAAE,MAAM,YAAY,IAAI,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,YAAwB,CAAC,CAAC;gBAC1D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,YAAY,EAAE,CAAC;oBAChC,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAC7D,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;gBAClE,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACzE,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,OAAgB;QAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,QAAkB,CAAC;QACvB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;YAC7C,GAAG,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnE,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,KAAK,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;aAC1E,CAAC,CAAC,CAAC;YACJ,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,sBAAsB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3C,QAAQ,GAAG,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBACtE,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;QACD,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,UAAU,oBAAoB,CAAC,OAAgB;QAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACnD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;YACtD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7B,KAAK,EAAE,CAAC;QACV,CAAC;QAED,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACjD,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,KAAK,UAAU,OAAO,CAAC,OAAgB;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QAE/C,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;YACrB,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,KAAK;oBACR,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBACzC,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBACvC,CAAC;gBACD;oBACE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,KAAK;oBACR,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACpC;oBACE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,QAAQ,MAAM,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBACvC;oBACE,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Message } from "#keri/cesr";
2
+ import { type KeyEvent, type KeyEventBody, KeyEventLog, type ReceiptEventBody } from "#keri/core";
3
+ import { type Logger } from "#keri/logging";
4
+ import type { KeyEventStorage } from "#keri/storage";
5
+ export interface WitnessOptions {
6
+ privateKey?: Uint8Array;
7
+ url?: string;
8
+ storage: KeyEventStorage;
9
+ logger?: Logger;
10
+ }
11
+ export interface WitnessEvent {
12
+ readonly message: Message;
13
+ readonly timestamp: Date;
14
+ }
15
+ export declare class WitnessError extends Error {
16
+ }
17
+ export declare class Witness {
18
+ #private;
19
+ readonly events: readonly WitnessEvent[];
20
+ get aid(): string;
21
+ static createKEL(privateKey: Uint8Array): KeyEventLog;
22
+ constructor(options: WitnessOptions);
23
+ receipt(message: Message<KeyEventBody>): Message<ReceiptEventBody>;
24
+ handleMessage(message: Message): void;
25
+ getKeyEvents(aid: string): Generator<KeyEvent>;
26
+ }
@@ -0,0 +1,156 @@
1
+ import { ed25519 } from "@noble/curves/ed25519.js";
2
+ import { Attachments, encodeText, Indexer, Matter, Message } from "#keri/cesr";
3
+ import { KeyEventLog, keri } from "#keri/core";
4
+ import { KeriLogger } from "#keri/logging";
5
+ export class WitnessError extends Error {
6
+ }
7
+ export class Witness {
8
+ events;
9
+ #storage;
10
+ #privateKey;
11
+ #kel;
12
+ #log;
13
+ get aid() {
14
+ return this.#kel.state.identifier;
15
+ }
16
+ static createKEL(privateKey) {
17
+ const publicKey = encodeText(new Matter({ code: Matter.Code.Ed25519N, raw: ed25519.getPublicKey(privateKey) }));
18
+ const icp = keri.incept({
19
+ signingKeys: [publicKey],
20
+ nextKeys: [],
21
+ });
22
+ icp.attachments = {
23
+ ControllerIdxSigs: [encodeText(Indexer.crypto.ed25519_sig(ed25519.sign(icp.raw, privateKey), 0))],
24
+ };
25
+ return KeyEventLog.from([icp]);
26
+ }
27
+ constructor(options) {
28
+ this.#storage = options.storage;
29
+ this.#privateKey = options.privateKey ?? ed25519.utils.randomSecretKey();
30
+ this.#kel = Witness.createKEL(this.#privateKey);
31
+ this.#log = new KeriLogger(options.logger);
32
+ const events = [{ message: this.#kel.events[0], timestamp: new Date() }];
33
+ if (options.url) {
34
+ const url = new URL(options.url);
35
+ const scheme = url.protocol.replace(":", "");
36
+ const location = keri.reply({
37
+ r: "/loc/scheme",
38
+ a: {
39
+ eid: this.aid,
40
+ scheme: scheme,
41
+ url: options.url,
42
+ },
43
+ });
44
+ const endrole = keri.reply({
45
+ r: "/end/role/add",
46
+ a: {
47
+ cid: this.aid,
48
+ role: "controller",
49
+ eid: this.aid,
50
+ },
51
+ });
52
+ location.attachments = {
53
+ NonTransReceiptCouples: [{ prefix: this.#kel.state.identifier, sig: this.#sign(location) }],
54
+ };
55
+ endrole.attachments = {
56
+ NonTransReceiptCouples: [{ prefix: this.#kel.state.identifier, sig: this.#sign(endrole) }],
57
+ };
58
+ events.push({ message: location, timestamp: new Date() });
59
+ events.push({ message: endrole, timestamp: new Date() });
60
+ }
61
+ this.events = events;
62
+ }
63
+ receipt(message) {
64
+ const body = message.body;
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");
67
+ throw new WitnessError("Missing required fields i, d, s");
68
+ }
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 });
71
+ throw new WitnessError("Missing controller signatures");
72
+ }
73
+ let kel = KeyEventLog.from(this.#storage.getKeyEvents(body.i));
74
+ try {
75
+ kel = kel.append(message, { allowPartiallyWitnessed: true });
76
+ }
77
+ catch (error) {
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
+ });
85
+ throw new WitnessError(`Failed to append message to KEL: ${error.message}`);
86
+ }
87
+ }
88
+ this.#log.debug("issuing receipt", { aid: body.i, s: body.s, d: body.d });
89
+ const sig = this.#sign(message);
90
+ const witnessIndex = kel.state.backers.indexOf(this.aid);
91
+ const receipt = keri.receipt({ d: message.body.d, i: message.body.i, s: message.body.s });
92
+ receipt.attachments = {
93
+ NonTransReceiptCouples: [{ prefix: this.#kel.state.identifier, sig }],
94
+ };
95
+ const WitnessIdxSigs = witnessIndex >= 0 ? [encodeText(Indexer.convert(Matter.parse(sig), witnessIndex))] : [];
96
+ const storedMessage = new Message(message.body, {
97
+ ControllerIdxSigs: message.attachments.ControllerIdxSigs,
98
+ WitnessIdxSigs,
99
+ FirstSeenReplayCouples: [{ fnu: body.s, dt: new Date() }],
100
+ });
101
+ this.#storage.saveMessage(storedMessage);
102
+ return receipt;
103
+ }
104
+ handleMessage(message) {
105
+ const body = message.body;
106
+ if (body.t !== "rct") {
107
+ this.#log.debug("ignoring message: only rct handled", { t: body.t });
108
+ return;
109
+ }
110
+ if (typeof body.i !== "string" || typeof body.d !== "string") {
111
+ this.#log.warn("ignoring receipt: missing i/d");
112
+ return;
113
+ }
114
+ const kel = KeyEventLog.from(this.#storage.getKeyEvents(body.i), {
115
+ // TODO: This should only be for the event that is this receit
116
+ allowPartiallyWitnessed: true,
117
+ });
118
+ if (!kel.state.backers.includes(this.aid)) {
119
+ this.#log.debug("ignoring receipt: not a backer", { aid: body.i, d: body.d });
120
+ return;
121
+ }
122
+ const storedEvent = kel.events.find((event) => event.body.d === body.d);
123
+ if (!storedEvent) {
124
+ this.#log.debug("ignoring receipt: no matching stored event", { aid: body.i, d: body.d });
125
+ return;
126
+ }
127
+ const existingWigsByIndex = new Map();
128
+ for (const sig of storedEvent.attachments.WitnessIdxSigs) {
129
+ const indexer = Indexer.parse(sig);
130
+ existingWigsByIndex.set(indexer.index, sig);
131
+ }
132
+ for (const couple of message.attachments.NonTransReceiptCouples) {
133
+ const witnessIndex = kel.state.backers.indexOf(couple.prefix);
134
+ if (witnessIndex === -1) {
135
+ continue;
136
+ }
137
+ const wigSig = encodeText(Indexer.convert(Matter.parse(couple.sig), witnessIndex));
138
+ existingWigsByIndex.set(witnessIndex, wigSig);
139
+ }
140
+ const mergedAttachments = new Attachments({
141
+ ControllerIdxSigs: storedEvent.attachments.ControllerIdxSigs,
142
+ WitnessIdxSigs: Array.from(existingWigsByIndex.values()),
143
+ FirstSeenReplayCouples: storedEvent.attachments.FirstSeenReplayCouples,
144
+ });
145
+ this.#log.debug("merged witness sigs", { aid: body.i, d: body.d, count: existingWigsByIndex.size });
146
+ this.#storage.saveMessage(new Message(storedEvent.body, mergedAttachments));
147
+ }
148
+ *getKeyEvents(aid) {
149
+ yield* this.#storage.getKeyEvents(aid);
150
+ }
151
+ #sign(message) {
152
+ const rawSignature = ed25519.sign(message.raw, this.#privateKey);
153
+ return encodeText(new Matter({ code: Matter.Code.Ed25519_Sig, raw: rawSignature }));
154
+ }
155
+ }
156
+ //# sourceMappingURL=witness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"witness.js","sourceRoot":"","sources":["../../src/witness/witness.ts"],"names":[],"mappings":"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"}