@stellar-agent-services/provider-kit 0.0.0-stage → 0.1.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +506 -2
  3. package/dist/approve/assets/index-BazIJAI2.css +1 -0
  4. package/dist/approve/assets/index-CL28cSJy.js +420 -0
  5. package/dist/approve/favicon.svg +1 -0
  6. package/dist/approve/index.html +18 -0
  7. package/dist/cli/approval-view.d.ts +80 -0
  8. package/dist/cli/approval-view.d.ts.map +1 -0
  9. package/dist/cli/approval-view.js +5 -0
  10. package/dist/cli/approval-view.js.map +1 -0
  11. package/dist/cli/approval.d.ts +132 -0
  12. package/dist/cli/approval.d.ts.map +1 -0
  13. package/dist/cli/approval.js +542 -0
  14. package/dist/cli/approval.js.map +1 -0
  15. package/dist/cli/check.d.ts +3 -0
  16. package/dist/cli/check.d.ts.map +1 -0
  17. package/dist/cli/check.js +137 -0
  18. package/dist/cli/check.js.map +1 -0
  19. package/dist/cli/dev-account.d.ts +28 -0
  20. package/dist/cli/dev-account.d.ts.map +1 -0
  21. package/dist/cli/dev-account.js +62 -0
  22. package/dist/cli/dev-account.js.map +1 -0
  23. package/dist/cli/dev.d.ts +27 -0
  24. package/dist/cli/dev.d.ts.map +1 -0
  25. package/dist/cli/dev.js +226 -0
  26. package/dist/cli/dev.js.map +1 -0
  27. package/dist/cli/discovery.d.ts +20 -0
  28. package/dist/cli/discovery.d.ts.map +1 -0
  29. package/dist/cli/discovery.js +202 -0
  30. package/dist/cli/discovery.js.map +1 -0
  31. package/dist/cli/env-file.d.ts +16 -0
  32. package/dist/cli/env-file.d.ts.map +1 -0
  33. package/dist/cli/env-file.js +77 -0
  34. package/dist/cli/env-file.js.map +1 -0
  35. package/dist/cli/fly.d.ts +28 -0
  36. package/dist/cli/fly.d.ts.map +1 -0
  37. package/dist/cli/fly.js +92 -0
  38. package/dist/cli/fly.js.map +1 -0
  39. package/dist/cli/index.d.ts +3 -0
  40. package/dist/cli/index.d.ts.map +1 -0
  41. package/dist/cli/index.js +11 -0
  42. package/dist/cli/index.js.map +1 -0
  43. package/dist/cli/init.d.ts +3 -0
  44. package/dist/cli/init.d.ts.map +1 -0
  45. package/dist/cli/init.js +170 -0
  46. package/dist/cli/init.js.map +1 -0
  47. package/dist/cli/launch.d.ts +21 -0
  48. package/dist/cli/launch.d.ts.map +1 -0
  49. package/dist/cli/launch.js +627 -0
  50. package/dist/cli/launch.js.map +1 -0
  51. package/dist/cli/main.d.ts +2 -0
  52. package/dist/cli/main.d.ts.map +1 -0
  53. package/dist/cli/main.js +158 -0
  54. package/dist/cli/main.js.map +1 -0
  55. package/dist/cli/owner-chain.d.ts +88 -0
  56. package/dist/cli/owner-chain.d.ts.map +1 -0
  57. package/dist/cli/owner-chain.js +284 -0
  58. package/dist/cli/owner-chain.js.map +1 -0
  59. package/dist/cli/owner-steps.d.ts +33 -0
  60. package/dist/cli/owner-steps.d.ts.map +1 -0
  61. package/dist/cli/owner-steps.js +121 -0
  62. package/dist/cli/owner-steps.js.map +1 -0
  63. package/dist/cli/processes.d.ts +47 -0
  64. package/dist/cli/processes.d.ts.map +1 -0
  65. package/dist/cli/processes.js +129 -0
  66. package/dist/cli/processes.js.map +1 -0
  67. package/dist/cli/reconcile.d.ts +3 -0
  68. package/dist/cli/reconcile.d.ts.map +1 -0
  69. package/dist/cli/reconcile.js +76 -0
  70. package/dist/cli/reconcile.js.map +1 -0
  71. package/dist/cli/register.d.ts +9 -0
  72. package/dist/cli/register.d.ts.map +1 -0
  73. package/dist/cli/register.js +209 -0
  74. package/dist/cli/register.js.map +1 -0
  75. package/dist/cli/request-validation.d.ts +5 -0
  76. package/dist/cli/request-validation.d.ts.map +1 -0
  77. package/dist/cli/request-validation.js +144 -0
  78. package/dist/cli/request-validation.js.map +1 -0
  79. package/dist/cli/serve.d.ts +25 -0
  80. package/dist/cli/serve.d.ts.map +1 -0
  81. package/dist/cli/serve.js +73 -0
  82. package/dist/cli/serve.js.map +1 -0
  83. package/dist/cli/shared.d.ts +142 -0
  84. package/dist/cli/shared.d.ts.map +1 -0
  85. package/dist/cli/shared.js +110 -0
  86. package/dist/cli/shared.js.map +1 -0
  87. package/dist/cli/status.d.ts +32 -0
  88. package/dist/cli/status.d.ts.map +1 -0
  89. package/dist/cli/status.js +248 -0
  90. package/dist/cli/status.js.map +1 -0
  91. package/dist/cli/target.d.ts +14 -0
  92. package/dist/cli/target.d.ts.map +1 -0
  93. package/dist/cli/target.js +43 -0
  94. package/dist/cli/target.js.map +1 -0
  95. package/dist/cli/trustline.d.ts +3 -0
  96. package/dist/cli/trustline.d.ts.map +1 -0
  97. package/dist/cli/trustline.js +114 -0
  98. package/dist/cli/trustline.js.map +1 -0
  99. package/dist/cli/try.d.ts +54 -0
  100. package/dist/cli/try.d.ts.map +1 -0
  101. package/dist/cli/try.js +448 -0
  102. package/dist/cli/try.js.map +1 -0
  103. package/dist/cli/tunnel.d.ts +13 -0
  104. package/dist/cli/tunnel.d.ts.map +1 -0
  105. package/dist/cli/tunnel.js +43 -0
  106. package/dist/cli/tunnel.js.map +1 -0
  107. package/dist/cli/validators.d.ts +6 -0
  108. package/dist/cli/validators.d.ts.map +1 -0
  109. package/dist/cli/validators.js +14 -0
  110. package/dist/cli/validators.js.map +1 -0
  111. package/dist/define-service.d.ts +71 -0
  112. package/dist/define-service.d.ts.map +1 -0
  113. package/dist/define-service.js +86 -0
  114. package/dist/define-service.js.map +1 -0
  115. package/dist/gateway/config.d.ts +88 -0
  116. package/dist/gateway/config.d.ts.map +1 -0
  117. package/dist/gateway/config.js +201 -0
  118. package/dist/gateway/config.js.map +1 -0
  119. package/dist/gateway/openapi.d.ts +69 -0
  120. package/dist/gateway/openapi.d.ts.map +1 -0
  121. package/dist/gateway/openapi.js +677 -0
  122. package/dist/gateway/openapi.js.map +1 -0
  123. package/dist/gateway/upstream.d.ts +15 -0
  124. package/dist/gateway/upstream.d.ts.map +1 -0
  125. package/dist/gateway/upstream.js +95 -0
  126. package/dist/gateway/upstream.js.map +1 -0
  127. package/dist/http/bounded.d.ts +3 -0
  128. package/dist/http/bounded.d.ts.map +1 -0
  129. package/dist/http/bounded.js +23 -0
  130. package/dist/http/bounded.js.map +1 -0
  131. package/dist/http/node-server.d.ts +15 -0
  132. package/dist/http/node-server.d.ts.map +1 -0
  133. package/dist/http/node-server.js +120 -0
  134. package/dist/http/node-server.js.map +1 -0
  135. package/dist/http/rate-limit.d.ts +11 -0
  136. package/dist/http/rate-limit.d.ts.map +1 -0
  137. package/dist/http/rate-limit.js +35 -0
  138. package/dist/http/rate-limit.js.map +1 -0
  139. package/dist/http/router.d.ts +29 -0
  140. package/dist/http/router.d.ts.map +1 -0
  141. package/dist/http/router.js +329 -0
  142. package/dist/http/router.js.map +1 -0
  143. package/dist/index.d.ts +20 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +31 -0
  146. package/dist/index.js.map +1 -0
  147. package/dist/jobs/memory-store.d.ts +3 -0
  148. package/dist/jobs/memory-store.d.ts.map +1 -0
  149. package/dist/jobs/memory-store.js +121 -0
  150. package/dist/jobs/memory-store.js.map +1 -0
  151. package/dist/jobs/reconcile.d.ts +22 -0
  152. package/dist/jobs/reconcile.d.ts.map +1 -0
  153. package/dist/jobs/reconcile.js +82 -0
  154. package/dist/jobs/reconcile.js.map +1 -0
  155. package/dist/jobs/recovery.d.ts +19 -0
  156. package/dist/jobs/recovery.d.ts.map +1 -0
  157. package/dist/jobs/recovery.js +65 -0
  158. package/dist/jobs/recovery.js.map +1 -0
  159. package/dist/jobs/runner.d.ts +38 -0
  160. package/dist/jobs/runner.d.ts.map +1 -0
  161. package/dist/jobs/runner.js +194 -0
  162. package/dist/jobs/runner.js.map +1 -0
  163. package/dist/jobs/scheduler.d.ts +66 -0
  164. package/dist/jobs/scheduler.d.ts.map +1 -0
  165. package/dist/jobs/scheduler.js +197 -0
  166. package/dist/jobs/scheduler.js.map +1 -0
  167. package/dist/jobs/sqlite-store.d.ts +8 -0
  168. package/dist/jobs/sqlite-store.d.ts.map +1 -0
  169. package/dist/jobs/sqlite-store.js +231 -0
  170. package/dist/jobs/sqlite-store.js.map +1 -0
  171. package/dist/jobs/store.d.ts +118 -0
  172. package/dist/jobs/store.d.ts.map +1 -0
  173. package/dist/jobs/store.js +36 -0
  174. package/dist/jobs/store.js.map +1 -0
  175. package/dist/manifest.d.ts +11 -0
  176. package/dist/manifest.d.ts.map +1 -0
  177. package/dist/manifest.js +99 -0
  178. package/dist/manifest.js.map +1 -0
  179. package/dist/payments/chain.d.ts +23 -0
  180. package/dist/payments/chain.d.ts.map +1 -0
  181. package/dist/payments/chain.js +108 -0
  182. package/dist/payments/chain.js.map +1 -0
  183. package/dist/payments/facilitator.d.ts +44 -0
  184. package/dist/payments/facilitator.d.ts.map +1 -0
  185. package/dist/payments/facilitator.js +125 -0
  186. package/dist/payments/facilitator.js.map +1 -0
  187. package/dist/payments/onchain.d.ts +36 -0
  188. package/dist/payments/onchain.d.ts.map +1 -0
  189. package/dist/payments/onchain.js +191 -0
  190. package/dist/payments/onchain.js.map +1 -0
  191. package/dist/payments/payload-checks.d.ts +22 -0
  192. package/dist/payments/payload-checks.d.ts.map +1 -0
  193. package/dist/payments/payload-checks.js +113 -0
  194. package/dist/payments/payload-checks.js.map +1 -0
  195. package/dist/payments/settlement.d.ts +22 -0
  196. package/dist/payments/settlement.d.ts.map +1 -0
  197. package/dist/payments/settlement.js +65 -0
  198. package/dist/payments/settlement.js.map +1 -0
  199. package/dist/payments/x402-server.d.ts +8 -0
  200. package/dist/payments/x402-server.d.ts.map +1 -0
  201. package/dist/payments/x402-server.js +74 -0
  202. package/dist/payments/x402-server.js.map +1 -0
  203. package/dist/provider.d.ts +63 -0
  204. package/dist/provider.d.ts.map +1 -0
  205. package/dist/provider.js +177 -0
  206. package/dist/provider.js.map +1 -0
  207. package/dist/registration.d.ts +86 -0
  208. package/dist/registration.d.ts.map +1 -0
  209. package/dist/registration.js +162 -0
  210. package/dist/registration.js.map +1 -0
  211. package/dist/testing.d.ts +13 -0
  212. package/dist/testing.d.ts.map +1 -0
  213. package/dist/testing.js +48 -0
  214. package/dist/testing.js.map +1 -0
  215. package/dist/validation-request.d.ts +36 -0
  216. package/dist/validation-request.d.ts.map +1 -0
  217. package/dist/validation-request.js +101 -0
  218. package/dist/validation-request.js.map +1 -0
  219. package/package.json +55 -4
  220. package/schemas/gateway-config.schema.json +140 -0
@@ -0,0 +1,542 @@
1
+ // Approving the owner's transactions in a browser wallet: how `provider-kit trustline`, `register` and
2
+ // `request-validation` sign without --source. The developer connects the wallet they already use (through
3
+ // Stellar Wallets Kit: Freighter, xBull, Albedo, Ledger and more) on a page provider-kit serves on this
4
+ // computer, reviews each transaction there and approves it in the wallet. No key reaches provider-kit, and the
5
+ // Stellar CLI isn't needed.
6
+ //
7
+ // - ApprovalSession runs one command's steps in order. It builds each transaction only when it is due (a
8
+ // fresh sequence number and simulation), sends only what verifySigned() accepts, and stops for good when
9
+ // a transaction's fate is unknown, so nothing is ever sent twice.
10
+ // - startApprovalServer() serves the page (approve/, built into dist/approve) and the session's JSON API on
11
+ // 127.0.0.1 only, like a native app's loopback redirect (RFC 8252). The API needs the session's token,
12
+ // which reaches the page only in the link's fragment, and refuses other Host and Origin headers, so
13
+ // neither another site nor DNS rebinding can drive it.
14
+ // - approveInBrowser() is what the commands call: it starts both, opens the link and waits for the end.
15
+ import { spawn } from "node:child_process";
16
+ import { randomBytes, timingSafeEqual } from "node:crypto";
17
+ import { existsSync } from "node:fs";
18
+ import { readFile } from "node:fs/promises";
19
+ import { createServer } from "node:http";
20
+ import { extname } from "node:path";
21
+ import { stellarAddressKind } from "@stellar-agent-services/protocol";
22
+ import { ApprovalError, explorerUrl, formatXlm, networkName, verifySigned } from "./owner-chain.js";
23
+ export { ApprovalError };
24
+ /** A request the session can't take now, such as an approval for a step that isn't due. The page reloads the view. */
25
+ export class ApprovalConflict extends Error {
26
+ name = "ApprovalConflict";
27
+ }
28
+ /** One command's approval: its steps, run in order as the developer connects a wallet and approves. */
29
+ export class ApprovalSession {
30
+ plan;
31
+ chain;
32
+ log;
33
+ finished;
34
+ #resolve;
35
+ #state = "connect";
36
+ #steps = [];
37
+ #connected;
38
+ #review;
39
+ #activity = "";
40
+ #error;
41
+ #result;
42
+ #busy = false;
43
+ #cancelling = false;
44
+ constructor(plan, chain, log = () => { }) {
45
+ this.plan = plan;
46
+ this.chain = chain;
47
+ this.log = log;
48
+ this.finished = new Promise((resolve) => (this.#resolve = resolve));
49
+ }
50
+ get state() {
51
+ return this.#state;
52
+ }
53
+ /** Whether a request is under way, such as a check, a build or a transaction being sent. */
54
+ get busy() {
55
+ return this.#busy;
56
+ }
57
+ view() {
58
+ const { plan } = this;
59
+ const steps = this.#steps.length === 0
60
+ ? plan.outline.map(({ id, title }) => ({ id, title, status: "pending" }))
61
+ : this.#steps.map(({ step, status, note, hash }) => ({
62
+ id: step.id,
63
+ title: step.title,
64
+ status,
65
+ ...(note === undefined ? {} : { note }),
66
+ ...(hash === undefined ? {} : { transaction: { hash, url: explorerUrl(plan.network, "tx", hash) } }),
67
+ }));
68
+ const review = this.#state === "review" && this.#review !== undefined ? reviewOf(this.#review.record, this.#review.proposal) : undefined;
69
+ return {
70
+ command: plan.command,
71
+ title: plan.title,
72
+ intro: plan.intro,
73
+ network: { id: plan.network, name: networkName(plan.network), passphrase: this.chain.passphrase },
74
+ ...(plan.account === undefined ? {} : { account: plan.account }),
75
+ ...(this.#connected === undefined ? {} : { connected: this.#connected }),
76
+ state: this.#state,
77
+ ...(this.#state === "working" ? { activity: this.#activity } : {}),
78
+ steps,
79
+ ...(review === undefined ? {} : { review }),
80
+ ...(this.#error === undefined ? {} : { error: this.#error }),
81
+ ...(this.#result === undefined ? {} : { result: this.#result }),
82
+ };
83
+ }
84
+ /** The wallet connected `address`: checks it, then runs the steps up to the first transaction to approve. */
85
+ async connect(address, wallet) {
86
+ await this.#exclusive(["connect"], async () => {
87
+ if (stellarAddressKind(address) !== "account") {
88
+ throw new ApprovalError("Connect a Stellar account", "The wallet gave an address that isn't an account. Connect one whose address starts with G.", "connect");
89
+ }
90
+ this.#working("Checking the account");
91
+ const steps = await this.plan.steps(address);
92
+ this.#connected = { address, ...(wallet === undefined || wallet === "" ? {} : { wallet }) };
93
+ this.#steps = steps.map((step) => ({ step, status: "pending" }));
94
+ this.log(` ✓ Connected ${address}${wallet === undefined || wallet === "" ? "" : ` (${wallet})`}`);
95
+ await this.#advance();
96
+ });
97
+ }
98
+ /** The wallet signed the transaction waiting for approval: checks it is that very transaction, sends it and moves on. */
99
+ async submit(stepId, signedXdr) {
100
+ await this.#exclusive(["review"], async () => {
101
+ const current = this.#review;
102
+ if (current === undefined || current.record.step.id !== stepId || current.record.step.kind !== "sign") {
103
+ throw new ApprovalConflict("That transaction isn't waiting for approval anymore.");
104
+ }
105
+ const { record, proposal } = current;
106
+ const step = current.record.step;
107
+ const signed = verifySigned(proposal.transaction, signedXdr, this.#connected.address, this.plan.network, this.chain.passphrase);
108
+ this.#review = undefined;
109
+ this.#working(`Sending to ${networkName(this.plan.network)}`);
110
+ const sent = await this.chain.send(signed);
111
+ if (sent.status === "unknown") {
112
+ this.#stop(`${step.title} was sent, but it isn't confirmed: ${sent.reason}. Look the transaction up before trying again.`, {
113
+ label: `${step.title}, not confirmed`,
114
+ hash: sent.hash,
115
+ });
116
+ return;
117
+ }
118
+ if (sent.status === "failed")
119
+ throw new ApprovalError(`${step.title} didn't go through`, `${sent.reason} Review it and approve again.`, "rebuild");
120
+ record.hash = sent.hash;
121
+ try {
122
+ record.note = await step.done(sent);
123
+ }
124
+ catch (error) {
125
+ // It is on chain: building it again would do it twice.
126
+ this.#stop(`${step.title} went through, but its result can't be read: ${error.message}.`, { label: step.title, hash: sent.hash });
127
+ return;
128
+ }
129
+ record.status = "done";
130
+ this.log(` ✓ ${step.title}: ${record.note} · ${explorerUrl(this.plan.network, "tx", sent.hash)}`);
131
+ await this.#advance();
132
+ });
133
+ }
134
+ /** Builds the transaction waiting for approval again: after it expired, or after the network refused it. */
135
+ async rebuild(stepId) {
136
+ await this.#exclusive(["review"], async () => {
137
+ const record = this.#steps.find((each) => each.status === "active");
138
+ if (record === undefined || record.step.id !== stepId || record.step.kind !== "sign")
139
+ throw new ApprovalConflict("That step isn't the one waiting for approval.");
140
+ this.#working("Preparing the transaction");
141
+ this.#review = { record, proposal: await record.step.build() };
142
+ this.#state = "review";
143
+ });
144
+ }
145
+ /**
146
+ * Ends the session before it is done. While a request is under way, such as a transaction being sent, it is
147
+ * refused, or with `whenIdle` the session ends as soon as that request finishes.
148
+ */
149
+ cancel(whenIdle = false) {
150
+ if (isFinal(this.#state))
151
+ throw new ApprovalConflict("The session has ended.");
152
+ if (this.#busy) {
153
+ if (!whenIdle)
154
+ throw new ApprovalConflict("The session is busy. Wait a moment.");
155
+ this.#cancelling = true;
156
+ return;
157
+ }
158
+ const signed = this.#steps.some((record) => record.hash !== undefined);
159
+ this.#result = { title: "Cancelled", message: signed ? "Nothing else was signed. What you approved before stays on chain." : "Nothing was signed.", details: [] };
160
+ this.log(" ✗ Cancelled");
161
+ this.#finish({ status: "cancelled" }, "cancelled");
162
+ }
163
+ /** Ends a session left idle. A session in the middle of something carries on. */
164
+ expire() {
165
+ if (this.#busy || isFinal(this.#state))
166
+ return;
167
+ this.#result = { title: "This page timed out", message: "Run the command again in your terminal for a new link.", details: [] };
168
+ this.#finish({ status: "expired" }, "cancelled");
169
+ }
170
+ async #advance() {
171
+ for (const record of this.#steps) {
172
+ if (record.status === "done")
173
+ continue;
174
+ record.status = "active";
175
+ const { step } = record;
176
+ if (step.kind === "auto") {
177
+ this.#working(step.title);
178
+ record.note = await step.run();
179
+ record.status = "done";
180
+ this.log(` ✓ ${step.title}: ${record.note}`);
181
+ continue;
182
+ }
183
+ this.#working("Preparing the transaction");
184
+ this.#review = { record, proposal: await step.build() };
185
+ this.#state = "review";
186
+ return;
187
+ }
188
+ this.#result = this.plan.result();
189
+ this.#finish({ status: "done", address: this.#connected.address }, "done");
190
+ }
191
+ /** Runs one request at a time, in the states that take it. An ApprovalError becomes the page's error. */
192
+ async #exclusive(states, action) {
193
+ if (this.#busy)
194
+ throw new ApprovalConflict("The session is busy. Wait a moment.");
195
+ if (!states.includes(this.#state))
196
+ throw new ApprovalConflict(`The session is in the ${this.#state} state.`);
197
+ this.#busy = true;
198
+ this.#error = undefined;
199
+ try {
200
+ await action();
201
+ }
202
+ catch (error) {
203
+ if (error instanceof ApprovalConflict)
204
+ throw error;
205
+ this.#fail(error);
206
+ }
207
+ finally {
208
+ this.#busy = false;
209
+ if (this.#cancelling && !isFinal(this.#state))
210
+ this.cancel();
211
+ }
212
+ }
213
+ #fail(error) {
214
+ // Anything unexpected, such as an RPC outage, is shown as it is. Connecting again starts over from what is on chain.
215
+ const problem = error instanceof ApprovalError ? error : new ApprovalError("Something went wrong", error instanceof Error ? error.message : String(error), "connect");
216
+ this.#error = { title: problem.title, message: problem.message, retry: problem.retry };
217
+ this.log(` ! ${problem.title}: ${problem.message}`);
218
+ if (problem.retry === "none") {
219
+ this.#stop(problem.message);
220
+ }
221
+ else if (problem.retry === "connect") {
222
+ this.#state = "connect";
223
+ this.#connected = undefined;
224
+ this.#steps = [];
225
+ this.#review = undefined;
226
+ }
227
+ else {
228
+ this.#state = "review";
229
+ this.#review = undefined;
230
+ }
231
+ }
232
+ /** Stops for good: the page says why, and nothing more is sent. `transaction` is the one whose fate is in question. */
233
+ #stop(reason, transaction) {
234
+ const url = transaction === undefined ? undefined : explorerUrl(this.plan.network, "tx", transaction.hash);
235
+ const details = transaction === undefined ? [] : [{ label: transaction.label, value: transaction.hash, mono: true, href: url }];
236
+ this.#error = undefined;
237
+ this.#result = { title: "Stopped", message: reason, details };
238
+ this.log(` ✗ ${reason}${url === undefined ? "" : ` ${url}`}`);
239
+ this.#finish({ status: "failed", reason }, "failed");
240
+ }
241
+ #working(activity) {
242
+ this.#state = "working";
243
+ this.#activity = activity;
244
+ }
245
+ #finish(outcome, state) {
246
+ this.#state = state;
247
+ this.#review = undefined;
248
+ this.#error = undefined;
249
+ this.#resolve(outcome);
250
+ }
251
+ }
252
+ function isFinal(state) {
253
+ return state === "done" || state === "failed" || state === "cancelled";
254
+ }
255
+ function reviewOf(record, proposal) {
256
+ const { transaction } = proposal;
257
+ return {
258
+ stepId: record.step.id,
259
+ title: record.step.title,
260
+ summary: proposal.summary,
261
+ details: proposal.details,
262
+ xdr: transaction.toXDR(),
263
+ hash: transaction.hash().toString("hex"),
264
+ maxFee: formatXlm(transaction.fee),
265
+ expiresAt: Number(transaction.timeBounds?.maxTime ?? 0) * 1000,
266
+ };
267
+ }
268
+ /** What the terminal says when a session ends without finishing. */
269
+ export function describeOutcome(outcome) {
270
+ switch (outcome.status) {
271
+ case "cancelled":
272
+ return "Cancelled. Nothing more was signed.";
273
+ case "expired":
274
+ return "The approval page timed out. Run the command again for a new link.";
275
+ case "failed":
276
+ return `Stopped. ${outcome.reason}`;
277
+ }
278
+ }
279
+ // ---------------------------------------------------------------------------------------------------------
280
+ // The local page and its API.
281
+ /** The built page: dist/approve, next to dist/cli. */
282
+ export const APPROVAL_PAGE = new URL("../approve/", import.meta.url);
283
+ /** The page's port. A fixed one lets wallets remember that they connected to it before; a busy one falls back to any free port. */
284
+ export const DEFAULT_APPROVAL_PORT = 8790;
285
+ /** A session left alone this long ends. */
286
+ const IDLE_MS = 15 * 60_000;
287
+ /** The largest request body: a signed registration with an 8 KiB data: URI is about 12 KiB. */
288
+ const MAX_BODY_BYTES = 256 * 1024;
289
+ const CONTENT_TYPES = {
290
+ ".html": "text/html; charset=utf-8",
291
+ ".js": "text/javascript; charset=utf-8",
292
+ ".css": "text/css; charset=utf-8",
293
+ ".svg": "image/svg+xml",
294
+ ".png": "image/png",
295
+ ".woff2": "font/woff2",
296
+ };
297
+ /**
298
+ * The page runs only its own scripts. Wallet modules open their makers' popups, may call their services and
299
+ * show icons from their sites, so frames, connections and images may use HTTPS. None of that can change what
300
+ * is sent: verifySigned() checks the signed transaction here.
301
+ */
302
+ const CONTENT_SECURITY_POLICY = [
303
+ "default-src 'none'",
304
+ "script-src 'self'",
305
+ // The wallet picker styles itself at runtime.
306
+ "style-src 'self' 'unsafe-inline'",
307
+ "img-src 'self' data: https:",
308
+ "font-src 'self' data:",
309
+ "connect-src 'self' https: wss:",
310
+ "frame-src https:",
311
+ "base-uri 'none'",
312
+ "form-action 'none'",
313
+ "frame-ancestors 'none'",
314
+ ].join("; ");
315
+ const SECURITY_HEADERS = {
316
+ "Cache-Control": "no-store",
317
+ "Content-Security-Policy": CONTENT_SECURITY_POLICY,
318
+ // Wallet popups (Albedo, xBull) answer through window.opener.
319
+ "Cross-Origin-Opener-Policy": "same-origin-allow-popups",
320
+ "Cross-Origin-Resource-Policy": "same-origin",
321
+ // USB and HID for hardware wallets.
322
+ "Permissions-Policy": "camera=(), microphone=(), geolocation=(), usb=(self), hid=(self)",
323
+ "Referrer-Policy": "no-referrer",
324
+ "X-Content-Type-Options": "nosniff",
325
+ "X-Frame-Options": "DENY",
326
+ };
327
+ export async function startApprovalServer(session, options = {}) {
328
+ const token = randomBytes(32).toString("base64url");
329
+ const expected = Buffer.from(`Bearer ${token}`);
330
+ const page = options.page ?? APPROVAL_PAGE;
331
+ let port = 0;
332
+ let idle;
333
+ const touch = () => {
334
+ clearTimeout(idle);
335
+ // A session in the middle of something is left to finish it, then looked at again.
336
+ const fire = () => {
337
+ if (session.busy)
338
+ idle = setTimeout(fire, 60_000).unref();
339
+ else
340
+ session.expire();
341
+ };
342
+ idle = setTimeout(fire, options.idleMs ?? IDLE_MS).unref();
343
+ };
344
+ const server = createServer((request, response) => {
345
+ void handle(request, response).catch((error) => {
346
+ if (!response.headersSent)
347
+ json(response, 500, { message: error instanceof Error ? error.message : String(error) });
348
+ else
349
+ response.end();
350
+ });
351
+ });
352
+ async function handle(request, response) {
353
+ // DNS rebinding: a page on another name that resolves here gets nothing.
354
+ if (![`127.0.0.1:${port}`, `localhost:${port}`].includes(request.headers.host ?? "")) {
355
+ response.writeHead(403, { ...SECURITY_HEADERS, "Content-Type": "text/plain; charset=utf-8" }).end("Forbidden");
356
+ return;
357
+ }
358
+ const path = new URL(request.url ?? "/", `http://127.0.0.1:${port}`).pathname;
359
+ if (path.startsWith("/api/"))
360
+ return api(request, response, path);
361
+ if (request.method !== "GET" && request.method !== "HEAD") {
362
+ response.writeHead(405, { ...SECURITY_HEADERS, Allow: "GET, HEAD" }).end();
363
+ return;
364
+ }
365
+ return asset(request, response, path);
366
+ }
367
+ async function api(request, response, path) {
368
+ const origin = request.headers.origin;
369
+ const site = request.headers["sec-fetch-site"];
370
+ if ((origin !== undefined && origin !== `http://127.0.0.1:${port}` && origin !== `http://localhost:${port}`) || (site !== undefined && site !== "same-origin")) {
371
+ return json(response, 403, { message: "Requests from other sites are refused." });
372
+ }
373
+ const given = Buffer.from(request.headers.authorization ?? "");
374
+ if (given.length !== expected.length || !timingSafeEqual(given, expected)) {
375
+ return json(response, 401, { message: "This link isn't valid anymore. Run the command again for a new one." });
376
+ }
377
+ touch();
378
+ if (path === "/api/session" && request.method === "GET")
379
+ return json(response, 200, session.view());
380
+ if (request.method !== "POST")
381
+ return json(response, 405, { message: "Use POST." });
382
+ if (!(request.headers["content-type"] ?? "").startsWith("application/json"))
383
+ return json(response, 415, { message: "Send JSON." });
384
+ let body;
385
+ try {
386
+ body = await readJson(request);
387
+ }
388
+ catch (error) {
389
+ return json(response, error.status ?? 400, { message: error.message });
390
+ }
391
+ const text = (field) => {
392
+ const value = body[field];
393
+ if (typeof value !== "string" || value === "")
394
+ throw new ApprovalConflict(`${field} is missing.`);
395
+ return value;
396
+ };
397
+ try {
398
+ switch (path) {
399
+ case "/api/connect":
400
+ await session.connect(text("address"), typeof body["wallet"] === "string" ? body["wallet"].slice(0, 64) : undefined);
401
+ break;
402
+ case "/api/submit":
403
+ await session.submit(text("stepId"), text("signedTxXdr"));
404
+ break;
405
+ case "/api/rebuild":
406
+ await session.rebuild(text("stepId"));
407
+ break;
408
+ case "/api/cancel":
409
+ session.cancel();
410
+ break;
411
+ default:
412
+ return json(response, 404, { message: "Not found." });
413
+ }
414
+ }
415
+ catch (error) {
416
+ if (error instanceof ApprovalConflict)
417
+ return json(response, 409, { message: error.message, view: session.view() });
418
+ throw error;
419
+ }
420
+ return json(response, 200, session.view());
421
+ }
422
+ async function asset(request, response, path) {
423
+ const file = path === "/" ? "index.html" : path.slice(1);
424
+ const type = CONTENT_TYPES[extname(file)];
425
+ // Only the built page's own files: no dot segments, hidden files or other types.
426
+ let body;
427
+ if (type !== undefined && /^[\w-]+(?:\.[\w-]+)*(?:\/[\w-]+(?:\.[\w-]+)*)*$/.test(file)) {
428
+ body = await readFile(new URL(file, page)).catch(() => undefined);
429
+ }
430
+ if (body === undefined) {
431
+ response.writeHead(404, { ...SECURITY_HEADERS, "Content-Type": "text/plain; charset=utf-8" }).end("Not found");
432
+ return;
433
+ }
434
+ response.writeHead(200, { ...SECURITY_HEADERS, "Content-Type": type, "Content-Length": body.length });
435
+ response.end(request.method === "HEAD" ? undefined : body);
436
+ }
437
+ port = await listenOn(server, options.port ?? DEFAULT_APPROVAL_PORT).catch((error) => {
438
+ if (error.code === "EADDRINUSE" && options.port === undefined)
439
+ return listenOn(server, 0);
440
+ throw error.code === "EADDRINUSE" ? new Error(`port ${options.port} is in use: pick another with --port`) : error;
441
+ });
442
+ touch();
443
+ return {
444
+ // Wallets treat localhost as a trusted development origin; browsers reach it on 127.0.0.1.
445
+ url: `http://localhost:${port}/#${token}`,
446
+ port,
447
+ close: () => new Promise((resolve) => {
448
+ clearTimeout(idle);
449
+ server.close(() => resolve());
450
+ server.closeIdleConnections();
451
+ setTimeout(() => server.closeAllConnections(), 2000).unref();
452
+ }),
453
+ };
454
+ }
455
+ function listenOn(server, port) {
456
+ return new Promise((resolve, reject) => {
457
+ server.once("error", reject);
458
+ server.listen(port, "127.0.0.1", () => {
459
+ server.off("error", reject);
460
+ resolve(server.address().port);
461
+ });
462
+ });
463
+ }
464
+ function json(response, status, value) {
465
+ response.writeHead(status, { ...SECURITY_HEADERS, "Content-Type": "application/json; charset=utf-8" }).end(JSON.stringify(value));
466
+ }
467
+ async function readJson(request) {
468
+ const chunks = [];
469
+ let size = 0;
470
+ // A body over the limit is read to its end but not kept, so the answer reaches the page.
471
+ for await (const chunk of request) {
472
+ size += chunk.length;
473
+ if (size <= MAX_BODY_BYTES)
474
+ chunks.push(chunk);
475
+ }
476
+ if (size > MAX_BODY_BYTES)
477
+ throw Object.assign(new Error("The request is too large."), { status: 413 });
478
+ let value;
479
+ try {
480
+ value = JSON.parse(Buffer.concat(chunks).toString("utf8"));
481
+ }
482
+ catch {
483
+ throw Object.assign(new Error("The request isn't JSON."), { status: 400 });
484
+ }
485
+ if (typeof value !== "object" || value === null || Array.isArray(value))
486
+ throw Object.assign(new Error("The request isn't a JSON object."), { status: 400 });
487
+ return value;
488
+ }
489
+ /** Opens `url` in the default browser. Best effort: the terminal shows the link too. */
490
+ export function openBrowser(url) {
491
+ const [command, args] = process.platform === "darwin" ? ["open", [url]] : process.platform === "win32" ? ["cmd", ["/c", "start", "", url]] : ["xdg-open", [url]];
492
+ try {
493
+ const child = spawn(command, args, { stdio: "ignore", detached: true });
494
+ child.on("error", () => { });
495
+ child.unref();
496
+ }
497
+ catch {
498
+ // The link is printed: the developer can open it.
499
+ }
500
+ }
501
+ /** Opens the approval page for `plan` and waits until the developer finishes or cancels. */
502
+ export async function approveInBrowser(plan, chain, options = {}) {
503
+ const log = options.log ?? ((line) => console.log(line));
504
+ const page = options.page ?? APPROVAL_PAGE;
505
+ if (!existsSync(new URL("index.html", page))) {
506
+ throw new Error("the approval page is not built: run `npm run build` in the stellar-agent-services repository, or sign with the Stellar CLI (--source <key>)");
507
+ }
508
+ const session = new ApprovalSession(plan, chain, log);
509
+ const server = await startApprovalServer(session, { page, ...(options.port === undefined ? {} : { port: options.port }) });
510
+ log("");
511
+ log("Approve in your wallet");
512
+ log(` ${server.url}`);
513
+ if (options.open !== false) {
514
+ openBrowser(server.url);
515
+ log(" Your browser opens this page. If it doesn't, open the link in the browser that has your wallet.");
516
+ }
517
+ else {
518
+ log(" Open the link in the browser that has your wallet.");
519
+ }
520
+ if (plan.account !== undefined)
521
+ log(` Connect ${plan.account.address} (${plan.account.label.toLowerCase()}).`);
522
+ log(" Waiting for your approval. Ctrl+C cancels.");
523
+ log("");
524
+ let interrupts = 0;
525
+ const interrupt = () => {
526
+ interrupts += 1;
527
+ if (interrupts > 1)
528
+ process.exit(130);
529
+ if (session.busy)
530
+ log(" Cancelling once the step under way finishes. Press Ctrl+C again to quit anyway.");
531
+ session.cancel(true);
532
+ };
533
+ process.on("SIGINT", interrupt);
534
+ try {
535
+ return await session.finished;
536
+ }
537
+ finally {
538
+ process.off("SIGINT", interrupt);
539
+ await server.close();
540
+ }
541
+ }
542
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../src/cli/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type CliFlags } from "./shared.js";
2
+ export declare function check(flags: CliFlags): Promise<number>;
3
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/cli/check.ts"],"names":[],"mappings":"AAeA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMrE,wBAAsB,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAoF5D"}