@daski/pay 0.3.1 → 0.4.1

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 (101) hide show
  1. package/README.md +18 -11
  2. package/dist/bin/daski.js +26 -11
  3. package/dist/bin/daski.js.map +1 -1
  4. package/dist/chain/reader.d.ts +92 -0
  5. package/dist/chain/reader.d.ts.map +1 -0
  6. package/dist/chain/reader.js +130 -0
  7. package/dist/chain/reader.js.map +1 -0
  8. package/dist/commands/approval.js +2 -2
  9. package/dist/commands/approval.js.map +1 -1
  10. package/dist/commands/buy.d.ts +0 -1
  11. package/dist/commands/buy.d.ts.map +1 -1
  12. package/dist/commands/buy.js +15 -22
  13. package/dist/commands/buy.js.map +1 -1
  14. package/dist/commands/confirmation.d.ts +322 -4
  15. package/dist/commands/confirmation.d.ts.map +1 -1
  16. package/dist/commands/confirmation.js +771 -60
  17. package/dist/commands/confirmation.js.map +1 -1
  18. package/dist/commands/doctor.d.ts +20 -0
  19. package/dist/commands/doctor.d.ts.map +1 -1
  20. package/dist/commands/doctor.js +204 -59
  21. package/dist/commands/doctor.js.map +1 -1
  22. package/dist/commands/order.d.ts +37 -6
  23. package/dist/commands/order.d.ts.map +1 -1
  24. package/dist/commands/order.js +181 -103
  25. package/dist/commands/order.js.map +1 -1
  26. package/dist/commands/signPayment.d.ts.map +1 -1
  27. package/dist/commands/signPayment.js +8 -3
  28. package/dist/commands/signPayment.js.map +1 -1
  29. package/dist/commands/wallet.d.ts +3 -0
  30. package/dist/commands/wallet.d.ts.map +1 -1
  31. package/dist/commands/wallet.js +72 -16
  32. package/dist/commands/wallet.js.map +1 -1
  33. package/dist/config.d.ts +10 -2
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +41 -1
  36. package/dist/config.js.map +1 -1
  37. package/dist/context.d.ts +28 -3
  38. package/dist/context.d.ts.map +1 -1
  39. package/dist/context.js +72 -3
  40. package/dist/context.js.map +1 -1
  41. package/dist/gateway/client.d.ts +20 -17
  42. package/dist/gateway/client.d.ts.map +1 -1
  43. package/dist/gateway/client.js +62 -43
  44. package/dist/gateway/client.js.map +1 -1
  45. package/dist/gateway/lifecycle.d.ts +4 -1
  46. package/dist/gateway/lifecycle.d.ts.map +1 -1
  47. package/dist/gateway/lifecycle.js +10 -5
  48. package/dist/gateway/lifecycle.js.map +1 -1
  49. package/dist/gateway/metadata.d.ts +66 -0
  50. package/dist/gateway/metadata.d.ts.map +1 -0
  51. package/dist/gateway/metadata.js +152 -0
  52. package/dist/gateway/metadata.js.map +1 -0
  53. package/dist/gateway/purchase.d.ts +51 -67
  54. package/dist/gateway/purchase.d.ts.map +1 -1
  55. package/dist/gateway/purchase.js +153 -125
  56. package/dist/gateway/purchase.js.map +1 -1
  57. package/dist/host.d.ts +41 -0
  58. package/dist/host.d.ts.map +1 -0
  59. package/dist/host.js +112 -0
  60. package/dist/host.js.map +1 -0
  61. package/dist/index.d.ts +12 -6
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +10 -4
  64. package/dist/index.js.map +1 -1
  65. package/dist/signers/circleAgent.d.ts +37 -0
  66. package/dist/signers/circleAgent.d.ts.map +1 -0
  67. package/dist/signers/circleAgent.js +244 -0
  68. package/dist/signers/circleAgent.js.map +1 -0
  69. package/dist/signers/contract.d.ts +34 -0
  70. package/dist/signers/contract.d.ts.map +1 -0
  71. package/dist/signers/contract.js +47 -0
  72. package/dist/signers/contract.js.map +1 -0
  73. package/dist/signers/index.d.ts +16 -7
  74. package/dist/signers/index.d.ts.map +1 -1
  75. package/dist/signers/index.js +7 -3
  76. package/dist/signers/index.js.map +1 -1
  77. package/dist/signers/local.d.ts +5 -1
  78. package/dist/signers/local.d.ts.map +1 -1
  79. package/dist/signers/local.js +16 -3
  80. package/dist/signers/local.js.map +1 -1
  81. package/dist/signers/selfTest.d.ts +32 -12
  82. package/dist/signers/selfTest.d.ts.map +1 -1
  83. package/dist/signers/selfTest.js +85 -12
  84. package/dist/signers/selfTest.js.map +1 -1
  85. package/dist/signers/signature.d.ts +10 -0
  86. package/dist/signers/signature.d.ts.map +1 -0
  87. package/dist/signers/signature.js +11 -0
  88. package/dist/signers/signature.js.map +1 -0
  89. package/dist/store/keystore.d.ts +48 -6
  90. package/dist/store/keystore.d.ts.map +1 -1
  91. package/dist/store/keystore.js +414 -110
  92. package/dist/store/keystore.js.map +1 -1
  93. package/dist/store/lock.d.ts +59 -0
  94. package/dist/store/lock.d.ts.map +1 -0
  95. package/dist/store/lock.js +269 -0
  96. package/dist/store/lock.js.map +1 -0
  97. package/dist/store/orders.d.ts +49 -9
  98. package/dist/store/orders.d.ts.map +1 -1
  99. package/dist/store/orders.js +173 -37
  100. package/dist/store/orders.js.map +1 -1
  101. package/package.json +2 -2
@@ -10,27 +10,133 @@
10
10
  * the signature goes out, so an interrupted buy can be looked up instead of
11
11
  * re-signed.
12
12
  */
13
- import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
13
+ import { randomBytes } from "node:crypto";
14
+ import { closeSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, rmSync, writeSync, } from "node:fs";
14
15
  import { dirname } from "node:path";
16
+ import { CliError } from "../cli/errors.js";
15
17
  import { ordersPath } from "../paths.js";
18
+ import { withFileLock, withFileLockSync } from "./lock.js";
19
+ const DOC = "https://github.com/daski-io/buyer/blob/main/docs/config.md";
20
+ function storeUnreadable(path, reason) {
21
+ return new CliError({
22
+ code: "DASKI_ORDER_STORE_UNREADABLE",
23
+ message: `The order store ${path} exists but cannot be read: ${reason}.`,
24
+ remediation: "An unreadable order store is never treated as empty: it holds recorded intents, order " +
25
+ "handles, budgets, and pending confirmation journals, and writing over it would lose them. " +
26
+ `Repair ${path}, or move it aside and rebuild it with daski order import --json, then re-run. ` +
27
+ `See ${DOC}`,
28
+ });
29
+ }
30
+ /** The fields every command reads before it can trust a record; the amount feeds the budget total. */
31
+ function isOrderRecord(value) {
32
+ if (!value || typeof value !== "object" || Array.isArray(value))
33
+ return false;
34
+ const record = value;
35
+ return typeof record.intentId === "string" && typeof record.profile === "string" &&
36
+ typeof record.state === "string" && typeof record.amount === "string" && /^\d+$/.test(record.amount);
37
+ }
38
+ /**
39
+ * Reads the store. A missing file (or a missing state directory) is an empty
40
+ * ledger; anything else that stops the file being read, parsed, or trusted is
41
+ * `DASKI_ORDER_STORE_UNREADABLE`. Every write path reads first, so an
42
+ * unreadable store is refused before a temporary file could be renamed over it.
43
+ */
16
44
  function read() {
45
+ const path = ordersPath();
46
+ let raw;
47
+ try {
48
+ raw = readFileSync(path, "utf8");
49
+ }
50
+ catch (error) {
51
+ if (error.code === "ENOENT")
52
+ return { version: 1, orders: [] };
53
+ throw storeUnreadable(path, error.message);
54
+ }
55
+ let parsed;
56
+ try {
57
+ parsed = JSON.parse(raw);
58
+ }
59
+ catch (error) {
60
+ throw storeUnreadable(path, `not valid JSON (${error.message})`);
61
+ }
62
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
63
+ throw storeUnreadable(path, "the document is not an object");
64
+ }
65
+ const file = parsed;
66
+ if (file.version !== 1)
67
+ throw storeUnreadable(path, `unsupported version ${String(file.version)}`);
68
+ if (!Array.isArray(file.orders))
69
+ throw storeUnreadable(path, "orders is not an array");
70
+ file.orders.forEach((order, index) => {
71
+ if (!isOrderRecord(order))
72
+ throw storeUnreadable(path, `order ${index} is malformed`);
73
+ });
74
+ return file;
75
+ }
76
+ /** How long a whole-file update waits for another process's update. */
77
+ const STORE_LOCK_WAIT_MS = 10_000;
78
+ /**
79
+ * Every read-modify-write of the whole file runs under one store-wide lock:
80
+ * the file holds every order, so two commands updating different orders
81
+ * would otherwise read the same version and the later rename would drop the
82
+ * earlier order's update. The rename only protects against truncation.
83
+ */
84
+ function withStoreLock(run) {
85
+ const lock = `${ordersPath()}.lock`;
86
+ return withFileLockSync(lock, {
87
+ waitMs: STORE_LOCK_WAIT_MS,
88
+ locked: (reason) => new CliError({
89
+ code: "DASKI_ORDER_STORE_LOCKED",
90
+ message: reason === "orphaned"
91
+ ? "A daski process died while recovering the order store lock."
92
+ : "Another daski command is updating the order store.",
93
+ remediation: reason === "orphaned"
94
+ ? `If no daski process is running, remove ${lock} and ${lock}.reclaim, then re-run.`
95
+ : "Wait for it to finish, then re-run. If no daski process is running, remove the " +
96
+ "stale orders.json.lock file.",
97
+ }),
98
+ }, run);
99
+ }
100
+ function fsyncDirectory(directory) {
101
+ // Windows cannot open a directory handle for fsync; the rename is still atomic there.
102
+ if (process.platform === "win32")
103
+ return;
104
+ const fd = openSync(directory, "r");
17
105
  try {
18
- const parsed = JSON.parse(readFileSync(ordersPath(), "utf8"));
19
- if (parsed.version !== 1 || !Array.isArray(parsed.orders))
20
- throw new Error("shape");
21
- return parsed;
106
+ fsyncSync(fd);
22
107
  }
23
- catch {
24
- return { version: 1, orders: [] };
108
+ finally {
109
+ closeSync(fd);
25
110
  }
26
111
  }
27
- /** Writes via a temp file and rename, so a crash cannot truncate the store. */
112
+ /**
113
+ * Replaces the store atomically: an owner-only temporary file beside the
114
+ * target, flushed, renamed over the target, then the directory flushed. A
115
+ * crash or power loss at any point leaves either the previous file or the
116
+ * new one, never a truncated mixture and never a rename that was not yet
117
+ * durable.
118
+ */
28
119
  function write(file) {
29
120
  const path = ordersPath();
30
- mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
31
- const temporary = `${path}.${process.pid}.tmp`;
32
- writeFileSync(temporary, `${JSON.stringify(file, null, 2)}\n`, { mode: 0o600 });
33
- renameSync(temporary, path);
121
+ const directory = dirname(path);
122
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
123
+ const temporary = `${path}.${process.pid}.${randomBytes(4).toString("hex")}.tmp`;
124
+ const fd = openSync(temporary, "wx", 0o600);
125
+ try {
126
+ writeSync(fd, `${JSON.stringify(file, null, 2)}\n`);
127
+ fsyncSync(fd);
128
+ }
129
+ finally {
130
+ closeSync(fd);
131
+ }
132
+ try {
133
+ renameSync(temporary, path);
134
+ }
135
+ catch (error) {
136
+ rmSync(temporary, { force: true });
137
+ throw error;
138
+ }
139
+ fsyncDirectory(directory);
34
140
  }
35
141
  export function listOrders(profile) {
36
142
  const orders = read().orders;
@@ -45,33 +151,63 @@ export function findByIntent(intentId) {
45
151
  }
46
152
  /** Inserts or updates by intent id. The intent id is the stable key. */
47
153
  export function upsertOrder(record) {
48
- const file = read();
49
- const now = new Date().toISOString();
50
- const index = file.orders.findIndex((order) => order.intentId === record.intentId);
51
- const merged = { ...record, updatedAt: now };
52
- if (index >= 0) {
53
- merged.createdAt = file.orders[index].createdAt;
54
- file.orders[index] = merged;
55
- }
56
- else {
57
- file.orders.push(merged);
58
- }
59
- write(file);
60
- return merged;
154
+ return withStoreLock(() => {
155
+ const file = read();
156
+ const now = new Date().toISOString();
157
+ const index = file.orders.findIndex((order) => order.intentId === record.intentId);
158
+ const merged = { ...record, updatedAt: now };
159
+ if (index >= 0) {
160
+ merged.createdAt = file.orders[index].createdAt;
161
+ file.orders[index] = merged;
162
+ }
163
+ else {
164
+ file.orders.push(merged);
165
+ }
166
+ write(file);
167
+ return merged;
168
+ });
61
169
  }
62
170
  export function updateOrder(intentId, changes) {
63
- const file = read();
64
- const index = file.orders.findIndex((order) => order.intentId === intentId);
65
- if (index < 0)
66
- return undefined;
67
- const merged = {
68
- ...file.orders[index],
69
- ...changes,
70
- updatedAt: new Date().toISOString(),
71
- };
72
- file.orders[index] = merged;
73
- write(file);
74
- return merged;
171
+ return withStoreLock(() => {
172
+ const file = read();
173
+ const index = file.orders.findIndex((order) => order.intentId === intentId);
174
+ if (index < 0)
175
+ return undefined;
176
+ const merged = {
177
+ ...file.orders[index],
178
+ ...changes,
179
+ updatedAt: new Date().toISOString(),
180
+ };
181
+ file.orders[index] = merged;
182
+ write(file);
183
+ return merged;
184
+ });
185
+ }
186
+ /** How long a command waits for another live process's work on the same order. */
187
+ const ORDER_LOCK_WAIT_MS = 10_000;
188
+ /**
189
+ * Serializes one order's confirmation journal across processes. The
190
+ * read-check-write of a preparation spans gateway and chain calls; without
191
+ * the lock two preparations both find nothing pending and the later write
192
+ * drops the earlier validated call's tracking. The lock is reclaimed only
193
+ * when its owner is gone, never by age: the owner may be waiting on a person.
194
+ */
195
+ export function withOrderLock(intentId, run) {
196
+ const name = intentId.replace(/[^A-Za-z0-9._-]/g, "_");
197
+ const lock = `${ordersPath()}.${name}.lock`;
198
+ return withFileLock(lock, {
199
+ waitMs: ORDER_LOCK_WAIT_MS,
200
+ locked: (reason) => new CliError({
201
+ code: "DASKI_ORDER_LOCKED",
202
+ message: reason === "orphaned"
203
+ ? "A daski process died while recovering this order's lock."
204
+ : "Another daski command is updating this order's confirmation record.",
205
+ remediation: reason === "orphaned"
206
+ ? `If no daski process is running, remove ${lock} and ${lock}.reclaim, then re-run.`
207
+ : "Wait for it to finish, then re-run. If no daski process is running, remove the " +
208
+ "stale .lock file next to orders.json.",
209
+ }),
210
+ }, run);
75
211
  }
76
212
  /** States under which no USDC was authorized, or the gateway says none settled. */
77
213
  const UNSPENT_STATES = new Set(["INTENT_RECORDED", "NOT_SETTLED"]);
@@ -1 +1 @@
1
- {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/store/orders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../src/store/orders.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daski/pay",
3
- "version": "0.3.1",
3
+ "version": "0.4.1",
4
4
  "description": "The Daski buyer bridge CLI. Server proposes, the bridge validates and recomputes, the wallet signs, the gateway never sees the key.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -44,7 +44,7 @@
44
44
  "prepublishOnly": "npm run build"
45
45
  },
46
46
  "dependencies": {
47
- "@daski/x402-scheme": "0.3.1",
47
+ "@daski/x402-scheme": "0.4.1",
48
48
  "@modelcontextprotocol/sdk": "1.30.0",
49
49
  "@x402/core": "2.24.0",
50
50
  "viem": "2.21.55"