@claw-network/node 0.2.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 (190) hide show
  1. package/README.md +49 -0
  2. package/dist/api/api-key-store.d.ts +74 -0
  3. package/dist/api/api-key-store.d.ts.map +1 -0
  4. package/dist/api/api-key-store.js +170 -0
  5. package/dist/api/api-key-store.js.map +1 -0
  6. package/dist/api/auth.d.ts +30 -0
  7. package/dist/api/auth.d.ts.map +1 -0
  8. package/dist/api/auth.js +115 -0
  9. package/dist/api/auth.js.map +1 -0
  10. package/dist/api/legacy.d.ts +26 -0
  11. package/dist/api/legacy.d.ts.map +1 -0
  12. package/dist/api/legacy.js +281 -0
  13. package/dist/api/legacy.js.map +1 -0
  14. package/dist/api/middleware.d.ts +35 -0
  15. package/dist/api/middleware.d.ts.map +1 -0
  16. package/dist/api/middleware.js +75 -0
  17. package/dist/api/middleware.js.map +1 -0
  18. package/dist/api/response.d.ts +85 -0
  19. package/dist/api/response.d.ts.map +1 -0
  20. package/dist/api/response.js +185 -0
  21. package/dist/api/response.js.map +1 -0
  22. package/dist/api/router.d.ts +45 -0
  23. package/dist/api/router.d.ts.map +1 -0
  24. package/dist/api/router.js +183 -0
  25. package/dist/api/router.js.map +1 -0
  26. package/dist/api/routes/admin.d.ts +11 -0
  27. package/dist/api/routes/admin.d.ts.map +1 -0
  28. package/dist/api/routes/admin.js +124 -0
  29. package/dist/api/routes/admin.js.map +1 -0
  30. package/dist/api/routes/contracts.d.ts +7 -0
  31. package/dist/api/routes/contracts.d.ts.map +1 -0
  32. package/dist/api/routes/contracts.js +665 -0
  33. package/dist/api/routes/contracts.js.map +1 -0
  34. package/dist/api/routes/dao.d.ts +7 -0
  35. package/dist/api/routes/dao.d.ts.map +1 -0
  36. package/dist/api/routes/dao.js +549 -0
  37. package/dist/api/routes/dao.js.map +1 -0
  38. package/dist/api/routes/dev.d.ts +9 -0
  39. package/dist/api/routes/dev.d.ts.map +1 -0
  40. package/dist/api/routes/dev.js +273 -0
  41. package/dist/api/routes/dev.js.map +1 -0
  42. package/dist/api/routes/escrows.d.ts +7 -0
  43. package/dist/api/routes/escrows.d.ts.map +1 -0
  44. package/dist/api/routes/escrows.js +454 -0
  45. package/dist/api/routes/escrows.js.map +1 -0
  46. package/dist/api/routes/identities.d.ts +7 -0
  47. package/dist/api/routes/identities.d.ts.map +1 -0
  48. package/dist/api/routes/identities.js +245 -0
  49. package/dist/api/routes/identities.js.map +1 -0
  50. package/dist/api/routes/markets-capabilities.d.ts +7 -0
  51. package/dist/api/routes/markets-capabilities.d.ts.map +1 -0
  52. package/dist/api/routes/markets-capabilities.js +477 -0
  53. package/dist/api/routes/markets-capabilities.js.map +1 -0
  54. package/dist/api/routes/markets-disputes.d.ts +7 -0
  55. package/dist/api/routes/markets-disputes.d.ts.map +1 -0
  56. package/dist/api/routes/markets-disputes.js +102 -0
  57. package/dist/api/routes/markets-disputes.js.map +1 -0
  58. package/dist/api/routes/markets-info.d.ts +7 -0
  59. package/dist/api/routes/markets-info.d.ts.map +1 -0
  60. package/dist/api/routes/markets-info.js +523 -0
  61. package/dist/api/routes/markets-info.js.map +1 -0
  62. package/dist/api/routes/markets-search.d.ts +7 -0
  63. package/dist/api/routes/markets-search.d.ts.map +1 -0
  64. package/dist/api/routes/markets-search.js +38 -0
  65. package/dist/api/routes/markets-search.js.map +1 -0
  66. package/dist/api/routes/markets-tasks.d.ts +7 -0
  67. package/dist/api/routes/markets-tasks.d.ts.map +1 -0
  68. package/dist/api/routes/markets-tasks.js +539 -0
  69. package/dist/api/routes/markets-tasks.js.map +1 -0
  70. package/dist/api/routes/node.d.ts +7 -0
  71. package/dist/api/routes/node.d.ts.map +1 -0
  72. package/dist/api/routes/node.js +53 -0
  73. package/dist/api/routes/node.js.map +1 -0
  74. package/dist/api/routes/nonce.d.ts +10 -0
  75. package/dist/api/routes/nonce.d.ts.map +1 -0
  76. package/dist/api/routes/nonce.js +65 -0
  77. package/dist/api/routes/nonce.js.map +1 -0
  78. package/dist/api/routes/reputations.d.ts +7 -0
  79. package/dist/api/routes/reputations.d.ts.map +1 -0
  80. package/dist/api/routes/reputations.js +243 -0
  81. package/dist/api/routes/reputations.js.map +1 -0
  82. package/dist/api/routes/transfers.d.ts +7 -0
  83. package/dist/api/routes/transfers.d.ts.map +1 -0
  84. package/dist/api/routes/transfers.js +88 -0
  85. package/dist/api/routes/transfers.js.map +1 -0
  86. package/dist/api/routes/wallets.d.ts +7 -0
  87. package/dist/api/routes/wallets.d.ts.map +1 -0
  88. package/dist/api/routes/wallets.js +132 -0
  89. package/dist/api/routes/wallets.js.map +1 -0
  90. package/dist/api/schemas/common.d.ts +45 -0
  91. package/dist/api/schemas/common.d.ts.map +1 -0
  92. package/dist/api/schemas/common.js +30 -0
  93. package/dist/api/schemas/common.js.map +1 -0
  94. package/dist/api/schemas/contracts.d.ts +284 -0
  95. package/dist/api/schemas/contracts.d.ts.map +1 -0
  96. package/dist/api/schemas/contracts.js +79 -0
  97. package/dist/api/schemas/contracts.js.map +1 -0
  98. package/dist/api/schemas/dao.d.ts +271 -0
  99. package/dist/api/schemas/dao.d.ts.map +1 -0
  100. package/dist/api/schemas/dao.js +78 -0
  101. package/dist/api/schemas/dao.js.map +1 -0
  102. package/dist/api/schemas/identity.d.ts +75 -0
  103. package/dist/api/schemas/identity.d.ts.map +1 -0
  104. package/dist/api/schemas/identity.js +32 -0
  105. package/dist/api/schemas/identity.js.map +1 -0
  106. package/dist/api/schemas/markets.d.ts +822 -0
  107. package/dist/api/schemas/markets.d.ts.map +1 -0
  108. package/dist/api/schemas/markets.js +246 -0
  109. package/dist/api/schemas/markets.js.map +1 -0
  110. package/dist/api/schemas/wallet.d.ts +163 -0
  111. package/dist/api/schemas/wallet.d.ts.map +1 -0
  112. package/dist/api/schemas/wallet.js +54 -0
  113. package/dist/api/schemas/wallet.js.map +1 -0
  114. package/dist/api/server.d.ts +45 -0
  115. package/dist/api/server.d.ts.map +1 -0
  116. package/dist/api/server.js +131 -0
  117. package/dist/api/server.js.map +1 -0
  118. package/dist/api/types.d.ts +69 -0
  119. package/dist/api/types.d.ts.map +1 -0
  120. package/dist/api/types.js +196 -0
  121. package/dist/api/types.js.map +1 -0
  122. package/dist/daemon.d.ts +11 -0
  123. package/dist/daemon.d.ts.map +1 -0
  124. package/dist/daemon.js +248 -0
  125. package/dist/daemon.js.map +1 -0
  126. package/dist/index.d.ts +137 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +795 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/indexer/index.d.ts +10 -0
  131. package/dist/indexer/index.d.ts.map +1 -0
  132. package/dist/indexer/index.js +7 -0
  133. package/dist/indexer/index.js.map +1 -0
  134. package/dist/indexer/indexer.d.ts +60 -0
  135. package/dist/indexer/indexer.d.ts.map +1 -0
  136. package/dist/indexer/indexer.js +408 -0
  137. package/dist/indexer/indexer.js.map +1 -0
  138. package/dist/indexer/query.d.ts +141 -0
  139. package/dist/indexer/query.d.ts.map +1 -0
  140. package/dist/indexer/query.js +244 -0
  141. package/dist/indexer/query.js.map +1 -0
  142. package/dist/indexer/store.d.ts +95 -0
  143. package/dist/indexer/store.d.ts.map +1 -0
  144. package/dist/indexer/store.js +250 -0
  145. package/dist/indexer/store.js.map +1 -0
  146. package/dist/logger.d.ts +13 -0
  147. package/dist/logger.d.ts.map +1 -0
  148. package/dist/logger.js +37 -0
  149. package/dist/logger.js.map +1 -0
  150. package/dist/p2p/sync.d.ts +105 -0
  151. package/dist/p2p/sync.d.ts.map +1 -0
  152. package/dist/p2p/sync.js +875 -0
  153. package/dist/p2p/sync.js.map +1 -0
  154. package/dist/policy/liquidity-policy.d.ts +17 -0
  155. package/dist/policy/liquidity-policy.d.ts.map +1 -0
  156. package/dist/policy/liquidity-policy.js +112 -0
  157. package/dist/policy/liquidity-policy.js.map +1 -0
  158. package/dist/services/chain-config.d.ts +226 -0
  159. package/dist/services/chain-config.d.ts.map +1 -0
  160. package/dist/services/chain-config.js +105 -0
  161. package/dist/services/chain-config.js.map +1 -0
  162. package/dist/services/contract-provider.d.ts +44 -0
  163. package/dist/services/contract-provider.d.ts.map +1 -0
  164. package/dist/services/contract-provider.js +167 -0
  165. package/dist/services/contract-provider.js.map +1 -0
  166. package/dist/services/contracts-service.d.ts +192 -0
  167. package/dist/services/contracts-service.d.ts.map +1 -0
  168. package/dist/services/contracts-service.js +336 -0
  169. package/dist/services/contracts-service.js.map +1 -0
  170. package/dist/services/dao-service.d.ts +245 -0
  171. package/dist/services/dao-service.d.ts.map +1 -0
  172. package/dist/services/dao-service.js +389 -0
  173. package/dist/services/dao-service.js.map +1 -0
  174. package/dist/services/identity-service.d.ts +150 -0
  175. package/dist/services/identity-service.d.ts.map +1 -0
  176. package/dist/services/identity-service.js +286 -0
  177. package/dist/services/identity-service.js.map +1 -0
  178. package/dist/services/index.d.ts +20 -0
  179. package/dist/services/index.d.ts.map +1 -0
  180. package/dist/services/index.js +15 -0
  181. package/dist/services/index.js.map +1 -0
  182. package/dist/services/reputation-service.d.ts +128 -0
  183. package/dist/services/reputation-service.d.ts.map +1 -0
  184. package/dist/services/reputation-service.js +204 -0
  185. package/dist/services/reputation-service.js.map +1 -0
  186. package/dist/services/wallet-service.d.ts +201 -0
  187. package/dist/services/wallet-service.d.ts.map +1 -0
  188. package/dist/services/wallet-service.js +402 -0
  189. package/dist/services/wallet-service.js.map +1 -0
  190. package/package.json +66 -0
@@ -0,0 +1,523 @@
1
+ /**
2
+ * Info market routes — /api/v1/markets/info
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { ok, created, badRequest, notFound, internalError, paginated, parsePagination, } from '../response.js';
6
+ import { validate, ListingRemoveSchema } from '../schemas/common.js';
7
+ import { InfoPublishSchema, InfoPurchaseSchema, InfoDeliverSchema, InfoConfirmSchema, InfoReviewSchema, InfoSubscriptionSchema, InfoSubscriptionCancelSchema, } from '../schemas/markets.js';
8
+ import { resolvePrivateKey } from '../types.js';
9
+ import { createInfoListingPublishEnvelope, createInfoOrderCreateEnvelope, createInfoEscrowCreateEnvelope, createInfoEscrowFundEnvelope, createInfoOrderPaymentEscrowedEnvelope, createInfoOrderDeliveryEnvelope, createInfoOrderCompletionEnvelope, createInfoOrderReviewEnvelope, createInfoEscrowReleaseEnvelope, createMarketListingRemoveEnvelope, createMarketSubscriptionStartEnvelope, createMarketSubscriptionCancelEnvelope, } from '@claw-network/protocol';
10
+ export function marketsInfoRoutes(ctx) {
11
+ const r = new Router();
12
+ // ── POST / — publish info listing ─────────────────────────────
13
+ r.post('/', async (_req, res, route) => {
14
+ const v = validate(InfoPublishSchema, route.body);
15
+ if (!v.success) {
16
+ badRequest(res, v.error, route.url.pathname);
17
+ return;
18
+ }
19
+ const body = v.data;
20
+ const listingId = body.listingId ?? `info-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
21
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
22
+ if (!privateKey) {
23
+ badRequest(res, 'Key unavailable', route.url.pathname);
24
+ return;
25
+ }
26
+ try {
27
+ const envelope = await createInfoListingPublishEnvelope({
28
+ issuer: body.did,
29
+ privateKey,
30
+ listingId,
31
+ title: body.title,
32
+ description: body.description,
33
+ category: body.category,
34
+ tags: (body.tags ?? []),
35
+ pricing: body.pricing,
36
+ visibility: (body.visibility ?? 'public'),
37
+ marketData: {
38
+ infoType: body.infoType,
39
+ content: body.content,
40
+ accessMethod: body.accessMethod,
41
+ license: body.license,
42
+ quality: body.quality,
43
+ usageRestrictions: body.usageRestrictions,
44
+ },
45
+ restrictions: body.restrictions,
46
+ metadata: body.metadata,
47
+ expiresAt: body.expiresAt,
48
+ status: body.status,
49
+ ts: body.ts ?? Date.now(),
50
+ nonce: body.nonce ?? 0,
51
+ prev: body.prev,
52
+ });
53
+ const hash = await ctx.publishEvent(envelope);
54
+ created(res, { listingId, txHash: hash }, { self: `/api/v1/markets/info/${listingId}` });
55
+ }
56
+ catch (err) {
57
+ internalError(res, err.message || 'Info listing publish failed');
58
+ }
59
+ });
60
+ // ── GET / — list info listings ────────────────────────────────
61
+ r.get('/', async (_req, res, route) => {
62
+ const { page, perPage } = parsePagination(route.query);
63
+ if (ctx.marketStore) {
64
+ try {
65
+ const result = ctx.searchMarkets?.({
66
+ markets: ['info'],
67
+ page,
68
+ pageSize: perPage,
69
+ keyword: route.query.get('keyword') ?? undefined,
70
+ category: route.query.get('category') ?? undefined,
71
+ });
72
+ if (result) {
73
+ const r2 = result;
74
+ paginated(res, (r2.listings ?? []), {
75
+ page,
76
+ perPage,
77
+ total: (r2.total ?? 0),
78
+ basePath: '/api/v1/markets/info',
79
+ });
80
+ return;
81
+ }
82
+ }
83
+ catch {
84
+ /* fallthrough */
85
+ }
86
+ }
87
+ paginated(res, [], { page, perPage, total: 0, basePath: '/api/v1/markets/info' });
88
+ });
89
+ // ── GET /:id — single info listing ────────────────────────────
90
+ r.get('/:id', async (_req, res, route) => {
91
+ const { id } = route.params;
92
+ if (ctx.marketStore) {
93
+ try {
94
+ const listing = await ctx.marketStore.getListing?.(id);
95
+ if (listing) {
96
+ ok(res, listing, { self: `/api/v1/markets/info/${id}` });
97
+ return;
98
+ }
99
+ }
100
+ catch {
101
+ /* fallthrough */
102
+ }
103
+ }
104
+ notFound(res, `Info listing ${id} not found`);
105
+ });
106
+ // ── GET /:id/content — listing content metadata ───────────────
107
+ r.get('/:id/content', async (_req, res, route) => {
108
+ const { id } = route.params;
109
+ if (!ctx.marketStore) {
110
+ notFound(res, `Info listing ${id} not found`);
111
+ return;
112
+ }
113
+ try {
114
+ const listing = await ctx.marketStore.getListing?.(id);
115
+ if (!listing) {
116
+ notFound(res, `Info listing ${id} not found`);
117
+ return;
118
+ }
119
+ const marketData = listing.marketData;
120
+ ok(res, marketData?.content ?? {}, { self: `/api/v1/markets/info/${id}/content` });
121
+ }
122
+ catch (err) {
123
+ internalError(res, err.message || 'Info content lookup failed');
124
+ }
125
+ });
126
+ // ── GET /orders/:orderId/delivery — delivery record ───────────
127
+ r.get('/orders/:orderId/delivery', async (_req, res, route) => {
128
+ const { orderId } = route.params;
129
+ if (!ctx.infoContentStore) {
130
+ notFound(res, `Delivery ${orderId} not found`);
131
+ return;
132
+ }
133
+ try {
134
+ const delivery = await ctx.infoContentStore.getDeliveryForOrder?.(orderId);
135
+ if (!delivery) {
136
+ notFound(res, `Delivery ${orderId} not found`);
137
+ return;
138
+ }
139
+ ok(res, delivery, { self: `/api/v1/markets/info/orders/${orderId}/delivery` });
140
+ }
141
+ catch (err) {
142
+ internalError(res, err.message || 'Info delivery lookup failed');
143
+ }
144
+ });
145
+ // ── DELETE /:id — remove info listing ─────────────────────────
146
+ r.delete('/:id', async (_req, res, route) => {
147
+ const { id } = route.params;
148
+ const v = validate(ListingRemoveSchema, route.body);
149
+ if (!v.success) {
150
+ badRequest(res, v.error, route.url.pathname);
151
+ return;
152
+ }
153
+ const body = v.data;
154
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
155
+ if (!privateKey) {
156
+ badRequest(res, 'Key unavailable', route.url.pathname);
157
+ return;
158
+ }
159
+ try {
160
+ const envelope = await createMarketListingRemoveEnvelope({
161
+ issuer: body.did,
162
+ privateKey,
163
+ listingId: id,
164
+ resourcePrev: body.prev ?? '',
165
+ ts: body.ts ?? Date.now(),
166
+ nonce: body.nonce ?? 0,
167
+ prev: body.prev,
168
+ });
169
+ const hash = await ctx.publishEvent(envelope);
170
+ ok(res, { listingId: id, txHash: hash }, { self: `/api/v1/markets/info/${id}` });
171
+ }
172
+ catch (err) {
173
+ internalError(res, err.message || 'Info listing remove failed');
174
+ }
175
+ });
176
+ // ── POST /:id/actions/remove — compatibility alias ────────────
177
+ r.post('/:id/actions/remove', async (_req, res, route) => {
178
+ const { id } = route.params;
179
+ const v = validate(ListingRemoveSchema, route.body);
180
+ if (!v.success) {
181
+ badRequest(res, v.error, route.url.pathname);
182
+ return;
183
+ }
184
+ const body = v.data;
185
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
186
+ if (!privateKey) {
187
+ badRequest(res, 'Key unavailable', route.url.pathname);
188
+ return;
189
+ }
190
+ try {
191
+ const envelope = await createMarketListingRemoveEnvelope({
192
+ issuer: body.did,
193
+ privateKey,
194
+ listingId: id,
195
+ resourcePrev: body.prev ?? '',
196
+ ts: body.ts ?? Date.now(),
197
+ nonce: body.nonce ?? 0,
198
+ prev: body.prev,
199
+ });
200
+ const hash = await ctx.publishEvent(envelope);
201
+ ok(res, { listingId: id, txHash: hash }, { self: `/api/v1/markets/info/${id}` });
202
+ }
203
+ catch (err) {
204
+ internalError(res, err.message || 'Info listing remove failed');
205
+ }
206
+ });
207
+ // ── POST /:id/actions/purchase ────────────────────────────────
208
+ r.post('/:id/actions/purchase', async (_req, res, route) => {
209
+ const { id } = route.params;
210
+ const v = validate(InfoPurchaseSchema, route.body);
211
+ if (!v.success) {
212
+ badRequest(res, v.error, route.url.pathname);
213
+ return;
214
+ }
215
+ const body = v.data;
216
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
217
+ if (!privateKey) {
218
+ badRequest(res, 'Key unavailable', route.url.pathname);
219
+ return;
220
+ }
221
+ try {
222
+ const orderId = body.orderId ?? `order-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
223
+ const escrowId = body.escrowId ?? `escrow-${orderId}`;
224
+ const nonce = body.nonce ?? 0;
225
+ const ts = body.ts ?? Date.now();
226
+ // Fetch listing object for order create
227
+ const listing = ctx.marketStore ? await ctx.marketStore.getListing?.(id) : null;
228
+ // If listing not found locally and no price override, return 404
229
+ if (!listing && !body.unitPrice) {
230
+ notFound(res, `Listing ${id} not found on this node`, route.url.pathname);
231
+ return;
232
+ }
233
+ // Default unitPrice when listing is unavailable but override given
234
+ const effectiveUnitPrice = body.unitPrice ? String(body.unitPrice)
235
+ : undefined;
236
+ const e1 = await createInfoOrderCreateEnvelope({
237
+ issuer: body.did,
238
+ privateKey,
239
+ listing: (listing ?? { id, marketType: 'info', pricing: { type: 'fixed', fixedPrice: '0' } }),
240
+ orderId,
241
+ quantity: body.quantity,
242
+ unitPrice: effectiveUnitPrice,
243
+ ts,
244
+ nonce,
245
+ prev: body.prev,
246
+ });
247
+ const h1 = await ctx.publishEvent(e1);
248
+ const totalAmount = body.unitPrice
249
+ ? String(Number(body.unitPrice) * (body.quantity ?? 1))
250
+ : '0';
251
+ // Resolve seller DID from body, listing, or fallback to buyer
252
+ const listingRec = listing;
253
+ const sellerObj = listingRec?.seller;
254
+ const resolvedSellerDid = body.sellerDid ||
255
+ sellerObj?.did ||
256
+ listingRec?.did ||
257
+ body.did;
258
+ const e2 = await createInfoEscrowCreateEnvelope({
259
+ issuer: body.did,
260
+ privateKey,
261
+ escrowId,
262
+ buyerDid: body.did,
263
+ sellerDid: resolvedSellerDid,
264
+ amount: totalAmount,
265
+ releaseRules: body.releaseRules ?? [{ type: 'delivery_confirmation' }],
266
+ ts: ts + 1,
267
+ nonce: nonce + 1,
268
+ prev: h1,
269
+ });
270
+ const h2 = await ctx.publishEvent(e2);
271
+ const e3 = await createInfoEscrowFundEnvelope({
272
+ issuer: body.did,
273
+ privateKey,
274
+ escrowId,
275
+ amount: totalAmount,
276
+ resourcePrev: h2,
277
+ ts: ts + 2,
278
+ nonce: nonce + 2,
279
+ prev: h2,
280
+ });
281
+ const h3 = await ctx.publishEvent(e3);
282
+ const e4 = await createInfoOrderPaymentEscrowedEnvelope({
283
+ issuer: body.did,
284
+ privateKey,
285
+ orderId,
286
+ escrowId,
287
+ resourcePrev: h3,
288
+ ts: ts + 3,
289
+ nonce: nonce + 3,
290
+ prev: h3,
291
+ });
292
+ const h4 = await ctx.publishEvent(e4);
293
+ created(res, {
294
+ orderId,
295
+ escrowId,
296
+ orderHash: h1,
297
+ escrowCreateHash: h2,
298
+ escrowFundHash: h3,
299
+ paymentHash: h4,
300
+ }, { self: `/api/v1/markets/info/${id}` });
301
+ }
302
+ catch (err) {
303
+ internalError(res, err.message || 'Info purchase failed');
304
+ }
305
+ });
306
+ // ── POST /:id/actions/deliver ─────────────────────────────────
307
+ r.post('/:id/actions/deliver', async (_req, res, route) => {
308
+ const { id } = route.params;
309
+ const v = validate(InfoDeliverSchema, route.body);
310
+ if (!v.success) {
311
+ badRequest(res, v.error, route.url.pathname);
312
+ return;
313
+ }
314
+ const body = v.data;
315
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
316
+ if (!privateKey) {
317
+ badRequest(res, 'Key unavailable', route.url.pathname);
318
+ return;
319
+ }
320
+ try {
321
+ const deliveryId = body.deliveryId ?? `delivery-${Date.now()}`;
322
+ const envelope = await createInfoOrderDeliveryEnvelope({
323
+ issuer: body.did,
324
+ privateKey,
325
+ orderId: body.orderId ?? '',
326
+ resourcePrev: body.prev ?? '',
327
+ deliveryId,
328
+ method: body.method ?? 'direct',
329
+ accessUrl: body.accessUrl,
330
+ accessToken: body.accessToken,
331
+ expiresAt: body.expiresAt,
332
+ ts: body.ts ?? Date.now(),
333
+ nonce: body.nonce ?? 0,
334
+ prev: body.prev,
335
+ });
336
+ const hash = await ctx.publishEvent(envelope);
337
+ ok(res, { deliveryId, orderUpdateHash: hash }, { self: `/api/v1/markets/info/${id}` });
338
+ }
339
+ catch (err) {
340
+ internalError(res, err.message || 'Info delivery failed');
341
+ }
342
+ });
343
+ // ── POST /:id/actions/confirm ─────────────────────────────────
344
+ r.post('/:id/actions/confirm', async (_req, res, route) => {
345
+ const { id } = route.params;
346
+ const v = validate(InfoConfirmSchema, route.body);
347
+ if (!v.success) {
348
+ badRequest(res, v.error, route.url.pathname);
349
+ return;
350
+ }
351
+ const body = v.data;
352
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
353
+ if (!privateKey) {
354
+ badRequest(res, 'Key unavailable', route.url.pathname);
355
+ return;
356
+ }
357
+ try {
358
+ const nonce = body.nonce ?? 0;
359
+ const ts = body.ts ?? Date.now();
360
+ const escrowId = body.escrowId ?? `escrow-${body.orderId}`;
361
+ const e1 = await createInfoEscrowReleaseEnvelope({
362
+ issuer: body.did,
363
+ privateKey,
364
+ escrowId,
365
+ amount: body.amount ?? '0',
366
+ ruleId: body.ruleId ?? 'delivery_confirmation',
367
+ resourcePrev: body.prev ?? '',
368
+ ts,
369
+ nonce,
370
+ prev: body.prev,
371
+ });
372
+ const h1 = await ctx.publishEvent(e1);
373
+ const e2 = await createInfoOrderCompletionEnvelope({
374
+ issuer: body.did,
375
+ privateKey,
376
+ orderId: body.orderId ?? '',
377
+ resourcePrev: h1,
378
+ ts: ts + 1,
379
+ nonce: nonce + 1,
380
+ prev: h1,
381
+ });
382
+ const h2 = await ctx.publishEvent(e2);
383
+ ok(res, { escrowReleaseHash: h1, orderUpdateHash: h2 }, { self: `/api/v1/markets/info/${id}` });
384
+ }
385
+ catch (err) {
386
+ internalError(res, err.message || 'Info confirm failed');
387
+ }
388
+ });
389
+ // ── POST /:id/actions/review ──────────────────────────────────
390
+ r.post('/:id/actions/review', async (_req, res, route) => {
391
+ const { id } = route.params;
392
+ const v = validate(InfoReviewSchema, route.body);
393
+ if (!v.success) {
394
+ badRequest(res, v.error, route.url.pathname);
395
+ return;
396
+ }
397
+ const body = v.data;
398
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
399
+ if (!privateKey) {
400
+ badRequest(res, 'Key unavailable', route.url.pathname);
401
+ return;
402
+ }
403
+ try {
404
+ const envelope = await createInfoOrderReviewEnvelope({
405
+ issuer: body.did,
406
+ privateKey,
407
+ orderId: body.orderId ?? '',
408
+ resourcePrev: body.prev ?? '',
409
+ status: 'completed',
410
+ review: {
411
+ rating: body.rating,
412
+ comment: body.comment,
413
+ ...(body.detailedRatings ? { detailedRatings: body.detailedRatings } : {}),
414
+ },
415
+ by: body.by,
416
+ ts: body.ts ?? Date.now(),
417
+ nonce: body.nonce ?? 0,
418
+ prev: body.prev,
419
+ });
420
+ const hash = await ctx.publishEvent(envelope);
421
+ ok(res, { orderUpdateHash: hash }, { self: `/api/v1/markets/info/${id}` });
422
+ }
423
+ catch (err) {
424
+ internalError(res, err.message || 'Info review failed');
425
+ }
426
+ });
427
+ // ── POST /:id/subscriptions — subscribe ───────────────────────
428
+ r.post('/:id/subscriptions', async (_req, res, route) => {
429
+ const { id } = route.params;
430
+ const v = validate(InfoSubscriptionSchema, route.body);
431
+ if (!v.success) {
432
+ badRequest(res, v.error, route.url.pathname);
433
+ return;
434
+ }
435
+ const body = v.data;
436
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
437
+ if (!privateKey) {
438
+ badRequest(res, 'Key unavailable', route.url.pathname);
439
+ return;
440
+ }
441
+ try {
442
+ const subscriptionId = body.subscriptionId ?? `sub-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
443
+ const envelope = await createMarketSubscriptionStartEnvelope({
444
+ issuer: body.did,
445
+ privateKey,
446
+ listingId: id,
447
+ subscriptionId,
448
+ ts: body.ts ?? Date.now(),
449
+ nonce: body.nonce ?? 0,
450
+ prev: body.prev,
451
+ });
452
+ const hash = await ctx.publishEvent(envelope);
453
+ created(res, { subscriptionId, txHash: hash }, { self: `/api/v1/markets/info/${id}/subscriptions/${subscriptionId}` });
454
+ }
455
+ catch (err) {
456
+ internalError(res, err.message || 'Subscription start failed');
457
+ }
458
+ });
459
+ // ── DELETE /:id/subscriptions/:subId — cancel subscription ────
460
+ r.delete('/:id/subscriptions/:subId', async (_req, res, route) => {
461
+ const { subId } = route.params;
462
+ const v = validate(InfoSubscriptionCancelSchema, route.body);
463
+ if (!v.success) {
464
+ badRequest(res, v.error, route.url.pathname);
465
+ return;
466
+ }
467
+ const body = v.data;
468
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
469
+ if (!privateKey) {
470
+ badRequest(res, 'Key unavailable', route.url.pathname);
471
+ return;
472
+ }
473
+ try {
474
+ const envelope = await createMarketSubscriptionCancelEnvelope({
475
+ issuer: body.did,
476
+ privateKey,
477
+ subscriptionId: subId,
478
+ resourcePrev: body.prev ?? '',
479
+ ts: body.ts ?? Date.now(),
480
+ nonce: body.nonce ?? 0,
481
+ prev: body.prev,
482
+ });
483
+ const hash = await ctx.publishEvent(envelope);
484
+ ok(res, { subscriptionId: subId, txHash: hash }, { self: `/api/v1/markets/info/${route.params.id}` });
485
+ }
486
+ catch (err) {
487
+ internalError(res, err.message || 'Subscription cancel failed');
488
+ }
489
+ });
490
+ // ── POST /subscriptions/:subId/actions/cancel — compat alias ─
491
+ r.post('/subscriptions/:subId/actions/cancel', async (_req, res, route) => {
492
+ const { subId } = route.params;
493
+ const v = validate(InfoSubscriptionCancelSchema, route.body);
494
+ if (!v.success) {
495
+ badRequest(res, v.error, route.url.pathname);
496
+ return;
497
+ }
498
+ const body = v.data;
499
+ const privateKey = await resolvePrivateKey(ctx.config.dataDir, body.did, body.passphrase);
500
+ if (!privateKey) {
501
+ badRequest(res, 'Key unavailable', route.url.pathname);
502
+ return;
503
+ }
504
+ try {
505
+ const envelope = await createMarketSubscriptionCancelEnvelope({
506
+ issuer: body.did,
507
+ privateKey,
508
+ subscriptionId: subId,
509
+ resourcePrev: body.prev ?? '',
510
+ ts: body.ts ?? Date.now(),
511
+ nonce: body.nonce ?? 0,
512
+ prev: body.prev,
513
+ });
514
+ const hash = await ctx.publishEvent(envelope);
515
+ ok(res, { subscriptionId: subId, txHash: hash }, { self: `/api/v1/markets/info/subscriptions/${subId}` });
516
+ }
517
+ catch (err) {
518
+ internalError(res, err.message || 'Subscription cancel failed');
519
+ }
520
+ });
521
+ return r;
522
+ }
523
+ //# sourceMappingURL=markets-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-info.js","sourceRoot":"","sources":["../../../src/api/routes/markets-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Cross-market search route — /api/v1/markets/search
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function marketsSearchRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=markets-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-search.d.ts","sourceRoot":"","sources":["../../../src/api/routes/markets-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAqC/D"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Cross-market search route — /api/v1/markets/search
3
+ */
4
+ import { Router } from '../router.js';
5
+ import { badRequest, paginated, parsePagination } from '../response.js';
6
+ import { parseMarketSearchQuery } from '../legacy.js';
7
+ export function marketsSearchRoutes(ctx) {
8
+ const r = new Router();
9
+ // ── GET / — unified cross-market search ───────────────────────
10
+ r.get('/', async (_req, res, route) => {
11
+ const { page, perPage } = parsePagination(route.query);
12
+ if (!ctx.searchMarkets) {
13
+ paginated(res, [], { page, perPage, total: 0, basePath: '/api/v1/markets/search' });
14
+ return;
15
+ }
16
+ try {
17
+ const query = parseMarketSearchQuery(route.query);
18
+ // Override page/perPage from our standard pagination
19
+ query.page = page;
20
+ query.pageSize = perPage;
21
+ const result = ctx.searchMarkets(query);
22
+ const listings = result.listings ?? [];
23
+ const total = result.total ?? listings.length;
24
+ paginated(res, listings, {
25
+ page,
26
+ perPage,
27
+ total,
28
+ basePath: '/api/v1/markets/search',
29
+ query: Object.fromEntries([...route.query.entries()].filter(([k]) => k !== 'page' && k !== 'per_page')),
30
+ });
31
+ }
32
+ catch (err) {
33
+ badRequest(res, err.message, route.url.pathname);
34
+ }
35
+ });
36
+ return r;
37
+ }
38
+ //# sourceMappingURL=markets-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-search.js","sourceRoot":"","sources":["../../../src/api/routes/markets-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,UAAU,mBAAmB,CAAC,GAAmB;IACrD,MAAM,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;IAEvB,iEAAiE;IACjE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QACpC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEvD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,wBAAwB,EAAE,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClD,qDAAqD;YACrD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;YAEzB,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,CAAC;YAE9C,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE;gBACvB,IAAI;gBACJ,OAAO;gBACP,KAAK;gBACL,QAAQ,EAAE,wBAAwB;gBAClC,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,UAAU,CAAC,CAC7E;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,GAAG,EAAG,GAAa,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Task market routes — /api/v1/markets/tasks
3
+ */
4
+ import { Router } from '../router.js';
5
+ import type { RuntimeContext } from '../types.js';
6
+ export declare function marketsTaskRoutes(ctx: RuntimeContext): Router;
7
+ //# sourceMappingURL=markets-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markets-tasks.d.ts","sourceRoot":"","sources":["../../../src/api/routes/markets-tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAoBtC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAoBlD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CA+jB7D"}