@econ-v1/domain 0.0.0

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 (173) hide show
  1. package/dist/errors/index.d.ts +41 -0
  2. package/dist/errors/index.d.ts.map +1 -0
  3. package/dist/errors/index.js +45 -0
  4. package/dist/errors/index.js.map +1 -0
  5. package/dist/events/index.d.ts +55 -0
  6. package/dist/events/index.d.ts.map +1 -0
  7. package/dist/events/index.js +17 -0
  8. package/dist/events/index.js.map +1 -0
  9. package/dist/index.d.ts +47 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +24 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/models/agent.d.ts +12 -0
  14. package/dist/models/agent.d.ts.map +1 -0
  15. package/dist/models/agent.js +17 -0
  16. package/dist/models/agent.js.map +1 -0
  17. package/dist/models/conversation.d.ts +3 -0
  18. package/dist/models/conversation.d.ts.map +1 -0
  19. package/dist/models/conversation.js +2 -0
  20. package/dist/models/conversation.js.map +1 -0
  21. package/dist/models/delegation.d.ts +4 -0
  22. package/dist/models/delegation.d.ts.map +1 -0
  23. package/dist/models/delegation.js +23 -0
  24. package/dist/models/delegation.js.map +1 -0
  25. package/dist/models/device-identity.d.ts +4 -0
  26. package/dist/models/device-identity.d.ts.map +1 -0
  27. package/dist/models/device-identity.js +53 -0
  28. package/dist/models/device-identity.js.map +1 -0
  29. package/dist/models/graph.d.ts +20 -0
  30. package/dist/models/graph.d.ts.map +1 -0
  31. package/dist/models/graph.js +30 -0
  32. package/dist/models/graph.js.map +1 -0
  33. package/dist/models/index.d.ts +18 -0
  34. package/dist/models/index.d.ts.map +1 -0
  35. package/dist/models/index.js +8 -0
  36. package/dist/models/index.js.map +1 -0
  37. package/dist/models/json.d.ts +8 -0
  38. package/dist/models/json.d.ts.map +1 -0
  39. package/dist/models/json.js +2 -0
  40. package/dist/models/json.js.map +1 -0
  41. package/dist/models/l402.d.ts +15 -0
  42. package/dist/models/l402.d.ts.map +1 -0
  43. package/dist/models/l402.js +2 -0
  44. package/dist/models/l402.js.map +1 -0
  45. package/dist/models/live-query-definition.d.ts +22 -0
  46. package/dist/models/live-query-definition.d.ts.map +1 -0
  47. package/dist/models/live-query-definition.js +2 -0
  48. package/dist/models/live-query-definition.js.map +1 -0
  49. package/dist/models/outbox-intent.d.ts +10 -0
  50. package/dist/models/outbox-intent.d.ts.map +1 -0
  51. package/dist/models/outbox-intent.js +2 -0
  52. package/dist/models/outbox-intent.js.map +1 -0
  53. package/dist/models/outbox.d.ts +50 -0
  54. package/dist/models/outbox.d.ts.map +1 -0
  55. package/dist/models/outbox.js +133 -0
  56. package/dist/models/outbox.js.map +1 -0
  57. package/dist/models/owner-views.d.ts +67 -0
  58. package/dist/models/owner-views.d.ts.map +1 -0
  59. package/dist/models/owner-views.js +7 -0
  60. package/dist/models/owner-views.js.map +1 -0
  61. package/dist/models/payment.d.ts +32 -0
  62. package/dist/models/payment.d.ts.map +1 -0
  63. package/dist/models/payment.js +3 -0
  64. package/dist/models/payment.js.map +1 -0
  65. package/dist/models/query-diff.d.ts +7 -0
  66. package/dist/models/query-diff.d.ts.map +1 -0
  67. package/dist/models/query-diff.js +2 -0
  68. package/dist/models/query-diff.js.map +1 -0
  69. package/dist/models/repository-write.d.ts +7 -0
  70. package/dist/models/repository-write.d.ts.map +1 -0
  71. package/dist/models/repository-write.js +2 -0
  72. package/dist/models/repository-write.js.map +1 -0
  73. package/dist/models/revisioned-commands.d.ts +24 -0
  74. package/dist/models/revisioned-commands.d.ts.map +1 -0
  75. package/dist/models/revisioned-commands.js +35 -0
  76. package/dist/models/revisioned-commands.js.map +1 -0
  77. package/dist/models/revisioned.d.ts +19 -0
  78. package/dist/models/revisioned.d.ts.map +1 -0
  79. package/dist/models/revisioned.js +2 -0
  80. package/dist/models/revisioned.js.map +1 -0
  81. package/dist/models/settings.d.ts +5 -0
  82. package/dist/models/settings.d.ts.map +1 -0
  83. package/dist/models/settings.js +2 -0
  84. package/dist/models/settings.js.map +1 -0
  85. package/dist/models/sync.d.ts +50 -0
  86. package/dist/models/sync.d.ts.map +1 -0
  87. package/dist/models/sync.js +2 -0
  88. package/dist/models/sync.js.map +1 -0
  89. package/dist/models/wallet.d.ts +52 -0
  90. package/dist/models/wallet.d.ts.map +1 -0
  91. package/dist/models/wallet.js +2 -0
  92. package/dist/models/wallet.js.map +1 -0
  93. package/dist/queries/conversations.d.ts +12 -0
  94. package/dist/queries/conversations.d.ts.map +1 -0
  95. package/dist/queries/conversations.js +59 -0
  96. package/dist/queries/conversations.js.map +1 -0
  97. package/dist/queries/notifications.d.ts +5 -0
  98. package/dist/queries/notifications.d.ts.map +1 -0
  99. package/dist/queries/notifications.js +27 -0
  100. package/dist/queries/notifications.js.map +1 -0
  101. package/dist/queries/revisioned.d.ts +17 -0
  102. package/dist/queries/revisioned.d.ts.map +1 -0
  103. package/dist/queries/revisioned.js +58 -0
  104. package/dist/queries/revisioned.js.map +1 -0
  105. package/dist/queries/wallet.d.ts +11 -0
  106. package/dist/queries/wallet.d.ts.map +1 -0
  107. package/dist/queries/wallet.js +42 -0
  108. package/dist/queries/wallet.js.map +1 -0
  109. package/dist/services/conversation-service.d.ts +42 -0
  110. package/dist/services/conversation-service.d.ts.map +1 -0
  111. package/dist/services/conversation-service.js +95 -0
  112. package/dist/services/conversation-service.js.map +1 -0
  113. package/dist/services/conversation-sync.d.ts +7 -0
  114. package/dist/services/conversation-sync.d.ts.map +1 -0
  115. package/dist/services/conversation-sync.js +9 -0
  116. package/dist/services/conversation-sync.js.map +1 -0
  117. package/dist/services/gossip-service.d.ts +18 -0
  118. package/dist/services/gossip-service.d.ts.map +1 -0
  119. package/dist/services/gossip-service.js +53 -0
  120. package/dist/services/gossip-service.js.map +1 -0
  121. package/dist/services/lan-candidate-refresh-service.d.ts +11 -0
  122. package/dist/services/lan-candidate-refresh-service.d.ts.map +1 -0
  123. package/dist/services/lan-candidate-refresh-service.js +32 -0
  124. package/dist/services/lan-candidate-refresh-service.js.map +1 -0
  125. package/dist/services/outbox-service.d.ts +47 -0
  126. package/dist/services/outbox-service.d.ts.map +1 -0
  127. package/dist/services/outbox-service.js +151 -0
  128. package/dist/services/outbox-service.js.map +1 -0
  129. package/dist/services/owner-view-service.d.ts +10 -0
  130. package/dist/services/owner-view-service.d.ts.map +1 -0
  131. package/dist/services/owner-view-service.js +21 -0
  132. package/dist/services/owner-view-service.js.map +1 -0
  133. package/dist/services/peer-directory-service.d.ts +26 -0
  134. package/dist/services/peer-directory-service.d.ts.map +1 -0
  135. package/dist/services/peer-directory-service.js +79 -0
  136. package/dist/services/peer-directory-service.js.map +1 -0
  137. package/dist/services/revisioned-domain-service.d.ts +46 -0
  138. package/dist/services/revisioned-domain-service.d.ts.map +1 -0
  139. package/dist/services/revisioned-domain-service.js +205 -0
  140. package/dist/services/revisioned-domain-service.js.map +1 -0
  141. package/dist/services/session-service.d.ts +10 -0
  142. package/dist/services/session-service.d.ts.map +1 -0
  143. package/dist/services/session-service.js +20 -0
  144. package/dist/services/session-service.js.map +1 -0
  145. package/dist/services/sync/authoritative-mirror.d.ts +24 -0
  146. package/dist/services/sync/authoritative-mirror.d.ts.map +1 -0
  147. package/dist/services/sync/authoritative-mirror.js +71 -0
  148. package/dist/services/sync/authoritative-mirror.js.map +1 -0
  149. package/dist/services/sync/index.d.ts +8 -0
  150. package/dist/services/sync/index.d.ts.map +1 -0
  151. package/dist/services/sync/index.js +4 -0
  152. package/dist/services/sync/index.js.map +1 -0
  153. package/dist/services/sync/log-sync.d.ts +12 -0
  154. package/dist/services/sync/log-sync.d.ts.map +1 -0
  155. package/dist/services/sync/log-sync.js +20 -0
  156. package/dist/services/sync/log-sync.js.map +1 -0
  157. package/dist/services/sync/revision-merge.d.ts +20 -0
  158. package/dist/services/sync/revision-merge.d.ts.map +1 -0
  159. package/dist/services/sync/revision-merge.js +46 -0
  160. package/dist/services/sync/revision-merge.js.map +1 -0
  161. package/dist/services/sync/strategy.d.ts +2 -0
  162. package/dist/services/sync/strategy.d.ts.map +1 -0
  163. package/dist/services/sync/strategy.js +2 -0
  164. package/dist/services/sync/strategy.js.map +1 -0
  165. package/dist/services/transport-manager.d.ts +22 -0
  166. package/dist/services/transport-manager.d.ts.map +1 -0
  167. package/dist/services/transport-manager.js +133 -0
  168. package/dist/services/transport-manager.js.map +1 -0
  169. package/dist/services/wallet-mirror-service.d.ts +46 -0
  170. package/dist/services/wallet-mirror-service.d.ts.map +1 -0
  171. package/dist/services/wallet-mirror-service.js +334 -0
  172. package/dist/services/wallet-mirror-service.js.map +1 -0
  173. package/package.json +56 -0
@@ -0,0 +1,133 @@
1
+ /** Fixed-priority home-node transport policy. Adapters own I/O; this class owns selection. */
2
+ export class TransportManager {
3
+ #candidates;
4
+ #dial;
5
+ #delay;
6
+ #priorityGraceMs;
7
+ #candidateTimeoutMs;
8
+ #now;
9
+ #onState;
10
+ #run;
11
+ #listeners = new Set();
12
+ #state = { changedAt: "1970-01-01T00:00:00.000Z", path: "offline", status: "offline" };
13
+ constructor(options) {
14
+ this.#candidates = [...options.candidates].sort((left, right) => priority(left.path) - priority(right.path));
15
+ this.#dial = options.dial;
16
+ this.#delay = options.delay;
17
+ this.#priorityGraceMs = Math.max(0, options.priorityGraceMs ?? 0);
18
+ this.#candidateTimeoutMs = Math.max(1, options.candidateTimeoutMs ?? 15_000);
19
+ this.#now = options.now ?? (() => new Date().toISOString());
20
+ this.#onState = options.onState ?? (() => undefined);
21
+ }
22
+ get state() { return this.#state; }
23
+ subscribe(listener) {
24
+ this.#listeners.add(listener);
25
+ return () => this.#listeners.delete(listener);
26
+ }
27
+ async connect() {
28
+ if (this.#run !== undefined)
29
+ return await this.#run;
30
+ const run = this.#connect();
31
+ this.#run = run;
32
+ try {
33
+ return await run;
34
+ }
35
+ finally {
36
+ if (this.#run === run)
37
+ this.#run = undefined;
38
+ }
39
+ }
40
+ markOffline() {
41
+ this.#setState({ changedAt: this.#now(), path: "offline", status: "offline" });
42
+ }
43
+ #connect() {
44
+ return (async () => {
45
+ const failures = [];
46
+ if (this.#priorityGraceMs === 0) {
47
+ for (const candidate of this.#candidates) {
48
+ const controller = new AbortController();
49
+ try {
50
+ const client = await this.#dialWithTimeout(candidate, controller);
51
+ this.#setState({ changedAt: this.#now(), path: candidate.path, status: "connected" });
52
+ return client;
53
+ }
54
+ catch (error) {
55
+ controller.abort();
56
+ failures.push(`${candidate.path}:${error instanceof Error ? error.message : "unavailable"}`);
57
+ }
58
+ }
59
+ this.markOffline();
60
+ throw new Error(`No home-node transport available (${failures.join(", ") || "no candidates"})`);
61
+ }
62
+ const active = [];
63
+ let nextCandidate = 0;
64
+ const start = (candidate) => {
65
+ const controller = new AbortController();
66
+ const promise = this.#dialWithTimeout(candidate, controller).catch((error) => {
67
+ failures.push(`${candidate.path}:${error instanceof Error ? error.message : "unavailable"}`);
68
+ throw error;
69
+ });
70
+ active.push({ candidate, controller, promise });
71
+ };
72
+ const firstCandidate = this.#candidates[0];
73
+ if (firstCandidate !== undefined) {
74
+ start(firstCandidate);
75
+ nextCandidate += 1;
76
+ }
77
+ while (active.length > 0) {
78
+ const lowerPriorityGate = nextCandidate < this.#candidates.length
79
+ ? this.#wait(this.#priorityGraceMs).then(() => ({ kind: "gate" }))
80
+ : undefined;
81
+ const result = await Promise.race([
82
+ ...active.map((attempt) => attempt.promise.then((client) => ({ kind: "success", attempt, client }), () => ({ kind: "failed", attempt }))),
83
+ ...(lowerPriorityGate === undefined ? [] : [lowerPriorityGate]),
84
+ ]);
85
+ if (result.kind === "gate") {
86
+ const candidate = this.#candidates[nextCandidate];
87
+ if (candidate !== undefined) {
88
+ start(candidate);
89
+ nextCandidate += 1;
90
+ }
91
+ continue;
92
+ }
93
+ const index = active.indexOf(result.attempt);
94
+ if (index >= 0)
95
+ active.splice(index, 1);
96
+ if (result.kind === "success") {
97
+ for (const attempt of active)
98
+ attempt.controller.abort();
99
+ this.#setState({ changedAt: this.#now(), path: result.attempt.candidate.path, status: "connected" });
100
+ return result.client;
101
+ }
102
+ }
103
+ this.markOffline();
104
+ throw new Error(`No home-node transport available (${failures.join(", ") || "no candidates"})`);
105
+ })();
106
+ }
107
+ async #dialWithTimeout(candidate, controller) {
108
+ if (this.#delay === undefined)
109
+ return await this.#dial(candidate, controller.signal);
110
+ const timeout = new Promise((_, reject) => {
111
+ void this.#delay.wait(this.#candidateTimeoutMs).then(() => {
112
+ controller.abort();
113
+ reject(new Error("candidate dial timed out"));
114
+ });
115
+ });
116
+ return await Promise.race([this.#dial(candidate, controller.signal), timeout]);
117
+ }
118
+ #wait(milliseconds) {
119
+ return this.#delay?.wait(milliseconds) ?? Promise.resolve();
120
+ }
121
+ #setState(next) {
122
+ if (this.#state.status === next.status && this.#state.path === next.path)
123
+ return;
124
+ this.#state = next;
125
+ this.#onState(next);
126
+ for (const listener of [...this.#listeners])
127
+ listener(next);
128
+ }
129
+ }
130
+ function priority(path) {
131
+ return path === "lan-direct" ? 0 : path === "wan-direct" ? 1 : 2;
132
+ }
133
+ //# sourceMappingURL=transport-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport-manager.js","sourceRoot":"","sources":["../../src/services/transport-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { HomeNodeClient, OutboxRepository } from "@econ-v1/ports";
2
+ import type { SyncDelta, SyncApplyResult } from "../models/sync.js";
3
+ import type { CreateInvoiceInput, PaymentHistoryView, PayInvoiceInput, WalletBalanceView, WalletMirrorRepository, WalletSnapshotPayload } from "../models/wallet.js";
4
+ import type { WalletCommandResult } from "../models/payment.js";
5
+ import type { L402HistoryView } from "../models/l402.js";
6
+ export declare class OfflineWalletCommandError extends Error {
7
+ constructor();
8
+ }
9
+ export declare class WalletFreshStateRequiredError extends Error {
10
+ constructor();
11
+ }
12
+ export declare class InsufficientWalletBalanceError extends Error {
13
+ readonly amountMsat: number;
14
+ readonly spendableMsat: number;
15
+ constructor(amountMsat: number, spendableMsat: number);
16
+ }
17
+ export declare class ExpiredInvoiceError extends Error {
18
+ constructor();
19
+ }
20
+ export declare class WalletCommandRejectedError extends Error {
21
+ constructor();
22
+ }
23
+ export interface WalletMirrorServiceOptions {
24
+ readonly id?: () => string;
25
+ readonly now?: () => string;
26
+ readonly staleAfterMs: number;
27
+ }
28
+ export declare class WalletMirrorService {
29
+ #private;
30
+ constructor(dependencies: {
31
+ readonly homeNode: HomeNodeClient;
32
+ readonly mirror: WalletMirrorRepository;
33
+ readonly outbox: OutboxRepository;
34
+ }, options: WalletMirrorServiceOptions);
35
+ applyDelta(delta: SyncDelta<WalletSnapshotPayload>): Promise<SyncApplyResult>;
36
+ readBalance(): Promise<WalletBalanceView>;
37
+ listPayments(): Promise<PaymentHistoryView>;
38
+ listL402Receipts(): Promise<L402HistoryView>;
39
+ createInvoice(input: CreateInvoiceInput): Promise<Extract<WalletCommandResult, {
40
+ readonly kind: "invoice-created";
41
+ }>>;
42
+ payInvoice(input: PayInvoiceInput): Promise<Extract<WalletCommandResult, {
43
+ readonly kind: "payment-submitted";
44
+ }>>;
45
+ }
46
+ //# sourceMappingURL=wallet-mirror-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-mirror-service.d.ts","sourceRoot":"","sources":["../../src/services/wallet-mirror-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAgB,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMrF,OAAO,KAAK,EAEV,SAAS,EACT,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EAEf,iBAAiB,EAEjB,sBAAsB,EACtB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,qBAAa,yBAA0B,SAAQ,KAAK;;CAKnD;AAED,qBAAa,6BAA8B,SAAQ,KAAK;;CAKvD;AAED,qBAAa,8BAA+B,SAAQ,KAAK;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAMtD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C;AAED,qBAAa,0BAA2B,SAAQ,KAAK;;CAKpD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,mBAAmB;;gBAS5B,YAAY,EAAE;QACZ,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;QAClC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;QACxC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;KACnC,EACD,OAAO,EAAE,0BAA0B;IAiB/B,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAI7E,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAYzC,YAAY,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAW3C,gBAAgB,IAAI,OAAO,CAAC,eAAe,CAAC;IAW5C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC,CAAC;IAYrH,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAA;KAAE,CAAC,CAAC;CA0GxH"}
@@ -0,0 +1,334 @@
1
+ import { AuthoritativeMirror, AuthoritativeRevalidationRequiredError, } from "./sync/index.js";
2
+ export class OfflineWalletCommandError extends Error {
3
+ constructor() {
4
+ super("Wallet commands require an online home node");
5
+ this.name = "OfflineWalletCommandError";
6
+ }
7
+ }
8
+ export class WalletFreshStateRequiredError extends Error {
9
+ constructor() {
10
+ super("Wallet state could not be freshly revalidated; confirm again when connected");
11
+ this.name = "WalletFreshStateRequiredError";
12
+ }
13
+ }
14
+ export class InsufficientWalletBalanceError extends Error {
15
+ amountMsat;
16
+ spendableMsat;
17
+ constructor(amountMsat, spendableMsat) {
18
+ super("The authoritative wallet balance is insufficient for this payment");
19
+ this.name = "InsufficientWalletBalanceError";
20
+ this.amountMsat = amountMsat;
21
+ this.spendableMsat = spendableMsat;
22
+ }
23
+ }
24
+ export class ExpiredInvoiceError extends Error {
25
+ constructor() {
26
+ super("The invoice has expired");
27
+ this.name = "ExpiredInvoiceError";
28
+ }
29
+ }
30
+ export class WalletCommandRejectedError extends Error {
31
+ constructor() {
32
+ super("The authoritative wallet command was rejected");
33
+ this.name = "WalletCommandRejectedError";
34
+ }
35
+ }
36
+ export class WalletMirrorService {
37
+ #id;
38
+ #mirror;
39
+ #now;
40
+ #outbox;
41
+ #strategy;
42
+ #homeNode;
43
+ constructor(dependencies, options) {
44
+ if (!Number.isInteger(options.staleAfterMs) || options.staleAfterMs <= 0) {
45
+ throw new RangeError("Wallet mirror staleAfterMs must be a positive integer");
46
+ }
47
+ this.#homeNode = dependencies.homeNode;
48
+ this.#mirror = dependencies.mirror;
49
+ this.#now = options.now ?? (() => new Date().toISOString());
50
+ this.#id = options.id ?? (() => `wallet:${this.#now()}`);
51
+ this.#outbox = dependencies.outbox;
52
+ this.#strategy = new AuthoritativeMirror({
53
+ apply: async (snapshot) => await this.#mirror.writeSnapshot(snapshot),
54
+ execute: async (command) => await this.#execute(command),
55
+ staleAfterMs: options.staleAfterMs,
56
+ });
57
+ }
58
+ async applyDelta(delta) {
59
+ return await this.#strategy.applyDelta(delta, { domain: "wallet", now: this.#now() });
60
+ }
61
+ async readBalance() {
62
+ const snapshot = await this.#mirror.readSnapshot();
63
+ if (snapshot === undefined)
64
+ return { freshness: "unavailable" };
65
+ return {
66
+ balanceMsat: snapshot.value.balanceMsat,
67
+ freshness: this.#isFresh(snapshot) ? "fresh" : "stale",
68
+ observedAt: snapshot.observedAt,
69
+ spendableMsat: snapshot.value.spendableMsat,
70
+ staleAt: snapshot.staleAt,
71
+ };
72
+ }
73
+ async listPayments() {
74
+ const snapshot = await this.#mirror.readSnapshot();
75
+ if (snapshot === undefined)
76
+ return { freshness: "unavailable", items: [] };
77
+ return {
78
+ freshness: this.#isFresh(snapshot) ? "fresh" : "stale",
79
+ items: snapshot.value.payments,
80
+ observedAt: snapshot.observedAt,
81
+ staleAt: snapshot.staleAt,
82
+ };
83
+ }
84
+ async listL402Receipts() {
85
+ const snapshot = await this.#mirror.readSnapshot();
86
+ if (snapshot === undefined)
87
+ return { freshness: "unavailable", items: [] };
88
+ return {
89
+ freshness: this.#isFresh(snapshot) ? "fresh" : "stale",
90
+ items: snapshot.value.l402,
91
+ observedAt: snapshot.observedAt,
92
+ staleAt: snapshot.staleAt,
93
+ };
94
+ }
95
+ async createInvoice(input) {
96
+ requirePositiveMsat(input.amountMsat, "invoice amount");
97
+ requireText(input.idempotencyKey, "invoice idempotency key");
98
+ return await this.#runCommand({
99
+ amountMsat: input.amountMsat,
100
+ ...(input.description === undefined ? {} : { description: input.description }),
101
+ kind: "create-invoice",
102
+ }, input.idempotencyKey, (snapshot) => {
103
+ if (snapshot.value.balanceMsat < 0)
104
+ throw new WalletFreshStateRequiredError();
105
+ });
106
+ }
107
+ async payInvoice(input) {
108
+ requirePositiveMsat(input.amountMsat, "payment amount");
109
+ requireText(input.idempotencyKey, "payment idempotency key");
110
+ requireText(input.invoiceId, "invoice id");
111
+ if (input.expiresAt !== undefined && isExpired(input.expiresAt, this.#now()))
112
+ throw new ExpiredInvoiceError();
113
+ return await this.#runCommand({
114
+ amountMsat: input.amountMsat,
115
+ ...(input.expiresAt === undefined ? {} : { expiresAt: input.expiresAt }),
116
+ invoiceId: input.invoiceId,
117
+ kind: "pay-invoice",
118
+ }, input.idempotencyKey, (snapshot) => {
119
+ if (input.amountMsat > snapshot.value.spendableMsat) {
120
+ throw new InsufficientWalletBalanceError(input.amountMsat, snapshot.value.spendableMsat);
121
+ }
122
+ });
123
+ }
124
+ async #runCommand(command, idempotencyKey, validate) {
125
+ const cached = await this.#mirror.readCommandResult(idempotencyKey);
126
+ if (cached !== undefined)
127
+ return cached;
128
+ this.#assertOnline();
129
+ const snapshot = await this.#ensureFresh();
130
+ validate(snapshot);
131
+ const outbox = this.#outboxRecord(command, idempotencyKey);
132
+ await this.#outbox.create(outbox);
133
+ try {
134
+ const result = await this.#strategy.runCommand({ idempotencyKey, payload: command }, {
135
+ now: this.#now(),
136
+ revalidate: async () => {
137
+ if (!this.#isOnline())
138
+ return false;
139
+ try {
140
+ const refreshed = await this.#ensureFresh();
141
+ validate(refreshed);
142
+ return true;
143
+ }
144
+ catch (error) {
145
+ if (error instanceof InsufficientWalletBalanceError)
146
+ throw error;
147
+ return false;
148
+ }
149
+ },
150
+ });
151
+ await this.#mirror.writeCommandResult(idempotencyKey, result);
152
+ await this.#outbox.updateState(outbox.id, "acknowledged");
153
+ return result;
154
+ }
155
+ catch (error) {
156
+ await this.#outbox.updateState(outbox.id, "failed");
157
+ if (error instanceof AuthoritativeRevalidationRequiredError)
158
+ throw new WalletFreshStateRequiredError();
159
+ if (error instanceof OfflineWalletCommandError || error instanceof InsufficientWalletBalanceError || error instanceof ExpiredInvoiceError)
160
+ throw error;
161
+ throw error instanceof WalletFreshStateRequiredError ? error : new WalletCommandRejectedError();
162
+ }
163
+ }
164
+ async #ensureFresh() {
165
+ const current = await this.#mirror.readSnapshot();
166
+ if (current !== undefined && this.#isFresh(current))
167
+ return current;
168
+ this.#assertOnline();
169
+ try {
170
+ const response = await this.#homeNode.invoke({ operation: "wallet.authoritative-snapshot", payload: {} });
171
+ const payload = parseSnapshotPayload(response);
172
+ await this.applyDelta({ cursor: `refresh:${this.#id()}`, id: this.#id(), payload });
173
+ }
174
+ catch (error) {
175
+ if (error instanceof OfflineWalletCommandError)
176
+ throw error;
177
+ throw new WalletFreshStateRequiredError();
178
+ }
179
+ const refreshed = await this.#mirror.readSnapshot();
180
+ if (refreshed === undefined || !this.#isFresh(refreshed))
181
+ throw new WalletFreshStateRequiredError();
182
+ return refreshed;
183
+ }
184
+ async #execute(command) {
185
+ this.#assertOnline();
186
+ try {
187
+ const response = await this.#homeNode.invoke({
188
+ operation: command.payload.kind === "create-invoice" ? "wallet.create-invoice" : "wallet.pay-invoice",
189
+ payload: { ...command.payload, idempotencyKey: command.idempotencyKey },
190
+ });
191
+ return command.payload.kind === "create-invoice"
192
+ ? parseInvoiceResult(response, command.payload.amountMsat)
193
+ : parsePaymentResult(response, command.payload.amountMsat);
194
+ }
195
+ catch (error) {
196
+ if (error instanceof OfflineWalletCommandError)
197
+ throw error;
198
+ throw new WalletCommandRejectedError();
199
+ }
200
+ }
201
+ #outboxRecord(command, idempotencyKey) {
202
+ const createdAt = this.#now();
203
+ return {
204
+ createdAt,
205
+ domain: "wallet",
206
+ id: `wallet:${idempotencyKey}`,
207
+ idempotencyKey,
208
+ payload: { ...command, operation: command.kind === "create-invoice" ? "wallet.create-invoice" : "wallet.pay-invoice" },
209
+ state: "pending",
210
+ updatedAt: createdAt,
211
+ };
212
+ }
213
+ #assertOnline() {
214
+ if (!this.#isOnline())
215
+ throw new OfflineWalletCommandError();
216
+ }
217
+ #isOnline() { return this.#homeNode.state.status === "connected"; }
218
+ #isFresh(snapshot) { return Date.parse(this.#now()) < Date.parse(snapshot.staleAt); }
219
+ }
220
+ function parseSnapshotPayload(value) {
221
+ const record = asRecord(value, "wallet snapshot");
222
+ return {
223
+ balanceMsat: positiveOrZero(record.balanceMsat, "wallet balance"),
224
+ l402: parseL402(record.l402),
225
+ payments: parsePayments(record.payments),
226
+ spendableMsat: positiveOrZero(record.spendableMsat, "wallet spendable balance"),
227
+ };
228
+ }
229
+ function parseInvoiceResult(value, amountMsat) {
230
+ const record = asRecord(value, "invoice result");
231
+ const invoiceId = text(record.invoiceId, "invoice id");
232
+ const paymentRequest = text(record.paymentRequest, "payment request");
233
+ return {
234
+ amountMsat: numberOrDefault(record.amountMsat, amountMsat),
235
+ ...(record.paymentHash === undefined ? {} : { paymentHash: text(record.paymentHash, "payment hash") }),
236
+ invoiceId,
237
+ kind: "invoice-created",
238
+ paymentRequest,
239
+ status: "created",
240
+ };
241
+ }
242
+ function parsePaymentResult(value, amountMsat) {
243
+ const record = asRecord(value, "payment result");
244
+ const status = record.status ?? "pending";
245
+ if (status !== "pending" && status !== "succeeded" && status !== "failed")
246
+ throw new WalletCommandRejectedError();
247
+ return {
248
+ amountMsat: numberOrDefault(record.amountMsat, amountMsat),
249
+ ...(record.paymentHash === undefined ? {} : { paymentHash: text(record.paymentHash, "payment hash") }),
250
+ kind: "payment-submitted",
251
+ paymentId: text(record.paymentId, "payment id"),
252
+ status,
253
+ };
254
+ }
255
+ function parsePayments(value) {
256
+ if (value === undefined)
257
+ return [];
258
+ if (!Array.isArray(value))
259
+ throw new WalletFreshStateRequiredError();
260
+ return value.map((item) => {
261
+ const record = asRecord(item, "payment record");
262
+ const direction = record.direction;
263
+ const status = record.status;
264
+ if (direction !== "incoming" && direction !== "outgoing")
265
+ throw new WalletFreshStateRequiredError();
266
+ if (status !== "pending" && status !== "succeeded" && status !== "failed" && status !== "expired")
267
+ throw new WalletFreshStateRequiredError();
268
+ return {
269
+ amountMsat: positiveOrZero(record.amountMsat, "payment amount"),
270
+ createdAt: timestamp(record.createdAt, "payment createdAt"),
271
+ direction,
272
+ ...(record.failureCode === undefined ? {} : { failureCode: text(record.failureCode, "payment failure code") }),
273
+ id: text(record.id, "payment id"),
274
+ ...(record.paymentHash === undefined ? {} : { paymentHash: text(record.paymentHash, "payment hash") }),
275
+ status,
276
+ updatedAt: timestamp(record.updatedAt, "payment updatedAt"),
277
+ };
278
+ });
279
+ }
280
+ function parseL402(value) {
281
+ if (value === undefined)
282
+ return [];
283
+ if (!Array.isArray(value))
284
+ throw new WalletFreshStateRequiredError();
285
+ return value.map((item) => {
286
+ const record = asRecord(item, "L402 receipt");
287
+ return {
288
+ amountMsat: positiveOrZero(record.amountMsat, "L402 amount"),
289
+ paidAt: timestamp(record.paidAt, "L402 paidAt"),
290
+ ...(record.paymentHash === undefined ? {} : { paymentHash: text(record.paymentHash, "L402 payment hash") }),
291
+ resource: text(record.resource, "L402 resource"),
292
+ receiptId: text(record.receiptId, "L402 receipt id"),
293
+ };
294
+ });
295
+ }
296
+ function asRecord(value, _label) {
297
+ if (value === null || typeof value !== "object" || Array.isArray(value))
298
+ throw new WalletFreshStateRequiredError();
299
+ return value;
300
+ }
301
+ function text(value, _label) {
302
+ if (typeof value !== "string" || value.trim() === "")
303
+ throw new WalletCommandRejectedError();
304
+ return value;
305
+ }
306
+ function timestamp(value, label) {
307
+ const parsed = text(value, label);
308
+ if (!Number.isFinite(Date.parse(parsed)))
309
+ throw new WalletFreshStateRequiredError();
310
+ return parsed;
311
+ }
312
+ function positiveOrZero(value, _label) {
313
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0)
314
+ throw new WalletFreshStateRequiredError();
315
+ return value;
316
+ }
317
+ function numberOrDefault(value, fallback) {
318
+ return value === undefined ? fallback : positiveOrZero(value, "amount");
319
+ }
320
+ function requirePositiveMsat(value, label) {
321
+ if (!Number.isSafeInteger(value) || value <= 0)
322
+ throw new TypeError(`${label} must be a positive integer`);
323
+ }
324
+ function requireText(value, label) {
325
+ if (value.trim() === "")
326
+ throw new TypeError(`${label} must be a non-empty string`);
327
+ }
328
+ function isExpired(expiresAt, now) {
329
+ const expiry = Date.parse(expiresAt);
330
+ if (!Number.isFinite(expiry))
331
+ throw new TypeError("invoice expiry must be an ISO timestamp");
332
+ return expiry <= Date.parse(now);
333
+ }
334
+ //# sourceMappingURL=wallet-mirror-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-mirror-service.js","sourceRoot":"","sources":["../../src/services/wallet-mirror-service.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@econ-v1/domain",
3
+ "version": "0.0.0",
4
+ "description": "Platform-neutral domain contracts and errors for Node clients",
5
+ "license": "MIT OR Apache-2.0",
6
+ "author": "Node contributors",
7
+ "homepage": "https://github.com/econ-v1/node",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/econ-v1/node.git",
11
+ "directory": "client/domain"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/econ-v1/node/issues"
15
+ },
16
+ "keywords": [
17
+ "node-client",
18
+ "domain",
19
+ "contracts",
20
+ "typescript"
21
+ ],
22
+ "type": "module",
23
+ "main": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "scripts": {
26
+ "build": "rm -rf dist && tsc -b --pretty false",
27
+ "lint": "eslint src",
28
+ "prepack": "npm run build",
29
+ "test": "vitest run --passWithNoTests",
30
+ "type-check": "tsc -b --pretty false"
31
+ },
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js",
36
+ "default": "./dist/index.js"
37
+ }
38
+ },
39
+ "files": [
40
+ "dist/**/*.d.ts",
41
+ "dist/**/*.d.ts.map",
42
+ "dist/**/*.js",
43
+ "dist/**/*.js.map",
44
+ "!dist/**/*.test.*"
45
+ ],
46
+ "sideEffects": false,
47
+ "engines": {
48
+ "node": ">=18"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public"
52
+ },
53
+ "dependencies": {
54
+ "@econ-v1/ports": "0.0.0"
55
+ }
56
+ }