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,601 @@
1
+ import { encodeText, Indexer, Matter, parse } from "#keri/cesr";
2
+ import { Attachments, KeyEventLog, keri, MailboxClient, Message, resolveEndRole, resolveLocation, sign, submitToWitnesses, } from "#keri/core";
3
+ import { decodeBase64Url, encodeBase64Url } from "#keri/encoding";
4
+ import { KeriLogger } from "#keri/logging";
5
+ import { PassphraseEncrypter } from "./encrypt.js";
6
+ export class Controller {
7
+ #storage;
8
+ #encrypter;
9
+ #fetch;
10
+ #log;
11
+ constructor(deps) {
12
+ this.#storage = deps.storage;
13
+ this.#encrypter = deps.encrypter ?? new PassphraseEncrypter(deps.passphrase ?? "default-passphrase");
14
+ this.#fetch = deps.fetch ?? globalThis.fetch;
15
+ this.#log = new KeriLogger(deps.logger);
16
+ }
17
+ async generateKey() {
18
+ const key = keri.utils.generateKeyPair();
19
+ if (!key.privateKey || !key.publicKey || !key.publicKeyDigest) {
20
+ throw new Error("Failed to generate key pair");
21
+ }
22
+ const encrypted = await this.#encrypter.encrypt(key.privateKey);
23
+ this.#storage.saveKey(key.publicKey, key.publicKeyDigest, encodeBase64Url(encrypted));
24
+ return key.publicKey;
25
+ }
26
+ async signWithKey(publicKey, raw) {
27
+ const encoded = this.#storage.getEncryptedPrivateKey(publicKey);
28
+ const encrypted = decodeBase64Url(encoded);
29
+ const privateKey = await this.#encrypter.decrypt(encrypted);
30
+ return sign(raw, { key: privateKey });
31
+ }
32
+ async introduce(oobi) {
33
+ this.#log.debug("introduce: fetching oobi", { oobi });
34
+ const response = await this.#fetch(oobi);
35
+ if (!response.ok) {
36
+ this.#log.warn("introduce: oobi fetch failed", { oobi, status: response.status });
37
+ throw new Error(`Failed to fetch oobi: ${response.status} ${response.statusText}`);
38
+ }
39
+ if (!response.body) {
40
+ this.#log.warn("introduce: empty response body", { oobi });
41
+ throw new Error(`No body in response`);
42
+ }
43
+ let log = KeyEventLog.empty();
44
+ let messages = 0;
45
+ for await (const message of parse(response.body)) {
46
+ switch (message.body.t) {
47
+ case "dip":
48
+ case "icp":
49
+ case "rot":
50
+ case "ixn": {
51
+ log = log.append(message);
52
+ await this.processMessage(message);
53
+ messages++;
54
+ break;
55
+ }
56
+ case "rpy": {
57
+ await this.processMessage(new Message(message.body));
58
+ messages++;
59
+ break;
60
+ }
61
+ }
62
+ }
63
+ this.#log.debug("introduce: complete", { aid: log.state.identifier, messages });
64
+ return log.state;
65
+ }
66
+ async loadEventLog(id) {
67
+ const log = KeyEventLog.from(this.#storage.getKeyEvents(id));
68
+ if (log.events.length === 0) {
69
+ throw new Error(`State for id ${id} not found`);
70
+ }
71
+ return log;
72
+ }
73
+ resolveEndpoint(aid, role = "controller") {
74
+ const endRole = resolveEndRole(this.#storage.getReplies({ cid: aid, route: "/end/role/add" }), aid, role);
75
+ if (!endRole) {
76
+ throw new Error(`Could not find end role '${role}' for aid '${aid}'`);
77
+ }
78
+ const location = resolveLocation(this.#storage.getReplies({ eid: endRole.eid, route: "/loc/scheme" }), endRole.eid);
79
+ if (!location) {
80
+ throw new Error(`No valid location found for aid ${aid}`);
81
+ }
82
+ return {
83
+ aid,
84
+ url: location.url,
85
+ scheme: location.scheme,
86
+ role: endRole.role,
87
+ };
88
+ }
89
+ async sign(raw, keys) {
90
+ return Promise.all(keys.map(async (key, idx) => {
91
+ const sig = await this.signWithKey(key, raw);
92
+ return encodeText(Indexer.convert(Matter.parse(sig), idx));
93
+ }));
94
+ }
95
+ async incept(args = {}) {
96
+ const publicKey = await this.generateKey();
97
+ const nextPublicKey = await this.generateKey();
98
+ const nextPublicKeyDigest = keri.utils.digest(nextPublicKey);
99
+ const event = keri.incept({
100
+ signingKeys: [publicKey],
101
+ nextKeys: [nextPublicKeyDigest],
102
+ wits: args.wits ?? [],
103
+ toad: args.toad,
104
+ });
105
+ const body = event.body;
106
+ this.#log.debug("incept: created", { aid: body.i, wits: body.b?.length ?? 0 });
107
+ await this.commit(KeyEventLog.empty(), event);
108
+ return {
109
+ id: body.i,
110
+ event: body,
111
+ };
112
+ }
113
+ async processMessage(message) {
114
+ if (message.version.protocol === "ACDC") {
115
+ // TODO: verify ACDC credential SAID and anchors in TEL or KEL
116
+ this.#log.debug("processMessage: saving ACDC", { d: message.body.d });
117
+ this.#storage.saveMessage(message);
118
+ return;
119
+ }
120
+ switch (message.body.t) {
121
+ case "icp":
122
+ case "rot":
123
+ case "ixn": {
124
+ const body = message.body;
125
+ const log = KeyEventLog.from(this.#storage.getKeyEvents(body.i));
126
+ // TODO: Detect duplicituous key events
127
+ if (!log.events.find((event) => event.body.d === message.body.d)) {
128
+ log.append(message); // throws if verification fails
129
+ this.#storage.saveMessage(message);
130
+ this.#log.debug("processMessage: appended key event", { t: body.t, aid: body.i, s: body.s, d: body.d });
131
+ }
132
+ else {
133
+ this.#log.debug("processMessage: duplicate key event ignored", { t: body.t, aid: body.i, d: body.d });
134
+ }
135
+ break;
136
+ }
137
+ case "vcp":
138
+ case "iss":
139
+ case "rev":
140
+ // TODO: verify is anchored to a valid ixn in the issuer's KEL
141
+ this.#log.debug("processMessage: saving registry event", { t: message.body.t, d: message.body.d });
142
+ this.#storage.saveMessage(message);
143
+ break;
144
+ case "rpy":
145
+ // TODO: Verify that is signed by the controller
146
+ this.#log.debug("processMessage: saving reply", { d: message.body.d });
147
+ this.#storage.saveMessage(message);
148
+ break;
149
+ default:
150
+ // TODO: Handle other message types
151
+ this.#log.debug("processMessage: ignoring", { t: message.body.t });
152
+ // this.#storage.saveMessage(message);
153
+ break;
154
+ }
155
+ }
156
+ async commit(log, event) {
157
+ const body = event.body;
158
+ const signingKeys = event.body.t === "icp" ? event.body.k : log.state.signingKeys;
159
+ const backers = event.body.t === "icp" ? (event.body.b ?? []) : (log.state.backers ?? []);
160
+ const sigs = await this.sign(event.raw, signingKeys);
161
+ event.attachments.ControllerIdxSigs.push(...sigs);
162
+ this.#log.debug("commit: submitting to witnesses", {
163
+ t: body.t,
164
+ aid: body.i,
165
+ s: body.s,
166
+ backers: backers.length,
167
+ });
168
+ const endpoints = await Promise.all(backers.map((wit) => this.resolveEndpoint(wit)));
169
+ const wigs = await submitToWitnesses(event, endpoints, this.#fetch);
170
+ event.attachments.WitnessIdxSigs.push(...wigs);
171
+ this.#log.debug("commit: received witness signatures", { aid: body.i, s: body.s, wigs: wigs.length });
172
+ await this.processMessage(event);
173
+ }
174
+ async anchor(id, anchor) {
175
+ const log = await this.loadEventLog(id);
176
+ const event = keri.interact(log.state, { data: anchor.data });
177
+ this.#log.debug("anchor: created interaction", { aid: id, s: event.body.s });
178
+ await this.commit(log, event);
179
+ return {
180
+ id: event.body.i,
181
+ event: event.body,
182
+ };
183
+ }
184
+ async rotate(id, args) {
185
+ const log = await this.loadEventLog(id);
186
+ const state = log.state;
187
+ const publicKeys = await Promise.all(state.nextKeyDigests.map((digest) => this.#storage.getPublicKeyByDigest(digest)));
188
+ const nextPublicKey = await this.generateKey();
189
+ const nextPublicKeyDigest = keri.utils.digest(nextPublicKey);
190
+ const event = keri.rotate(state, {
191
+ signingKeys: publicKeys,
192
+ nextKeyDigests: [nextPublicKeyDigest],
193
+ data: args.data,
194
+ });
195
+ this.#log.debug("rotate: created rotation", { aid: id, s: event.body.s });
196
+ await this.commit(log, event);
197
+ return {
198
+ id: event.body.i,
199
+ event: event.body,
200
+ };
201
+ }
202
+ /**
203
+ * Creates and stores a signed reply message and submits to all witnesses.
204
+ */
205
+ async reply(args) {
206
+ const log = await this.loadEventLog(args.id);
207
+ const state = log.state;
208
+ const rpy = keri.reply({
209
+ r: args.route,
210
+ a: args.record,
211
+ });
212
+ const sigs = await this.sign(rpy.raw, state.signingKeys);
213
+ rpy.attachments.TransIdxSigGroups.push({
214
+ snu: state.lastEstablishment.s,
215
+ digest: state.lastEstablishment.d,
216
+ prefix: state.identifier,
217
+ ControllerIdxSigs: sigs,
218
+ });
219
+ await this.processMessage(rpy);
220
+ this.#log.debug("reply: broadcasting", { aid: args.id, route: args.route, witnesses: state.backers.length });
221
+ for (const wit of state.backers) {
222
+ const endpoint = this.resolveEndpoint(wit, "controller");
223
+ const client = new MailboxClient({
224
+ id: wit,
225
+ url: endpoint.url,
226
+ });
227
+ await client.sendMessage(rpy);
228
+ }
229
+ }
230
+ async forward(args) {
231
+ this.#log.debug("forward: dispatching", {
232
+ sender: args.sender,
233
+ recipient: args.recipient,
234
+ topic: args.topic,
235
+ });
236
+ const endpoint = this.resolveEndpoint(args.recipient, "mailbox");
237
+ const client = new MailboxClient({
238
+ id: endpoint.aid,
239
+ url: endpoint.url,
240
+ fetch: this.#fetch,
241
+ });
242
+ const log = await this.loadEventLog(args.sender);
243
+ const state = log.state;
244
+ const hasAttachments = args.message.attachments.frames().length > 1;
245
+ if (!hasAttachments) {
246
+ args.message.attachments.TransIdxSigGroups.push({
247
+ snu: state.lastEstablishment.s,
248
+ digest: state.lastEstablishment.d,
249
+ prefix: args.sender,
250
+ ControllerIdxSigs: await this.sign(args.message.raw, state.signingKeys),
251
+ });
252
+ }
253
+ const fwd = keri.exchange({
254
+ sender: args.sender,
255
+ route: "/fwd",
256
+ timestamp: args.timestamp,
257
+ // rp: args.recipient,
258
+ query: { pre: args.recipient, topic: args.topic },
259
+ anchor: {},
260
+ embeds: {
261
+ evt: args.message,
262
+ },
263
+ });
264
+ const fwdsigs = await this.sign(fwd.raw, state.signingKeys);
265
+ fwd.attachments = {
266
+ TransIdxSigGroups: [
267
+ {
268
+ prefix: args.sender,
269
+ ControllerIdxSigs: fwdsigs,
270
+ snu: state.lastEstablishment.s,
271
+ digest: state.lastEstablishment.d,
272
+ },
273
+ ],
274
+ PathedMaterialCouples: fwd.attachments.PathedMaterialCouples.map((couple) => ({
275
+ ...couple,
276
+ grouped: false,
277
+ })),
278
+ };
279
+ await client.sendMessage(fwd);
280
+ }
281
+ async createRegistry(owner) {
282
+ const log = await this.loadEventLog(owner);
283
+ const vcp = keri.registry({
284
+ ii: owner,
285
+ });
286
+ this.#log.debug("createRegistry: created", { owner, registry: vcp.body.i });
287
+ const anchor = await this.anchor(owner, {
288
+ data: {
289
+ d: vcp.body.d,
290
+ s: vcp.body.s,
291
+ i: vcp.body.i,
292
+ },
293
+ });
294
+ const seal = { digest: anchor.event.d, snu: anchor.event.s };
295
+ vcp.attachments.SealSourceCouples.push(seal);
296
+ const state = log.state;
297
+ for (const wit of state.backers) {
298
+ const endpoint = this.resolveEndpoint(wit, "controller");
299
+ const client = new MailboxClient({
300
+ id: wit,
301
+ url: endpoint.url,
302
+ fetch: this.#fetch,
303
+ });
304
+ await client.sendMessage(vcp);
305
+ }
306
+ await this.processMessage(vcp);
307
+ return vcp.body;
308
+ }
309
+ async listRegistries(owner) {
310
+ return Array.from(this.#storage.getRegistriesByOwner(owner)).map((message) => message.body);
311
+ }
312
+ async createCredential(args) {
313
+ const registry = this.#storage.getRegistry(args.registryId);
314
+ if (!registry) {
315
+ this.#log.warn("createCredential: registry not found", { registryId: args.registryId });
316
+ throw new Error(`Registry ${args.registryId} not found`);
317
+ }
318
+ const log = await this.loadEventLog(registry.body.ii);
319
+ const state = log.state;
320
+ const credential = keri.credential({
321
+ i: state.identifier,
322
+ ri: registry.body.i,
323
+ s: args.schemaId,
324
+ u: args.salt,
325
+ a: {
326
+ i: args.holder,
327
+ dt: keri.utils.formatDate(args.timestamp ?? new Date()),
328
+ ...args.data,
329
+ },
330
+ r: args.rules,
331
+ e: args.edges,
332
+ });
333
+ this.#log.debug("createCredential: created", {
334
+ d: credential.body.d,
335
+ registry: args.registryId,
336
+ schema: args.schemaId,
337
+ holder: args.holder,
338
+ });
339
+ await this.processMessage(credential);
340
+ return credential.body;
341
+ }
342
+ async getCredential(id) {
343
+ return this.#storage.getCredential(id);
344
+ }
345
+ async listCredentials(registryId) {
346
+ return this.#storage.getCredentialsByRegistry(registryId);
347
+ }
348
+ async issueCredential(credential) {
349
+ const log = await this.loadEventLog(credential.i);
350
+ this.#log.debug("issueCredential: issuing", { credential: credential.d, issuer: credential.i });
351
+ const iss = keri.issue({
352
+ i: credential.d,
353
+ ri: credential.ri,
354
+ dt: credential.a.dt,
355
+ });
356
+ const anchor = await this.anchor(credential.i, {
357
+ data: {
358
+ d: iss.body.d,
359
+ s: iss.body.s,
360
+ i: iss.body.i,
361
+ },
362
+ });
363
+ const seal = { digest: anchor.event.d, snu: anchor.event.s };
364
+ iss.attachments.SealSourceCouples.push(seal);
365
+ const state = log.state;
366
+ for (const wit of state.backers) {
367
+ const endpoint = this.resolveEndpoint(wit, "controller");
368
+ const client = new MailboxClient({
369
+ id: wit,
370
+ url: endpoint.url,
371
+ });
372
+ await client.sendMessage(iss);
373
+ }
374
+ await this.processMessage(iss);
375
+ }
376
+ getIssueEvent(credentialSaid) {
377
+ const [iss] = [...this.#storage.getCredentialEvents(credentialSaid)];
378
+ if (!iss) {
379
+ throw new Error(`No issuance found for said ${credentialSaid}`);
380
+ }
381
+ return iss;
382
+ }
383
+ getAnchorFromSeal(aid, digest) {
384
+ const log = KeyEventLog.from(this.#storage.getKeyEvents(aid));
385
+ const anchor = log.events.find((message) => message.body.d === digest);
386
+ if (!anchor) {
387
+ throw new Error(`No anchor found for digest ${digest}`);
388
+ }
389
+ return anchor;
390
+ }
391
+ buildCredentialMessage(credential) {
392
+ const [iss] = [...this.#storage.getCredentialEvents(credential.d)];
393
+ if (!iss) {
394
+ return null;
395
+ }
396
+ return new Message(credential, {
397
+ SealSourceTriples: [
398
+ {
399
+ prefix: iss.body.i,
400
+ snu: iss.body.s,
401
+ digest: iss.body.d,
402
+ },
403
+ ],
404
+ });
405
+ }
406
+ async sendCredentialArtifacts(credential, recipient) {
407
+ const log = await this.loadEventLog(credential.i);
408
+ const state = log.state;
409
+ if (credential.e) {
410
+ for (const [, edge] of Object.entries(credential.e)) {
411
+ if (typeof edge === "object" && edge !== null && "n" in edge && typeof edge.n === "string") {
412
+ const source = this.#storage.getCredential(edge.n);
413
+ if (!source) {
414
+ throw new Error(`No source found for edge ${edge.n}`);
415
+ }
416
+ await this.sendCredentialArtifacts(source, recipient);
417
+ const sourceMessage = this.buildCredentialMessage(source);
418
+ if (sourceMessage) {
419
+ await this.forward({
420
+ message: sourceMessage,
421
+ recipient: recipient,
422
+ sender: source.i,
423
+ topic: "credential",
424
+ });
425
+ }
426
+ }
427
+ }
428
+ }
429
+ const endpoint = this.resolveEndpoint(recipient, "mailbox");
430
+ const mailbox = new MailboxClient({
431
+ id: endpoint.aid,
432
+ url: endpoint.url,
433
+ });
434
+ for (const event of log.events) {
435
+ await mailbox.sendMessage(event);
436
+ }
437
+ for (const event of log.events) {
438
+ await this.forward({
439
+ message: event,
440
+ recipient,
441
+ sender: state.identifier,
442
+ topic: "credential",
443
+ });
444
+ }
445
+ const registryMessage = this.#storage.getRegistry(credential.ri);
446
+ if (!registryMessage) {
447
+ throw new Error(`Registry with id ${credential.ri} not found`);
448
+ }
449
+ if (!registryMessage.attachments.SealSourceCouples.length &&
450
+ !registryMessage.attachments.SealSourceTriples.length) {
451
+ throw new Error("No seal found for registry");
452
+ }
453
+ await this.forward({
454
+ message: registryMessage,
455
+ recipient,
456
+ sender: state.identifier,
457
+ topic: "credential",
458
+ });
459
+ for (const message of this.#storage.getCredentialEvents(credential.d)) {
460
+ if (!message.attachments.SealSourceCouples.length && !message.attachments.SealSourceTriples.length) {
461
+ throw new Error("No seal found for issuance");
462
+ }
463
+ await this.forward({
464
+ message,
465
+ recipient,
466
+ sender: state.identifier,
467
+ topic: "credential",
468
+ });
469
+ }
470
+ }
471
+ async grant(args) {
472
+ const log = await this.loadEventLog(args.credential.i);
473
+ const state = log.state;
474
+ const registry = this.#storage.getRegistry(args.credential.ri);
475
+ if (!registry) {
476
+ this.#log.warn("grant: registry not found", { ri: args.credential.ri });
477
+ throw new Error(`Registry not found for said ${args.credential.ri}`);
478
+ }
479
+ const issuee = args.credential.a.i;
480
+ const recipient = args.recipient || (typeof issuee === "string" && issuee ? issuee : undefined);
481
+ if (!recipient) {
482
+ this.#log.warn("grant: no recipient", { credential: args.credential.d });
483
+ throw new Error("No recipient specified and the credential has no issuee");
484
+ }
485
+ this.#log.debug("grant: building", { credential: args.credential.d, recipient });
486
+ const iss = this.getIssueEvent(args.credential.d);
487
+ const anchorSeal = iss.attachments.SealSourceCouples[0] || iss.attachments.SealSourceTriples[0];
488
+ if (!anchorSeal) {
489
+ throw new Error(`No seal found for issuance ${iss.body.d}`);
490
+ }
491
+ const anchor = this.getAnchorFromSeal(args.credential.i, anchorSeal.digest);
492
+ const grant = keri.exchange({
493
+ sender: state.identifier,
494
+ route: "/ipex/grant",
495
+ timestamp: args.timestamp,
496
+ query: {},
497
+ anchor: {
498
+ m: "",
499
+ i: recipient,
500
+ },
501
+ embeds: {
502
+ acdc: new Message(args.credential, {
503
+ SealSourceTriples: [
504
+ {
505
+ prefix: iss.body.i,
506
+ snu: iss.body.s,
507
+ digest: iss.body.d,
508
+ },
509
+ ],
510
+ }),
511
+ iss: new Message(iss.body, {
512
+ SealSourceCouples: [
513
+ {
514
+ digest: anchor.body.d,
515
+ snu: anchor.body.s,
516
+ },
517
+ ],
518
+ }),
519
+ anc: new Message(anchor.body, {
520
+ ControllerIdxSigs: anchor.attachments.ControllerIdxSigs,
521
+ WitnessIdxSigs: anchor.attachments.WitnessIdxSigs,
522
+ }),
523
+ },
524
+ });
525
+ const grantsigs = await this.sign(grant.raw, state.signingKeys);
526
+ grant.attachments.TransIdxSigGroups.push({
527
+ snu: state.lastEstablishment.s,
528
+ digest: state.lastEstablishment.d,
529
+ prefix: state.identifier,
530
+ ControllerIdxSigs: grantsigs,
531
+ });
532
+ await this.forward({
533
+ message: grant,
534
+ recipient,
535
+ sender: state.identifier,
536
+ topic: "credential",
537
+ timestamp: args.timestamp,
538
+ });
539
+ }
540
+ async query(id, topic) {
541
+ const log = await this.loadEventLog(id);
542
+ const state = log.state;
543
+ const endpoint = this.resolveEndpoint(id, "mailbox");
544
+ const client = new MailboxClient({ id: endpoint.aid, url: endpoint.url });
545
+ const offset = this.#storage.getMailboxOffset(id, topic);
546
+ const queryMessage = keri.query({
547
+ r: "mbx",
548
+ q: {
549
+ src: endpoint.aid,
550
+ i: id,
551
+ topics: { [`/${topic}`]: offset },
552
+ },
553
+ });
554
+ queryMessage.attachments = {
555
+ TransLastIdxSigGroups: [
556
+ {
557
+ prefix: id,
558
+ ControllerIdxSigs: await this.sign(queryMessage.raw, state.signingKeys),
559
+ },
560
+ ],
561
+ };
562
+ this.#log.debug("query: sending", { aid: id, topic, offset });
563
+ const result = await client.sendMessage(queryMessage, AbortSignal.timeout(10000));
564
+ for (const incoming of result) {
565
+ this.#storage.saveMessage(incoming);
566
+ }
567
+ this.#storage.saveMailboxOffset(id, topic, offset + result.length);
568
+ this.#log.debug("query: received", { aid: id, topic, count: result.length });
569
+ return result;
570
+ }
571
+ async receiveGrants(holderId) {
572
+ const messages = await this.query(holderId, "credential");
573
+ const credentials = [];
574
+ for (const message of messages) {
575
+ const body = message.body;
576
+ if (body.t !== "exn" || body.r !== "/ipex/grant") {
577
+ continue;
578
+ }
579
+ const acdcBody = body.e?.acdc;
580
+ const issBody = body.e?.iss;
581
+ if (!acdcBody || !issBody) {
582
+ this.#log.warn("receiveGrants: invalid grant", { holder: holderId });
583
+ throw new Error("Invalid grant message: missing acdc or iss embed");
584
+ }
585
+ const acdcCouple = message.attachments.PathedMaterialCouples.find((c) => c.path === "-e-acdc");
586
+ const issCouple = message.attachments.PathedMaterialCouples.find((c) => c.path === "-e-iss");
587
+ this.#storage.saveMessage(new Message(acdcBody, acdcCouple?.attachments ?? new Attachments()));
588
+ if (issBody) {
589
+ this.#storage.saveMessage(new Message(issBody, issCouple?.attachments ?? new Attachments()));
590
+ }
591
+ credentials.push(acdcBody);
592
+ }
593
+ this.#log.debug("receiveGrants: complete", { holder: holderId, credentials: credentials.length });
594
+ return credentials;
595
+ }
596
+ async export(id) {
597
+ const log = await this.loadEventLog(id);
598
+ return log.events;
599
+ }
600
+ }
601
+ //# sourceMappingURL=controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../src/controller/controller.ts"],"names":[],"mappings":"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"}