keri 0.0.8-dev.bfac33d → 0.0.8-dev.e44ed64

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 (104) hide show
  1. package/README.md +1 -8
  2. package/dist/controller/controller.d.ts +109 -0
  3. package/dist/controller/controller.js +545 -0
  4. package/dist/controller/controller.js.map +1 -0
  5. package/dist/controller/encrypt.d.ts +45 -0
  6. package/dist/controller/encrypt.js +120 -0
  7. package/dist/controller/encrypt.js.map +1 -0
  8. package/dist/core/credential-event.d.ts +58 -0
  9. package/dist/core/credential-event.js +28 -0
  10. package/dist/core/credential-event.js.map +1 -0
  11. package/dist/core/credential.d.ts +79 -0
  12. package/dist/core/credential.js +25 -0
  13. package/dist/core/credential.js.map +1 -0
  14. package/dist/core/digest.d.ts +1 -0
  15. package/dist/core/digest.js +7 -0
  16. package/dist/core/digest.js.map +1 -0
  17. package/dist/core/endpoint-discovery.d.ts +20 -0
  18. package/dist/core/endpoint-discovery.js +60 -0
  19. package/dist/core/endpoint-discovery.js.map +1 -0
  20. package/dist/core/events.d.ts +12 -0
  21. package/dist/core/events.js +25 -0
  22. package/dist/core/events.js.map +1 -0
  23. package/dist/core/kawa.d.ts +17 -0
  24. package/dist/core/kawa.js +79 -0
  25. package/dist/core/kawa.js.map +1 -0
  26. package/dist/core/key-event-log.d.ts +13 -0
  27. package/dist/core/key-event-log.js +154 -0
  28. package/dist/core/key-event-log.js.map +1 -0
  29. package/dist/core/key-event.d.ts +96 -0
  30. package/dist/core/key-event.js +89 -0
  31. package/dist/core/key-event.js.map +1 -0
  32. package/dist/core/keys.d.ts +9 -0
  33. package/dist/core/keys.js +17 -0
  34. package/dist/core/keys.js.map +1 -0
  35. package/dist/core/mailbox-client.d.ts +17 -0
  36. package/dist/core/mailbox-client.js +57 -0
  37. package/dist/core/mailbox-client.js.map +1 -0
  38. package/dist/core/main.d.ts +47 -0
  39. package/dist/core/main.js +44 -0
  40. package/dist/core/main.js.map +1 -0
  41. package/dist/core/receipt-event.d.ts +15 -0
  42. package/dist/core/receipt-event.js +13 -0
  43. package/dist/core/receipt-event.js.map +1 -0
  44. package/dist/core/registry-event.d.ts +28 -0
  45. package/dist/core/registry-event.js +18 -0
  46. package/dist/core/registry-event.js.map +1 -0
  47. package/dist/core/routed-event.d.ts +73 -0
  48. package/dist/core/routed-event.js +53 -0
  49. package/dist/core/routed-event.js.map +1 -0
  50. package/dist/core/said.d.ts +4 -0
  51. package/dist/core/said.js +26 -0
  52. package/dist/core/said.js.map +1 -0
  53. package/dist/core/sign.d.ts +5 -0
  54. package/dist/core/sign.js +10 -0
  55. package/dist/core/sign.js.map +1 -0
  56. package/dist/core/threshold.d.ts +6 -0
  57. package/dist/core/threshold.js +58 -0
  58. package/dist/core/threshold.js.map +1 -0
  59. package/dist/core/verify.d.ts +14 -0
  60. package/dist/core/verify.js +43 -0
  61. package/dist/core/verify.js.map +1 -0
  62. package/dist/main.d.ts +2 -7
  63. package/dist/main.js +2 -7
  64. package/dist/main.js.map +1 -1
  65. package/dist/storage/sqlite/node-sqlite.d.ts +12 -0
  66. package/dist/storage/sqlite/node-sqlite.js +25 -0
  67. package/dist/storage/sqlite/node-sqlite.js.map +1 -0
  68. package/dist/storage/sqlite/schema.d.ts +2 -0
  69. package/dist/storage/sqlite/schema.js +49 -0
  70. package/dist/storage/sqlite/schema.js.map +1 -0
  71. package/dist/storage/sqlite/sqlite-database.d.ts +13 -0
  72. package/dist/storage/sqlite/sqlite-database.js +2 -0
  73. package/dist/storage/sqlite/sqlite-database.js.map +1 -0
  74. package/dist/storage/sqlite/storage-sqlite.d.ts +26 -0
  75. package/dist/storage/sqlite/storage-sqlite.js +213 -0
  76. package/dist/storage/sqlite/storage-sqlite.js.map +1 -0
  77. package/package.json +10 -11
  78. package/dist/cli/main.d.ts +0 -2
  79. package/dist/cli/main.js +0 -182
  80. package/dist/cli/main.js.map +0 -1
  81. package/dist/client.d.ts +0 -17
  82. package/dist/client.js +0 -53
  83. package/dist/client.js.map +0 -1
  84. package/dist/controller.d.ts +0 -63
  85. package/dist/controller.js +0 -451
  86. package/dist/controller.js.map +0 -1
  87. package/dist/db/storage-sqlite.d.ts +0 -12
  88. package/dist/db/storage-sqlite.js +0 -53
  89. package/dist/db/storage-sqlite.js.map +0 -1
  90. package/dist/db/storage.d.ts +0 -18
  91. package/dist/db/storage.js +0 -29
  92. package/dist/db/storage.js.map +0 -1
  93. package/dist/events/event-store.d.ts +0 -116
  94. package/dist/events/event-store.js +0 -254
  95. package/dist/events/event-store.js.map +0 -1
  96. package/dist/events/events.d.ts +0 -248
  97. package/dist/events/events.js +0 -186
  98. package/dist/events/events.js.map +0 -1
  99. package/dist/keystore/encrypt.d.ts +0 -10
  100. package/dist/keystore/encrypt.js +0 -39
  101. package/dist/keystore/encrypt.js.map +0 -1
  102. package/dist/keystore/key-manager.d.ts +0 -27
  103. package/dist/keystore/key-manager.js +0 -76
  104. package/dist/keystore/key-manager.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/core/main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAC;AAE5C,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAI1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,aAAa;IACb,MAAM;IACN,QAAQ;IACR,MAAM;IACN,WAAW;IACX,QAAQ;IACR,KAAK;IACL,MAAM;IACN,UAAU,EAAE,gBAAgB;IAC5B,SAAS;IACT,QAAQ;IACR,KAAK;IACL,KAAK;IACL,UAAU;IACV,OAAO;IACP,KAAK,EAAE;QACL,IAAI;QACJ,MAAM;QACN,UAAU;QACV,eAAe;QACf,MAAM;KACP;CACF,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { Message } from "cesr";
2
+ export interface ReceiptEventInit {
3
+ d: string;
4
+ i: string;
5
+ s: string;
6
+ }
7
+ export type ReceiptEventBody = {
8
+ v: string;
9
+ t: "rct";
10
+ d: string;
11
+ i: string;
12
+ s: string;
13
+ };
14
+ export type ReceiptEvent = Message<ReceiptEventBody>;
15
+ export declare function receipt(args: ReceiptEventInit): Message<ReceiptEventBody>;
@@ -0,0 +1,13 @@
1
+ import { Message } from "cesr";
2
+ import { DUMMY_VERSION, encodeEvent } from "./events.js";
3
+ export function receipt(args) {
4
+ const body = encodeEvent({
5
+ v: DUMMY_VERSION,
6
+ t: "rct",
7
+ d: args.d,
8
+ i: args.i,
9
+ s: args.s,
10
+ }, { labels: [] });
11
+ return new Message(body);
12
+ }
13
+ //# sourceMappingURL=receipt-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"receipt-event.js","sourceRoot":"","sources":["../../src/core/receipt-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAmBzD,MAAM,UAAU,OAAO,CAAC,IAAsB;IAC5C,MAAM,IAAI,GAAG,WAAW,CACtB;QACE,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,CAAC,EAAE,IAAI,CAAC,CAAC;KACV,EACD,EAAE,MAAM,EAAE,EAAE,EAAE,CACf,CAAC;IAEF,OAAO,IAAI,OAAO,CAAmB,IAAI,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Message } from "cesr";
2
+ export interface RegistryInceptEventInit {
3
+ ii: string;
4
+ n?: string;
5
+ }
6
+ export type RegistryInceptEvent = {
7
+ v: string;
8
+ t: "vcp";
9
+ d: string;
10
+ i: string;
11
+ ii: string;
12
+ s: string;
13
+ c: string[];
14
+ bt: string;
15
+ b: string[];
16
+ n: string;
17
+ };
18
+ export type RegistryEventBody = {
19
+ v: string;
20
+ t: string;
21
+ d: string;
22
+ i: string;
23
+ [key: string]: unknown;
24
+ };
25
+ export type RegistryEvent = Message<RegistryEventBody>;
26
+ export declare function incept(args: RegistryInceptEventInit): Message<RegistryInceptEvent & {
27
+ v: string;
28
+ }>;
@@ -0,0 +1,18 @@
1
+ import { Message } from "cesr";
2
+ import { DUMMY_VERSION, encodeEvent, randomNonce } from "./events.js";
3
+ export function incept(args) {
4
+ const body = encodeEvent({
5
+ v: DUMMY_VERSION,
6
+ t: "vcp",
7
+ d: "",
8
+ i: "",
9
+ ii: args.ii,
10
+ s: "0",
11
+ c: ["NB"],
12
+ bt: "0",
13
+ b: [],
14
+ n: args.n ?? randomNonce(),
15
+ }, { labels: ["d", "i"], legacy: true });
16
+ return new Message(body);
17
+ }
18
+ //# sourceMappingURL=registry-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-event.js","sourceRoot":"","sources":["../../src/core/registry-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgCtE,MAAM,UAAU,MAAM,CAAC,IAA6B;IAClD,MAAM,IAAI,GAAG,WAAW,CACtB;QACE,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,EAAE;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,GAAG;QACP,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,WAAW,EAAE;KAC3B,EACD,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CACrC,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { Message } from "cesr";
2
+ export interface QueryEventInit {
3
+ dt?: Date;
4
+ r?: string;
5
+ rr?: string;
6
+ q: Record<string, unknown>;
7
+ }
8
+ export type QueryEvent = {
9
+ v: string;
10
+ t: "qry";
11
+ d: string;
12
+ dt: string;
13
+ r: string;
14
+ rr: string;
15
+ q: Record<string, unknown>;
16
+ };
17
+ export interface ReplyEventInit {
18
+ dt?: string;
19
+ r: string;
20
+ a: Record<string, unknown>;
21
+ }
22
+ export type ReplyEvent = {
23
+ v: string;
24
+ t: "rpy";
25
+ d: string;
26
+ dt: string;
27
+ r: string;
28
+ a: Record<string, unknown>;
29
+ };
30
+ export type RoutedEventBody = {
31
+ v: string;
32
+ t: string;
33
+ d: string;
34
+ r: string;
35
+ [key: string]: unknown;
36
+ };
37
+ export type RoutedEvent = Message<RoutedEventBody>;
38
+ export declare function query(args: QueryEventInit): Message<QueryEvent & {
39
+ v: string;
40
+ }>;
41
+ export declare function reply(args: ReplyEventInit): Message<ReplyEvent & {
42
+ v: string;
43
+ }>;
44
+ export interface ExchangeEventInit {
45
+ sender: string;
46
+ recipient?: string;
47
+ p?: string;
48
+ timestamp?: string;
49
+ route: string;
50
+ query?: Record<string, unknown>;
51
+ anchor?: Record<string, unknown>;
52
+ embeds?: Record<string, Message>;
53
+ }
54
+ export interface ExchangeEmbedding {
55
+ d: string;
56
+ [key: string]: string | Record<string, unknown>;
57
+ }
58
+ export interface ExchangeEvent extends Record<string, unknown> {
59
+ v: string;
60
+ t: "exn";
61
+ d: string;
62
+ i: string;
63
+ rp: string;
64
+ p: string;
65
+ dt: string;
66
+ r: string;
67
+ q: Record<string, unknown>;
68
+ a: Record<string, unknown>;
69
+ e: Record<string, string | Record<string, unknown>>;
70
+ }
71
+ export declare function exchange(args: ExchangeEventInit): Message<ExchangeEvent & {
72
+ v: string;
73
+ }>;
@@ -0,0 +1,53 @@
1
+ import { Attachments, Message } from "cesr";
2
+ import { DUMMY_VERSION, encodeEvent, formatDate } from "./events.js";
3
+ import { saidify } from "./said.js";
4
+ export function query(args) {
5
+ const body = encodeEvent({
6
+ v: DUMMY_VERSION,
7
+ t: "qry",
8
+ d: "",
9
+ dt: formatDate(args.dt ?? new Date()),
10
+ r: args.r ?? "",
11
+ rr: args.rr ?? "",
12
+ q: args.q,
13
+ });
14
+ return new Message(body);
15
+ }
16
+ export function reply(args) {
17
+ const body = encodeEvent({
18
+ v: DUMMY_VERSION,
19
+ t: "rpy",
20
+ d: "",
21
+ dt: args.dt ?? formatDate(new Date()),
22
+ r: args.r,
23
+ a: args.a,
24
+ });
25
+ return new Message(body);
26
+ }
27
+ export function exchange(args) {
28
+ const embeds = { d: "" };
29
+ const attachments = new Attachments();
30
+ for (const [key, message] of Object.entries(args.embeds ?? {})) {
31
+ embeds[key] = message.body;
32
+ attachments.PathedMaterialCouples.push({
33
+ path: "-" + ["e", key].join("-"),
34
+ attachments: message.attachments,
35
+ grouped: true,
36
+ });
37
+ }
38
+ const body = encodeEvent({
39
+ v: DUMMY_VERSION,
40
+ t: "exn",
41
+ d: "",
42
+ i: args.sender,
43
+ rp: args.recipient ?? "",
44
+ p: args.p ?? "",
45
+ dt: args.timestamp ?? formatDate(new Date()),
46
+ r: args.route,
47
+ q: args.query ?? {},
48
+ a: args.anchor ?? {},
49
+ e: args.embeds ? saidify(embeds, ["d"]) : {},
50
+ });
51
+ return new Message(body, attachments);
52
+ }
53
+ //# sourceMappingURL=routed-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routed-event.js","sourceRoot":"","sources":["../../src/core/routed-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+CpC,MAAM,UAAU,KAAK,CAAC,IAAoB;IACxC,MAAM,IAAI,GAAG,WAAW,CAAa;QACnC,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,EAAE;QACL,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE;QACf,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;QACjB,CAAC,EAAE,IAAI,CAAC,CAAC;KACV,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAoB;IACxC,MAAM,IAAI,GAAG,WAAW,CAAa;QACnC,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,EAAE;QACL,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;QACrC,CAAC,EAAE,IAAI,CAAC,CAAC;QACT,CAAC,EAAE,IAAI,CAAC,CAAC;KACV,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAgCD,MAAM,UAAU,QAAQ,CAAC,IAAuB;IAC9C,MAAM,MAAM,GAAsB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,WAAW,CAAC,qBAAqB,CAAC,IAAI,CAAC;YACrC,IAAI,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAChC,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAgB;QACtC,CAAC,EAAE,aAAa;QAChB,CAAC,EAAE,KAAK;QACR,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,IAAI,CAAC,MAAM;QACd,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;QACxB,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE;QACf,EAAE,EAAE,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5C,CAAC,EAAE,IAAI,CAAC,KAAK;QACb,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACnB,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE;QACpB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KAC7C,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface SaidArgs {
2
+ labels?: string[];
3
+ }
4
+ export declare function saidify<T extends Record<string, unknown>>(event: T, labels?: string[]): T;
@@ -0,0 +1,26 @@
1
+ import { blake3 } from "@noble/hashes/blake3.js";
2
+ import { cesr } from "cesr";
3
+ function calculateSaid(event) {
4
+ const digest = cesr.crypto.blake3_256(blake3
5
+ .create({ dkLen: 32 })
6
+ .update(new TextEncoder().encode(JSON.stringify(event)))
7
+ .digest());
8
+ return digest.text();
9
+ }
10
+ export function saidify(event, labels) {
11
+ if (!labels?.length) {
12
+ return event;
13
+ }
14
+ const digest = calculateSaid(event);
15
+ const result = {};
16
+ for (const [key, value] of Object.entries(event)) {
17
+ if (labels.includes(key)) {
18
+ result[key] = digest;
19
+ }
20
+ else {
21
+ result[key] = value;
22
+ }
23
+ }
24
+ return result;
25
+ }
26
+ //# sourceMappingURL=said.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"said.js","sourceRoot":"","sources":["../../src/core/said.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,SAAS,aAAa,CAAC,KAA8B;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CACnC,MAAM;SACH,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACrB,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;SACvD,MAAM,EAAE,CACZ,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC;AAMD,MAAM,UAAU,OAAO,CAAoC,KAAQ,EAAE,MAAiB;IACpF,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export interface SignOptions {
2
+ key: Uint8Array;
3
+ index?: number;
4
+ }
5
+ export declare function sign(payload: Uint8Array, options: SignOptions): string;
@@ -0,0 +1,10 @@
1
+ import { ed25519 } from "@noble/curves/ed25519.js";
2
+ import { cesr, Indexer } from "cesr";
3
+ export function sign(payload, options) {
4
+ const signature = ed25519.sign(payload, options.key);
5
+ if (options.index !== undefined && options.index !== null) {
6
+ return Indexer.crypto.ed25519_sig(signature, options.index).text();
7
+ }
8
+ return cesr.crypto.ed25519_sig(signature).text();
9
+ }
10
+ //# sourceMappingURL=sign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/core/sign.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAOrC,MAAM,UAAU,IAAI,CAAC,OAAmB,EAAE,OAAoB;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export type Threshold = string | string[];
2
+ export interface WeightedThreshold {
3
+ weights: number[];
4
+ required: number;
5
+ }
6
+ export declare function parseThreshold(threshold: Threshold, numKeys: number): WeightedThreshold;
@@ -0,0 +1,58 @@
1
+ function greatestCommonDivisor(a, b) {
2
+ let x = Math.abs(a);
3
+ let y = Math.abs(b);
4
+ while (y !== 0) {
5
+ const remainder = x % y;
6
+ x = y;
7
+ y = remainder;
8
+ }
9
+ return x;
10
+ }
11
+ function findLeastCommonDenominator(denominators) {
12
+ if (denominators.length === 0) {
13
+ throw new Error("At least one denominator is required");
14
+ }
15
+ return denominators.reduce((lcm, value) => {
16
+ if (!Number.isInteger(value) || value <= 0) {
17
+ throw new Error(`Invalid denominator: ${value}`);
18
+ }
19
+ return (lcm * value) / greatestCommonDivisor(lcm, value);
20
+ }, 1);
21
+ }
22
+ function parsePositiveInteger(value, errorMessage) {
23
+ if (!/^\d+$/.test(value)) {
24
+ throw new Error(errorMessage);
25
+ }
26
+ const parsed = Number.parseInt(value, 10);
27
+ if (parsed <= 0) {
28
+ throw new Error(errorMessage);
29
+ }
30
+ return parsed;
31
+ }
32
+ function parseFraction(fraction) {
33
+ const parts = fraction.split("/", 2);
34
+ if (parts.length !== 2) {
35
+ throw new Error(`Invalid threshold: ${fraction}`);
36
+ }
37
+ const numerator = parsePositiveInteger(parts[0], `Invalid threshold: ${fraction}`);
38
+ const denominator = parsePositiveInteger(parts[1], `Invalid threshold: ${fraction}`);
39
+ return [numerator, denominator];
40
+ }
41
+ export function parseThreshold(threshold, numKeys) {
42
+ if (typeof threshold === "string") {
43
+ const required = parsePositiveInteger(threshold, `Invalid threshold: ${threshold}`);
44
+ if (required > numKeys) {
45
+ throw new Error(`Invalid threshold: ${threshold} exceeds number of parties: ${numKeys}`);
46
+ }
47
+ return {
48
+ required,
49
+ weights: Array.from({ length: numKeys }, () => 1),
50
+ };
51
+ }
52
+ const values = threshold.map((t) => parseFraction(t));
53
+ const denominators = values.map(([, denom]) => denom);
54
+ const required = findLeastCommonDenominator(denominators);
55
+ const weights = values.map(([num, denom]) => (num * required) / denom);
56
+ return { weights, required };
57
+ }
58
+ //# sourceMappingURL=threshold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../src/core/threshold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Threshold } from "./threshold.ts";
2
+ export interface VerifyOptions {
3
+ threshold: Threshold;
4
+ keys: string[];
5
+ sigs: string[];
6
+ }
7
+ export type VerifyResult = {
8
+ ok: true;
9
+ } | {
10
+ ok: false;
11
+ error: string;
12
+ };
13
+ export declare function verify(payload: Uint8Array, options: VerifyOptions): VerifyResult;
14
+ export declare function verifyOrThrow(payload: Uint8Array, options: VerifyOptions): void;
@@ -0,0 +1,43 @@
1
+ import { ed25519 } from "@noble/curves/ed25519.js";
2
+ import { Indexer, Matter } from "cesr";
3
+ import { parseThreshold } from "./threshold.js";
4
+ function verifySignature(payload, key, sig) {
5
+ switch (key.code) {
6
+ case Matter.Code.Ed25519:
7
+ case Matter.Code.Ed25519N:
8
+ // TODO:
9
+ // We can check the code of the signature,
10
+ // but it does not really matter since it will be verified correctly regardless.
11
+ // Anyway, revisit later
12
+ return ed25519.verify(sig.raw, payload, key.raw);
13
+ default:
14
+ throw new Error(`Unsupported key code: ${key.code}`);
15
+ }
16
+ }
17
+ export function verify(payload, options) {
18
+ const keys = options.keys.map((key) => Matter.parse(key));
19
+ const sigs = options.sigs.map((sig) => Indexer.parse(sig));
20
+ const threshold = parseThreshold(options.threshold, options.keys.length);
21
+ let sum = 0;
22
+ for (let idx = 0; idx < keys.length; idx++) {
23
+ const sig = sigs.find((s) => s.index === idx);
24
+ if (!sig) {
25
+ continue;
26
+ }
27
+ if (!verifySignature(payload, keys[idx], sig)) {
28
+ return { ok: false, error: `Invalid signature for key at index ${idx}` };
29
+ }
30
+ sum += threshold.weights[idx];
31
+ }
32
+ if (sum < threshold.required) {
33
+ return { ok: false, error: `Threshold not met: ${sum} weight provided, but ${threshold.required} required` };
34
+ }
35
+ return { ok: true };
36
+ }
37
+ export function verifyOrThrow(payload, options) {
38
+ const result = verify(payload, options);
39
+ if (!result.ok) {
40
+ throw new Error(result.error);
41
+ }
42
+ }
43
+ //# sourceMappingURL=verify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/core/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAiBhE,SAAS,eAAe,CAAC,OAAmB,EAAE,GAAW,EAAE,GAAqB;IAC9E,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ;YACvB,QAAQ;YACR,0CAA0C;YAC1C,gFAAgF;YAChF,wBAAwB;YACxB,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACnD;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAmB,EAAE,OAAsB;IAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEzE,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sCAAsC,GAAG,EAAE,EAAE,CAAC;QAC3E,CAAC;QAED,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,GAAG,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,sBAAsB,GAAG,yBAAyB,SAAS,CAAC,QAAQ,WAAW,EAAE,CAAC;IAC/G,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAmB,EAAE,OAAsB;IACvE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;AACH,CAAC"}
package/dist/main.d.ts CHANGED
@@ -1,7 +1,2 @@
1
- export * from "./events/events.ts";
2
- export * from "./events/event-store.ts";
3
- export * from "./db/storage.ts";
4
- export * from "./keystore/key-manager.ts";
5
- export * from "./keystore/encrypt.ts";
6
- export * from "./controller.ts";
7
- export * from "cesr";
1
+ export * from "./core/main.ts";
2
+ export * from "./controller/controller.ts";
package/dist/main.js CHANGED
@@ -1,8 +1,3 @@
1
- export * from "./events/events.js";
2
- export * from "./events/event-store.js";
3
- export * from "./db/storage.js";
4
- export * from "./keystore/key-manager.js";
5
- export * from "./keystore/encrypt.js";
6
- export * from "./controller.js";
7
- export * from "cesr";
1
+ export * from "./core/main.js";
2
+ export * from "./controller/controller.js";
8
3
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,MAAM,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DatabaseSync } from "node:sqlite";
2
+ import type { Database, Params, Row } from "./sqlite-database.ts";
3
+ /**
4
+ * Adapter that wraps the built-in `node:sqlite` `DatabaseSync` class so it satisfies the `Database` interface.
5
+ */
6
+ export declare class NodeSqliteDatabase implements Database {
7
+ #private;
8
+ constructor(db: DatabaseSync);
9
+ execute(sql: string, params?: Params): void;
10
+ queryOne(sql: string, params?: Params): Row | undefined;
11
+ iterate(sql: string, params?: Params): Iterable<Row>;
12
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Adapter that wraps the built-in `node:sqlite` `DatabaseSync` class so it satisfies the `Database` interface.
3
+ */
4
+ export class NodeSqliteDatabase {
5
+ #db;
6
+ constructor(db) {
7
+ this.#db = db;
8
+ }
9
+ execute(sql, params) {
10
+ if (params !== undefined) {
11
+ this.#db.prepare(sql).run(params);
12
+ }
13
+ else {
14
+ this.#db.exec(sql);
15
+ }
16
+ }
17
+ queryOne(sql, params) {
18
+ const result = this.#db.prepare(sql).get(params ?? {});
19
+ return result;
20
+ }
21
+ iterate(sql, params) {
22
+ return this.#db.prepare(sql).iterate(params ?? {});
23
+ }
24
+ }
25
+ //# sourceMappingURL=node-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sqlite.js","sourceRoot":"","sources":["../../../src/storage/sqlite/node-sqlite.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B,GAAG,CAAe;IAElB,YAAY,EAAgB;QAC1B,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,MAAe;QAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,MAAe;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,MAAyB,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,MAAe;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAkB,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ import type { Database } from "./sqlite-database.ts";
2
+ export declare function migrate(db: Database): void;
@@ -0,0 +1,49 @@
1
+ const migrations = [
2
+ // Migration 1: initial schema
3
+ [
4
+ `CREATE TABLE IF NOT EXISTS event (
5
+ event_id TEXT PRIMARY KEY,
6
+ protocol TEXT NOT NULL,
7
+ type TEXT NOT NULL,
8
+ sn INTEGER,
9
+ event_json JSON NOT NULL,
10
+ attachments TEXT
11
+ )`,
12
+ `CREATE TABLE IF NOT EXISTS key_info (
13
+ public_key TEXT PRIMARY KEY,
14
+ public_key_digest TEXT NOT NULL,
15
+ encrypted_private_key TEXT NOT NULL
16
+ )`,
17
+ ],
18
+ // Migration 2: mailbox cursor
19
+ [
20
+ `CREATE TABLE IF NOT EXISTS mailbox_cursor (
21
+ prefix TEXT NOT NULL,
22
+ topic TEXT NOT NULL,
23
+ offset INTEGER NOT NULL DEFAULT 0,
24
+ PRIMARY KEY (prefix, topic)
25
+ )`,
26
+ ],
27
+ ];
28
+ export function migrate(db) {
29
+ db.execute(`CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL)`);
30
+ db.execute(`INSERT INTO schema_version (version) SELECT 0 WHERE NOT EXISTS (SELECT 1 FROM schema_version)`);
31
+ const row = Array.from(db.iterate("SELECT version FROM schema_version"))[0];
32
+ let current = typeof row?.version === "number" ? row.version : 0;
33
+ for (let i = current; i < migrations.length; i++) {
34
+ db.execute("BEGIN");
35
+ try {
36
+ for (const statement of migrations[i]) {
37
+ db.execute(statement);
38
+ }
39
+ db.execute(`UPDATE schema_version SET version = ${i + 1}`);
40
+ db.execute("COMMIT");
41
+ }
42
+ catch (err) {
43
+ db.execute("ROLLBACK");
44
+ throw err;
45
+ }
46
+ current = i + 1;
47
+ }
48
+ }
49
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/storage/sqlite/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAe;IAC7B,8BAA8B;IAC9B;QACE;;;;;;;MAOE;QACF;;;;MAIE;KACH;IACD,8BAA8B;IAC9B;QACE;;;;;MAKE;KACH;CACF,CAAC;AAEF,MAAM,UAAU,OAAO,CAAC,EAAY;IAClC,EAAE,CAAC,OAAO,CAAC,sEAAsE,CAAC,CAAC;IACnF,EAAE,CAAC,OAAO,CAAC,+FAA+F,CAAC,CAAC;IAE5G,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAG,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,KAAK,IAAI,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACxB,CAAC;YACD,EAAE,CAAC,OAAO,CAAC,uCAAuC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3D,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACvB,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type SQLValue = string | number | null | Uint8Array;
2
+ export type Params = Record<string, SQLValue>;
3
+ export type Row = Record<string, SQLValue>;
4
+ export interface Database {
5
+ /**
6
+ * Execute a statement that produces no rows (DDL, DML, transaction control).
7
+ */
8
+ execute(sql: string, params?: Params): void;
9
+ /**
10
+ * Iterate over matching rows one at a time without loading all into memory.
11
+ */
12
+ iterate(sql: string, params?: Params): Iterable<Row>;
13
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sqlite-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-database.js","sourceRoot":"","sources":["../../../src/storage/sqlite/sqlite-database.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { Database } from "./sqlite-database.ts";
2
+ export { NodeSqliteDatabase } from "./node-sqlite.ts";
3
+ export type { Database, Row, Params, SQLValue } from "./sqlite-database.ts";
4
+ import { Message, type KeyEvent, type RegistryInceptEvent, type IssueEvent, type RevokeEvent, type ReplyEvent, type CredentialBody } from "../../core/main.ts";
5
+ import type { ControllerStorage } from "../../controller/controller.ts";
6
+ export declare class SqliteControllerStorage implements ControllerStorage {
7
+ #private;
8
+ constructor(db: Database);
9
+ saveKey(publicKey: string, digest: string, encryptedPrivKey: string): void;
10
+ getKey(publicKey: string): string;
11
+ getPublicKeyByDigest(digest: string): string;
12
+ saveMessage(message: Message): void;
13
+ getReplies(filter?: {
14
+ route?: string;
15
+ eid?: string;
16
+ cid?: string;
17
+ }): Generator<Message<ReplyEvent>>;
18
+ getKeyEvents(prefix: string): Generator<KeyEvent>;
19
+ getCredentialEvents(id: string): Generator<Message<IssueEvent | RevokeEvent>>;
20
+ getRegistry(id: string): Message<RegistryInceptEvent> | null;
21
+ getRegistriesByOwner(owner: string): Generator<Message<RegistryInceptEvent>>;
22
+ getCredential(id: string): CredentialBody | null;
23
+ getCredentialsByRegistry(registryId: string): CredentialBody[];
24
+ getMailboxOffset(prefix: string, topic: string): number;
25
+ saveMailboxOffset(prefix: string, topic: string, offset: number): void;
26
+ }