@seedprotocol/arweave 0.5.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 (53) hide show
  1. package/dist/ArweaveClient/BaseArweaveClient.d.ts +73 -0
  2. package/dist/ArweaveClient/BaseArweaveClient.d.ts.map +1 -0
  3. package/dist/ArweaveClient/IArweaveClient.d.ts +11 -0
  4. package/dist/ArweaveClient/IArweaveClient.d.ts.map +1 -0
  5. package/dist/ArweaveClient/arweaveL1UploadApi.d.ts +52 -0
  6. package/dist/ArweaveClient/arweaveL1UploadApi.d.ts.map +1 -0
  7. package/dist/ArweaveClient/queries.d.ts +44 -0
  8. package/dist/ArweaveClient/queries.d.ts.map +1 -0
  9. package/dist/ArweaveClient/selectReadGateway.d.ts +16 -0
  10. package/dist/ArweaveClient/selectReadGateway.d.ts.map +1 -0
  11. package/dist/ArweaveClient/uploadApiVerification.d.ts +23 -0
  12. package/dist/ArweaveClient/uploadApiVerification.d.ts.map +1 -0
  13. package/dist/constants.d.ts +46 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/gateway/gatewayState.d.ts +5 -0
  16. package/dist/gateway/gatewayState.d.ts.map +1 -0
  17. package/dist/gateway/resolveSeedGatewayEndpoints.d.ts +15 -0
  18. package/dist/gateway/resolveSeedGatewayEndpoints.d.ts.map +1 -0
  19. package/dist/gateway/seedGatewayConfig.d.ts +5 -0
  20. package/dist/gateway/seedGatewayConfig.d.ts.map +1 -0
  21. package/dist/graphql/gql/fragment-masking.d.ts +20 -0
  22. package/dist/graphql/gql/fragment-masking.d.ts.map +1 -0
  23. package/dist/graphql/gql/gql.d.ts +42 -0
  24. package/dist/graphql/gql/gql.d.ts.map +1 -0
  25. package/dist/graphql/gql/graphql.d.ts +337 -0
  26. package/dist/graphql/gql/graphql.d.ts.map +1 -0
  27. package/dist/graphql/gql/index.d.ts +3 -0
  28. package/dist/graphql/gql/index.d.ts.map +1 -0
  29. package/dist/index.d.ts +17 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +432 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/mediaRef.d.ts +58 -0
  34. package/dist/mediaRef.d.ts.map +1 -0
  35. package/dist/node/ArweaveClient.d.ts +14 -0
  36. package/dist/node/ArweaveClient.d.ts.map +1 -0
  37. package/dist/node/index.d.ts +7 -0
  38. package/dist/node/index.d.ts.map +1 -0
  39. package/dist/node.js +110 -0
  40. package/dist/node.js.map +1 -0
  41. package/dist/queries-DgB0O5RC.js +512 -0
  42. package/dist/queries-DgB0O5RC.js.map +1 -0
  43. package/dist/relationSeedRef.d.ts +6 -0
  44. package/dist/relationSeedRef.d.ts.map +1 -0
  45. package/dist/shims/typed-document-node.d.ts +5 -0
  46. package/dist/shims/typed-document-node.d.ts.map +1 -0
  47. package/dist/types/arweave.d.ts +57 -0
  48. package/dist/types/arweave.d.ts.map +1 -0
  49. package/dist/types/gateway.d.ts +44 -0
  50. package/dist/types/gateway.d.ts.map +1 -0
  51. package/dist/types/seedConfig.d.ts +26 -0
  52. package/dist/types/seedConfig.d.ts.map +1 -0
  53. package/package.json +57 -0
package/dist/index.js ADDED
@@ -0,0 +1,432 @@
1
+ import { a as e, c as t, d as n, f as r, g as i, h as a, i as o, l as s, m as c, n as l, o as u, p as d, r as f, s as p, t as ee, u as m } from "./queries-DgB0O5RC.js";
2
+ //#region src/relationSeedRef.ts
3
+ function h(e) {
4
+ let t = {
5
+ localId: void 0,
6
+ uid: void 0
7
+ };
8
+ return e ? (e.length === 10 && (t.localId = e), e.startsWith("0x") && e.length === 66 && (t.uid = e), t) : t;
9
+ }
10
+ function g(e) {
11
+ if (e != null) {
12
+ if (typeof e == "string") {
13
+ let t = e.trim();
14
+ return t === "" ? void 0 : t;
15
+ }
16
+ if (typeof e == "object" && e) {
17
+ let t = e;
18
+ if (typeof t.seedLocalId == "string" && t.seedLocalId.trim() !== "") return t.seedLocalId.trim();
19
+ if (typeof t.seedUid == "string" && t.seedUid.trim() !== "") return t.seedUid.trim();
20
+ }
21
+ }
22
+ }
23
+ var _ = /^[a-zA-Z0-9_-]{10,21}$/;
24
+ function v(e) {
25
+ let t = h(e);
26
+ return t.localId || t.uid ? {
27
+ seedLocalId: t.localId,
28
+ seedUid: t.uid
29
+ } : _.test(e) && !e.startsWith("0x") ? { seedLocalId: e } : {};
30
+ }
31
+ //#endregion
32
+ //#region src/mediaRef.ts
33
+ var te = /^[a-zA-Z0-9_-]{43}$/;
34
+ function ne(e) {
35
+ return e == null ? "" : typeof e == "string" ? e.trim() : String(e).trim();
36
+ }
37
+ function y(e, t) {
38
+ let n = e[t];
39
+ return n == null ? "" : typeof n == "string" ? n.trim() : typeof n == "number" || typeof n == "boolean" ? String(n) : "";
40
+ }
41
+ function b(e) {
42
+ let t = e.trim();
43
+ if (!t) return t;
44
+ try {
45
+ let e = g(JSON.parse(t));
46
+ if (e) return e;
47
+ } catch {}
48
+ return t;
49
+ }
50
+ function x(e, t) {
51
+ let n = ne(e);
52
+ if (!n) return { kind: "empty" };
53
+ let r = t?.treatAs;
54
+ if (r === "url") return {
55
+ kind: "url",
56
+ href: n
57
+ };
58
+ if (r === "arweaveTx") return {
59
+ kind: "arweaveTxId",
60
+ txId: n
61
+ };
62
+ if (r === "seedUid") return n.startsWith("0x") && n.length === 66 ? {
63
+ kind: "seedUid",
64
+ uid: n
65
+ } : {
66
+ kind: "unknown",
67
+ raw: n
68
+ };
69
+ if (n.startsWith("http://") || n.startsWith("https://") || n.startsWith("blob:") || n.startsWith("data:")) return {
70
+ kind: "url",
71
+ href: n
72
+ };
73
+ let i = b(n), a = v(i);
74
+ return a.seedUid ? {
75
+ kind: "seedUid",
76
+ uid: a.seedUid
77
+ } : a.seedLocalId ? {
78
+ kind: "seedLocalId",
79
+ localId: a.seedLocalId
80
+ } : i.startsWith("0x") && i.length === 66 ? {
81
+ kind: "seedUid",
82
+ uid: i
83
+ } : te.test(i) && !i.startsWith("0x") ? {
84
+ kind: "arweaveTxId",
85
+ txId: i
86
+ } : {
87
+ kind: "unknown",
88
+ raw: n
89
+ };
90
+ }
91
+ function S(e, t) {
92
+ let n = y(e, t);
93
+ if (n) return n;
94
+ let r = t.replace(/[A-Z]/g, (e) => `_${e.toLowerCase()}`);
95
+ if (r !== t) {
96
+ let t = y(e, r);
97
+ if (t) return t;
98
+ }
99
+ let i = t.split("_");
100
+ if (i.length > 1) {
101
+ let t = y(e, i[0] + i.slice(1).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(""));
102
+ if (t) return t;
103
+ }
104
+ return "";
105
+ }
106
+ function C(e, t) {
107
+ let n = {};
108
+ for (let [r, i] of Object.entries(t)) {
109
+ let t = S(e, r);
110
+ if (!t) {
111
+ n[r] = void 0;
112
+ continue;
113
+ }
114
+ if (i.role === "html") {
115
+ n[r] = {
116
+ role: "html",
117
+ raw: t
118
+ };
119
+ continue;
120
+ }
121
+ if (i.role === "text") {
122
+ n[r] = {
123
+ role: "text",
124
+ raw: t
125
+ };
126
+ continue;
127
+ }
128
+ let a = x(t, { treatAs: i.treatAs });
129
+ n[r] = {
130
+ role: i.role,
131
+ raw: t,
132
+ classification: a
133
+ };
134
+ }
135
+ return n;
136
+ }
137
+ function w(e) {
138
+ return `${f.getBaseUrl()}/${e}`;
139
+ }
140
+ //#endregion
141
+ //#region src/ArweaveClient/selectReadGateway.ts
142
+ var T = 180 * 1e3, E = 5e3, D = null, O = null;
143
+ function k() {
144
+ D = null, O = null;
145
+ }
146
+ function re() {
147
+ k(), f.resetReadGatewaySelectionStateForTests(), f.isReadGatewayLocked() || f.setPreferredReadGateway(p);
148
+ }
149
+ async function A(e, t) {
150
+ let n = `${e.replace(/\/$/, "")}/info`, r, i = new AbortController(), a = t ?? i.signal;
151
+ t || (r = setTimeout(() => i.abort(), E));
152
+ try {
153
+ let e = await fetch(n, {
154
+ method: "GET",
155
+ signal: a,
156
+ headers: { Accept: "application/json" }
157
+ });
158
+ if (!e.ok) return !1;
159
+ let t = await e.text();
160
+ if (!t.trim()) return !1;
161
+ try {
162
+ let e = JSON.parse(t);
163
+ return typeof e == "object" && !!e;
164
+ } catch {
165
+ return !1;
166
+ }
167
+ } catch {
168
+ return !1;
169
+ } finally {
170
+ r && clearTimeout(r);
171
+ }
172
+ }
173
+ async function j(e, t = "https", n) {
174
+ for (let r of e) {
175
+ let e = r.trim().replace(/\/$/, "");
176
+ if (e && await A(`${t}://${e}`, n)) return e;
177
+ }
178
+ return null;
179
+ }
180
+ function M() {
181
+ return r(f.getHost());
182
+ }
183
+ async function N(e) {
184
+ if (f.isReadGatewayLocked()) return f.getHost();
185
+ if (D && Date.now() < D.expiresAt) return D.host;
186
+ if (O) return O;
187
+ O = (async () => {
188
+ let t = await j(M(), f.getProtocol(), e);
189
+ return f.isReadGatewayLocked() || t && f.applyProbedReadGateway(t), D = {
190
+ host: f.getHost(),
191
+ expiresAt: Date.now() + T
192
+ }, D.host;
193
+ })();
194
+ try {
195
+ return await O;
196
+ } finally {
197
+ O = null;
198
+ }
199
+ }
200
+ //#endregion
201
+ //#region src/ArweaveClient/uploadApiVerification.ts
202
+ function P(e) {
203
+ return e.trim().replace(/\/+$/, "");
204
+ }
205
+ function F(e, t) {
206
+ return `${P(e)}/api/upload/arweave/data/${encodeURIComponent(t)}`;
207
+ }
208
+ var I = 45e3;
209
+ async function L(e, t, n) {
210
+ let r = F(e, t), i = n?.timeoutMs ?? I, a = new AbortController(), o = setTimeout(() => a.abort(), i);
211
+ try {
212
+ let e = await fetch(r, { signal: a.signal });
213
+ return clearTimeout(o), e.status === 404 ? {
214
+ status: 404,
215
+ confirmed: null
216
+ } : e.ok ? (e.body && await e.body.cancel(), {
217
+ status: 200,
218
+ confirmed: null
219
+ }) : {
220
+ status: e.status,
221
+ confirmed: null
222
+ };
223
+ } catch (e) {
224
+ return clearTimeout(o), e instanceof Error && e.name === "AbortError" ? {
225
+ status: 504,
226
+ confirmed: null
227
+ } : {
228
+ status: 500,
229
+ confirmed: null
230
+ };
231
+ }
232
+ }
233
+ //#endregion
234
+ //#region src/ArweaveClient/arweaveL1UploadApi.ts
235
+ var R = "\n query ArweaveGatewayTransaction($id: String!) {\n transaction(id: $id) {\n id\n bundledIn {\n id\n }\n block {\n height\n timestamp\n }\n }\n }\n";
236
+ function z(e, t) {
237
+ return `${P(e)}/api/upload/arweave/status/${encodeURIComponent(t)}`;
238
+ }
239
+ function B(e) {
240
+ let t = e.l1;
241
+ return t ? t.meetsMinConfirmations === !0 || t.confirmed === !0 : !1;
242
+ }
243
+ async function V(e, t) {
244
+ let n = z(e, t);
245
+ try {
246
+ let e = await fetch(n);
247
+ if (!e.ok) return null;
248
+ let t = await e.json();
249
+ return t && typeof t == "object" ? t : null;
250
+ } catch {
251
+ return null;
252
+ }
253
+ }
254
+ async function H(e, t, n) {
255
+ let r = e.trim();
256
+ if (!r) return null;
257
+ try {
258
+ let e = await fetch(r, {
259
+ method: "POST",
260
+ headers: { "Content-Type": "application/json" },
261
+ body: JSON.stringify({
262
+ query: R,
263
+ variables: { id: t }
264
+ }),
265
+ signal: n?.signal
266
+ });
267
+ if (!e.ok) return null;
268
+ let i = await e.json();
269
+ if (i.errors) return null;
270
+ let a = i.data?.transaction;
271
+ return a ? {
272
+ transactionId: typeof a.id == "string" ? a.id : null,
273
+ bundledInId: a.bundledIn?.id == null ? null : String(a.bundledIn.id),
274
+ blockHeight: a.block?.height ?? null,
275
+ blockTimestamp: a.block?.timestamp ?? null
276
+ } : {
277
+ transactionId: null,
278
+ bundledInId: null,
279
+ blockHeight: null,
280
+ blockTimestamp: null
281
+ };
282
+ } catch {
283
+ return null;
284
+ }
285
+ }
286
+ async function U(e, t, n) {
287
+ let i = d(), a = e?.trim(), o = "https", s = null;
288
+ if (a) try {
289
+ let e = new URL(a);
290
+ o = e.protocol === "http:" ? "http" : "https", s = e.hostname || null;
291
+ } catch {
292
+ s = null;
293
+ }
294
+ let c = s && s.length > 0 ? r(s) : [...i], l = n?.signal;
295
+ for (let e of c) {
296
+ if (!await A(`${o}://${e}`, l ?? void 0)) continue;
297
+ let r = await H(`${o}://${e}/graphql`, t, n);
298
+ if (r !== null) return r;
299
+ }
300
+ return null;
301
+ }
302
+ //#endregion
303
+ //#region src/gateway/gatewayState.ts
304
+ var W = null;
305
+ function G() {
306
+ return W;
307
+ }
308
+ function K(e) {
309
+ W = e;
310
+ }
311
+ //#endregion
312
+ //#region src/gateway/resolveSeedGatewayEndpoints.ts
313
+ var q = 180 * 1e3, J = null;
314
+ function Y() {
315
+ J = null;
316
+ }
317
+ function ie(e) {
318
+ let t = (e ?? "ar.seedprotocol.io").trim();
319
+ return t.startsWith("http://") ? {
320
+ protocol: "http",
321
+ host: t.slice(7).replace(/\/$/, "")
322
+ } : t.startsWith("https://") ? {
323
+ protocol: "https",
324
+ host: t.slice(8).replace(/\/$/, "")
325
+ } : {
326
+ protocol: "https",
327
+ host: t.replace(/\/$/, "")
328
+ };
329
+ }
330
+ function X(e) {
331
+ let t = e.hyper?.localSidecarHost?.trim() || "127.0.0.1", n = e.hyper?.localSidecarPort ?? 1984;
332
+ return {
333
+ host: n === 80 || n === 443 ? t : `${t}:${n}`,
334
+ port: n,
335
+ baseUrl: `http://${t}:${n}`
336
+ };
337
+ }
338
+ async function Z(e, t) {
339
+ let n = Date.now();
340
+ if (J && n < J.expiresAt) return J.healthy;
341
+ let r = await A(e, t);
342
+ return J = {
343
+ healthy: r,
344
+ expiresAt: n + q
345
+ }, r;
346
+ }
347
+ function Q(e) {
348
+ let { host: t, protocol: n } = ie(e.arweaveDomain), r = `${n}://${t}`, i = e.uploadApiBaseUrl?.trim() || r;
349
+ return {
350
+ mode: e.transport ?? "http-gateway",
351
+ arweaveHost: t,
352
+ arweaveProtocol: n,
353
+ arweaveBaseUrl: r,
354
+ arweaveGraphqlUrl: `${n}://${t}/graphql`,
355
+ uploadApiBaseUrl: i,
356
+ activePath: "http",
357
+ gatewayHyperKey: e.hyper?.gatewayHyperKey?.trim() || void 0
358
+ };
359
+ }
360
+ function $(e) {
361
+ let t = X(e), n = e.hyper?.gatewayHyperKey?.trim();
362
+ return {
363
+ mode: "hyper",
364
+ arweaveHost: t.host,
365
+ arweaveProtocol: "http",
366
+ arweaveBaseUrl: t.baseUrl,
367
+ arweaveGraphqlUrl: `${t.baseUrl}/graphql`,
368
+ uploadApiBaseUrl: t.baseUrl,
369
+ activePath: "hyper-sidecar",
370
+ gatewayHyperKey: n || void 0
371
+ };
372
+ }
373
+ async function ae(e, t) {
374
+ t?.forceSidecarProbe && Y();
375
+ let n = e.transport ?? "http-gateway";
376
+ if (n === "http-gateway") return Q({
377
+ ...e,
378
+ transport: n
379
+ });
380
+ if (n === "hyper") {
381
+ let n = $(e);
382
+ if (e.hyper?.probeSidecar !== !1 && !await Z(n.arweaveBaseUrl, t?.signal)) throw Error(`Gateway Hyper sidecar not reachable at ${n.arweaveBaseUrl}. Run: seed gateway tunnel connect <operator-z32-key>`);
383
+ return n;
384
+ }
385
+ let r = X(e);
386
+ return e.hyper?.probeSidecar !== !1 && await Z(r.baseUrl, t?.signal) ? $({
387
+ ...e,
388
+ transport: "hyper"
389
+ }) : {
390
+ ...Q({
391
+ ...e,
392
+ transport: "http-gateway"
393
+ }),
394
+ mode: "hybrid",
395
+ activePath: "hybrid-fallback-http"
396
+ };
397
+ }
398
+ function oe(e, t) {
399
+ return e.activePath === "hyper-sidecar" ? [e.arweaveHost] : r(e.arweaveHost);
400
+ }
401
+ //#endregion
402
+ //#region src/gateway/seedGatewayConfig.ts
403
+ function se(e) {
404
+ let t = e.gateway ?? {};
405
+ return {
406
+ transport: t.transport,
407
+ arweaveDomain: e.arweaveDomain ?? t.arweaveDomain,
408
+ uploadApiBaseUrl: e.uploadApiBaseUrl ?? t.uploadApiBaseUrl,
409
+ hyper: {
410
+ gatewayHyperKey: t.hyper?.gatewayHyperKey?.trim() || t.gatewayHyperKey?.trim() || void 0,
411
+ localSidecarHost: t.hyper?.localSidecarHost ?? t.localSidecarHost,
412
+ localSidecarPort: t.hyper?.localSidecarPort ?? t.localSidecarPort,
413
+ probeSidecar: t.hyper?.probeSidecar ?? t.probeSidecar
414
+ }
415
+ };
416
+ }
417
+ function ce(e) {
418
+ return {
419
+ transport: e.gatewayTransport,
420
+ arweaveDomain: e.arweaveDomain,
421
+ uploadApiBaseUrl: e.uploadApiBaseUrl,
422
+ hyper: {
423
+ gatewayHyperKey: e.gatewayHyperKey?.trim() || void 0,
424
+ localSidecarHost: e.gatewaySidecarHost,
425
+ localSidecarPort: e.gatewaySidecarPort
426
+ }
427
+ };
428
+ }
429
+ //#endregion
430
+ export { o as ARWEAVE_HOST_ENV_KEYS, f as ArweaveClient, f as BaseArweaveClient, e as DEFAULT_ARWEAVE_GATEWAYS, u as DEFAULT_ARWEAVE_GRAPHQL_URL, p as DEFAULT_ARWEAVE_HOST, t as DEFAULT_GATEWAY_SIDECAR_HOST, s as DEFAULT_GATEWAY_SIDECAR_PORT, m as DEFAULT_SEED_FEED_HYPER_KEY, n as DEFAULT_SEED_GATEWAY_HYPER_KEY, ee as GET_ARWEAVE_TRANSACTIONS, l as GET_TRANSACTION_TAGS, x as classifyMediaRef, N as ensureReadGatewaySelected, r as getArweaveReadGatewayHostsForPrimary, V as getArweaveUploadStatus, w as getArweaveUrlForTransaction, d as getDefaultArweaveReadGatewayHostsOrdered, S as getFeedItemStringField, oe as getReadGatewayHostsForConfig, G as getResolvedSeedGatewayEndpoints, F as getUploadApiArweaveDataUrl, z as getUploadApiArweaveStatusUrl, L as getUploadPipelineTransactionStatus, k as invalidateReadGatewayCache, Y as invalidateSidecarProbeCache, B as isArweaveL1AnchoringComplete, c as isKnownArweaveGatewayHostname, a as mergePrimaryHostWithDefaults, C as normalizeFeedItemFields, g as normalizeRelationPropertyValue, P as normalizeUploadApiBaseUrl, A as probeGateway, H as queryArweaveGatewayTransaction, U as queryArweaveGatewayTransactionWithFallback, re as resetArweaveReadGatewayForTests, i as resolveArweaveHostFromEnv, ae as resolveSeedGatewayEndpoints, v as resolveSeedIdsFromRefString, ce as seedGatewayConfigFromClientContext, se as seedGatewayConfigFromSeedConfig, j as selectFirstHealthyReadGateway, K as setResolvedSeedGatewayEndpoints };
431
+
432
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/relationSeedRef.ts","../src/mediaRef.ts","../src/ArweaveClient/selectReadGateway.ts","../src/ArweaveClient/uploadApiVerification.ts","../src/ArweaveClient/arweaveL1UploadApi.ts","../src/gateway/gatewayState.ts","../src/gateway/resolveSeedGatewayEndpoints.ts","../src/gateway/seedGatewayConfig.ts"],"sourcesContent":["/** Same rules as getCorrectId in helpers/index (avoid barrel circular import). */\nfunction parseLocalIdOrUid(localIdOrUid: string): { localId?: string; uid?: string } {\n const id = { localId: undefined as string | undefined, uid: undefined as string | undefined }\n if (!localIdOrUid) return id\n if (localIdOrUid.length === 10) {\n id.localId = localIdOrUid\n }\n if (localIdOrUid.startsWith('0x') && localIdOrUid.length === 66) {\n id.uid = localIdOrUid\n }\n return id\n}\n\nexport function normalizeRelationPropertyValue(value: unknown): string | undefined {\n if (value == null) return undefined\n if (typeof value === 'string') {\n const t = value.trim()\n return t !== '' ? t : undefined\n }\n if (typeof value === 'object' && value !== null) {\n const o = value as { seedLocalId?: string; seedUid?: string }\n if (typeof o.seedLocalId === 'string' && o.seedLocalId.trim() !== '') {\n return o.seedLocalId.trim()\n }\n if (typeof o.seedUid === 'string' && o.seedUid.trim() !== '') {\n return o.seedUid.trim()\n }\n }\n return undefined\n}\n\nconst LOCAL_SEED_REF = /^[a-zA-Z0-9_-]{10,21}$/\n\nexport function resolveSeedIdsFromRefString(s: string): {\n seedLocalId?: string\n seedUid?: string\n} {\n const fromCorrect = parseLocalIdOrUid(s)\n if (fromCorrect.localId || fromCorrect.uid) {\n return { seedLocalId: fromCorrect.localId, seedUid: fromCorrect.uid }\n }\n if (LOCAL_SEED_REF.test(s) && !s.startsWith('0x')) {\n return { seedLocalId: s }\n }\n return {}\n}\n","import { BaseArweaveClient } from './ArweaveClient/BaseArweaveClient.js'\nimport {\n normalizeRelationPropertyValue,\n resolveSeedIdsFromRefString,\n} from './relationSeedRef.js'\n\nexport type FeedFieldRole = 'image' | 'file' | 'html' | 'text'\n\nexport type FeedFieldDescriptor = {\n role: FeedFieldRole\n treatAs?: 'arweaveTx' | 'seedUid' | 'url'\n}\n\nexport type FeedFieldManifest = Record<string, FeedFieldDescriptor>\n\nexport type ClassifyMediaRefOptions = {\n treatAs?: FeedFieldDescriptor['treatAs']\n}\n\nexport type MediaRefClassification =\n | { kind: 'empty' }\n | { kind: 'url'; href: string }\n | { kind: 'seedUid'; uid: string }\n | { kind: 'seedLocalId'; localId: string }\n | { kind: 'arweaveTxId'; txId: string }\n | { kind: 'unknown'; raw: string }\n\nexport type ResolveMediaRefResult =\n | { status: 'ready'; href: string; source: 'direct' | 'gateway' | 'localBlob' }\n | { status: 'empty' }\n | {\n status: 'unresolved'\n reason: string\n classification: MediaRefClassification\n }\n\nexport type ResolveMediaRefOptions = ClassifyMediaRefOptions\n\nconst ARWEAVE_TX_ID = /^[a-zA-Z0-9_-]{43}$/\n\nfunction trimOrEmpty(raw: string | undefined | null): string {\n if (raw == null) return ''\n return typeof raw === 'string' ? raw.trim() : String(raw).trim()\n}\n\nfunction coalesceStringField(item: Record<string, unknown>, key: string): string {\n const v = item[key]\n if (v == null) return ''\n if (typeof v === 'string') return v.trim()\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n return ''\n}\n\nfunction unwrapRelationString(raw: string): string {\n const t = raw.trim()\n if (!t) return t\n try {\n const parsed = JSON.parse(t) as unknown\n const fromObj = normalizeRelationPropertyValue(parsed)\n if (fromObj) return fromObj\n } catch {\n // not JSON\n }\n return t\n}\n\nexport function classifyMediaRef(\n raw: string,\n options?: ClassifyMediaRefOptions,\n): MediaRefClassification {\n const s = trimOrEmpty(raw)\n if (!s) {\n return { kind: 'empty' }\n }\n\n const treatAs = options?.treatAs\n if (treatAs === 'url') {\n return { kind: 'url', href: s }\n }\n if (treatAs === 'arweaveTx') {\n return { kind: 'arweaveTxId', txId: s }\n }\n if (treatAs === 'seedUid') {\n if (s.startsWith('0x') && s.length === 66) {\n return { kind: 'seedUid', uid: s }\n }\n return { kind: 'unknown', raw: s }\n }\n\n if (\n s.startsWith('http://') ||\n s.startsWith('https://') ||\n s.startsWith('blob:') ||\n s.startsWith('data:')\n ) {\n return { kind: 'url', href: s }\n }\n\n const unwrapped = unwrapRelationString(s)\n const ids = resolveSeedIdsFromRefString(unwrapped)\n if (ids.seedUid) {\n return { kind: 'seedUid', uid: ids.seedUid }\n }\n if (ids.seedLocalId) {\n return { kind: 'seedLocalId', localId: ids.seedLocalId }\n }\n\n if (unwrapped.startsWith('0x') && unwrapped.length === 66) {\n return { kind: 'seedUid', uid: unwrapped }\n }\n\n if (ARWEAVE_TX_ID.test(unwrapped) && !unwrapped.startsWith('0x')) {\n return { kind: 'arweaveTxId', txId: unwrapped }\n }\n\n return { kind: 'unknown', raw: s }\n}\n\nexport type NormalizedMediaField = {\n role: 'image' | 'file'\n raw: string\n classification: MediaRefClassification\n}\n\nexport type NormalizedHtmlField = {\n role: 'html'\n raw: string\n}\n\nexport type NormalizedTextField = {\n role: 'text'\n raw: string\n}\n\nexport type NormalizedFeedFieldValue =\n | NormalizedMediaField\n | NormalizedHtmlField\n | NormalizedTextField\n\nexport function getFeedItemStringField(item: Record<string, unknown>, key: string): string {\n const direct = coalesceStringField(item, key)\n if (direct) return direct\n const snake = key.replace(/[A-Z]/g, (l) => `_${l.toLowerCase()}`)\n if (snake !== key) {\n const alt = coalesceStringField(item, snake)\n if (alt) return alt\n }\n const parts = key.split('_')\n if (parts.length > 1) {\n const camel =\n parts[0] + parts.slice(1).map((p) => p.charAt(0).toUpperCase() + p.slice(1)).join('')\n const alt2 = coalesceStringField(item, camel)\n if (alt2) return alt2\n }\n return ''\n}\n\nexport function normalizeFeedItemFields(\n item: Record<string, unknown>,\n manifest: FeedFieldManifest,\n): Record<string, NormalizedFeedFieldValue | undefined> {\n const out: Record<string, NormalizedFeedFieldValue | undefined> = {}\n for (const [fieldKey, descriptor] of Object.entries(manifest)) {\n const raw = getFeedItemStringField(item, fieldKey)\n if (!raw) {\n out[fieldKey] = undefined\n continue\n }\n if (descriptor.role === 'html') {\n out[fieldKey] = { role: 'html', raw }\n continue\n }\n if (descriptor.role === 'text') {\n out[fieldKey] = { role: 'text', raw }\n continue\n }\n const classification = classifyMediaRef(raw, { treatAs: descriptor.treatAs })\n out[fieldKey] = {\n role: descriptor.role,\n raw,\n classification,\n }\n }\n return out\n}\n\nexport function getArweaveUrlForTransaction(transactionId: string): string {\n return `${BaseArweaveClient.getBaseUrl()}/${transactionId}`\n}\n","import { BaseArweaveClient } from './BaseArweaveClient.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\n\nconst READ_GATEWAY_CACHE_TTL_MS = 3 * 60 * 1000\nconst PROBE_TIMEOUT_MS = 5000\n\nlet readGatewayCache: { host: string; expiresAt: number } | null = null\nlet ensureInFlight: Promise<string> | null = null\n\n/** Clears cached read gateway (e.g. after tests or to force a fresh probe). */\nexport function invalidateReadGatewayCache(): void {\n readGatewayCache = null\n ensureInFlight = null\n}\n\n/** Clears probe cache, env override suppression, and preferred host (for tests). */\nexport function resetArweaveReadGatewayForTests(): void {\n invalidateReadGatewayCache()\n BaseArweaveClient.resetReadGatewaySelectionStateForTests()\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n BaseArweaveClient.setPreferredReadGateway(DEFAULT_ARWEAVE_HOST)\n }\n}\n\n/**\n * GET /info with timeout. Treat 2xx + JSON object as healthy.\n */\nexport async function probeGateway(baseUrl: string, signal?: AbortSignal): Promise<boolean> {\n const url = `${baseUrl.replace(/\\/$/, '')}/info`\n let timer: ReturnType<typeof setTimeout> | undefined\n const controller = new AbortController()\n const effectiveSignal = signal ?? controller.signal\n if (!signal) {\n timer = setTimeout(() => controller.abort(), PROBE_TIMEOUT_MS)\n }\n try {\n const response = await fetch(url, {\n method: 'GET',\n signal: effectiveSignal,\n headers: { Accept: 'application/json' },\n })\n if (!response.ok) return false\n const text = await response.text()\n if (!text.trim()) return false\n try {\n const json = JSON.parse(text) as unknown\n return typeof json === 'object' && json !== null\n } catch {\n return false\n }\n } catch {\n return false\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nexport async function selectFirstHealthyReadGateway(\n hosts: string[],\n protocol: 'http' | 'https' = 'https',\n signal?: AbortSignal,\n): Promise<string | null> {\n for (const host of hosts) {\n const h = host.trim().replace(/\\/$/, '')\n if (!h) continue\n const baseUrl = `${protocol}://${h}`\n if (await probeGateway(baseUrl, signal)) {\n return h\n }\n }\n return null\n}\n\nfunction buildOrderedHostsForProbe(): string[] {\n return getArweaveReadGatewayHostsForPrimary(BaseArweaveClient.getHost())\n}\n\n/**\n * Probes gateways in order and applies the first healthy host via {@link BaseArweaveClient.applyProbedReadGateway}.\n * No-op when the read gateway is locked ({@link BaseArweaveClient.setHost}).\n * Uses a short TTL cache to avoid probing on every read.\n */\nexport async function ensureReadGatewaySelected(signal?: AbortSignal): Promise<string> {\n if (BaseArweaveClient.isReadGatewayLocked()) {\n return BaseArweaveClient.getHost()\n }\n\n const now = Date.now()\n if (readGatewayCache && now < readGatewayCache.expiresAt) {\n return readGatewayCache.host\n }\n\n if (ensureInFlight) {\n return ensureInFlight\n }\n\n ensureInFlight = (async () => {\n const ordered = buildOrderedHostsForProbe()\n const protocol = BaseArweaveClient.getProtocol()\n const picked = await selectFirstHealthyReadGateway(ordered, protocol, signal)\n\n if (!BaseArweaveClient.isReadGatewayLocked()) {\n if (picked) {\n BaseArweaveClient.applyProbedReadGateway(picked)\n }\n }\n\n readGatewayCache = {\n host: BaseArweaveClient.getHost(),\n expiresAt: Date.now() + READ_GATEWAY_CACHE_TTL_MS,\n }\n return readGatewayCache.host\n })()\n\n try {\n return await ensureInFlight\n } finally {\n ensureInFlight = null\n }\n}\n","import type { TransactionStatus } from '../types/arweave.js'\n\n/**\n * Trim and strip a trailing slash from an upload API base URL.\n */\nexport function normalizeUploadApiBaseUrl(baseUrl: string): string {\n return baseUrl.trim().replace(/\\/+$/, '')\n}\n\n/**\n * URL used to verify that an upload is available via the Seed upload API\n * (`GET` → HTTP 200 when present). Works for L1 transaction ids and ANS-104 data item ids.\n *\n * @param baseUrl - Upload API origin (e.g. from `ARWEAVE_UPLOAD_API_BASE_URL` / `uploadApiBaseUrl`)\n * @param txOrDataItemId - Arweave tx id or bundler data item id\n */\nexport function getUploadApiArweaveDataUrl(baseUrl: string, txOrDataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(txOrDataItemId)\n return `${base}/api/upload/arweave/data/${id}`\n}\n\nconst DEFAULT_UPLOAD_STATUS_TIMEOUT_MS = 45_000\n\nexport type GetUploadPipelineTransactionStatusOptions = {\n /** Abort the request after this many ms (upload API hung / unreachable). Default 45s. */\n timeoutMs?: number\n}\n\n/**\n * Presence check against the upload API data route (same semantics as\n * {@link BaseArweaveClient.getTransactionStatus} for gateways: 200 = present, 404 = missing).\n */\nexport async function getUploadPipelineTransactionStatus(\n uploadApiBaseUrl: string,\n txOrDataItemId: string,\n options?: GetUploadPipelineTransactionStatusOptions,\n): Promise<TransactionStatus> {\n const url = getUploadApiArweaveDataUrl(uploadApiBaseUrl, txOrDataItemId)\n const timeoutMs = options?.timeoutMs ?? DEFAULT_UPLOAD_STATUS_TIMEOUT_MS\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs)\n\n try {\n const response = await fetch(url, { signal: controller.signal })\n clearTimeout(timeoutId)\n\n if (response.status === 404) {\n return { status: 404, confirmed: null }\n }\n\n if (!response.ok) {\n return { status: response.status, confirmed: null }\n }\n\n if (response.body) {\n await response.body.cancel()\n }\n\n return { status: 200, confirmed: null }\n } catch (err) {\n clearTimeout(timeoutId)\n if (err instanceof Error && err.name === 'AbortError') {\n return { status: 504, confirmed: null }\n }\n return { status: 500, confirmed: null }\n }\n}\n","import {\n getDefaultArweaveReadGatewayHostsOrdered,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport { normalizeUploadApiBaseUrl } from './uploadApiVerification.js'\nimport { probeGateway } from './selectReadGateway.js'\n\n/** Response shape from `GET /api/upload/arweave/status/{dataItemId}`. */\nexport interface ArweaveUploadStatusResponse {\n dataItemId?: string\n phase?: string\n bundleId?: string\n turboStatus?: string\n turboInfo?: string\n winc?: string\n turbo?: {\n status?: string\n bundleId?: string\n info?: string\n winc?: string\n }\n l1?: {\n checked?: boolean\n httpStatus?: number\n confirmed?: boolean\n numberOfConfirmations?: number\n minConfirmationsRequired?: number\n meetsMinConfirmations?: boolean\n }\n}\n\nexport interface ArweaveGatewayTransactionQueryResult {\n /** GraphQL `transaction.id` (often same as data item id for ANS-104 items). */\n transactionId: string | null\n /** L1 bundle transaction id when the item is indexed as bundled. */\n bundledInId: string | null\n blockHeight?: number | null\n blockTimestamp?: number | null\n}\n\nconst GATEWAY_TX_QUERY = `\n query ArweaveGatewayTransaction($id: String!) {\n transaction(id: $id) {\n id\n bundledIn {\n id\n }\n block {\n height\n timestamp\n }\n }\n }\n`\n\nexport function getUploadApiArweaveStatusUrl(baseUrl: string, dataItemId: string): string {\n const base = normalizeUploadApiBaseUrl(baseUrl)\n const id = encodeURIComponent(dataItemId)\n return `${base}/api/upload/arweave/status/${id}`\n}\n\n/**\n * Whether L1 anchoring is complete per upload API status JSON.\n */\nexport function isArweaveL1AnchoringComplete(status: ArweaveUploadStatusResponse): boolean {\n const l1 = status.l1\n if (!l1) return false\n if (l1.meetsMinConfirmations === true) return true\n if (l1.confirmed === true) return true\n return false\n}\n\n/**\n * Fetches JSON from `GET /api/upload/arweave/status/{dataItemId}`.\n * Returns `null` if the response is not OK or body is not JSON.\n */\nexport async function getArweaveUploadStatus(\n uploadApiBaseUrl: string,\n dataItemId: string,\n): Promise<ArweaveUploadStatusResponse | null> {\n const url = getUploadApiArweaveStatusUrl(uploadApiBaseUrl, dataItemId)\n try {\n const response = await fetch(url)\n if (!response.ok) {\n return null\n }\n const body = (await response.json()) as ArweaveUploadStatusResponse\n return body && typeof body === 'object' ? body : null\n } catch {\n return null\n }\n}\n\n/**\n * Queries an Arweave gateway GraphQL API for transaction + bundle info.\n */\nexport async function queryArweaveGatewayTransaction(\n graphqlUrl: string,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const url = graphqlUrl.trim()\n if (!url) return null\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n query: GATEWAY_TX_QUERY,\n variables: { id: dataItemId },\n }),\n signal: init?.signal,\n })\n\n if (!response.ok) {\n return null\n }\n\n const json = (await response.json()) as {\n data?: {\n transaction?: {\n id?: string\n bundledIn?: { id?: string } | null\n block?: { height?: number; timestamp?: number } | null\n } | null\n }\n errors?: unknown\n }\n\n if (json.errors) {\n return null\n }\n\n const tx = json.data?.transaction\n if (!tx) {\n return {\n transactionId: null,\n bundledInId: null,\n blockHeight: null,\n blockTimestamp: null,\n }\n }\n\n return {\n transactionId: typeof tx.id === 'string' ? tx.id : null,\n bundledInId: tx.bundledIn?.id != null ? String(tx.bundledIn.id) : null,\n blockHeight: tx.block?.height ?? null,\n blockTimestamp: tx.block?.timestamp ?? null,\n }\n } catch {\n return null\n }\n}\n\n/**\n * Resolves GraphQL against the first healthy gateway (GET /info probe per host), then runs\n * {@link queryArweaveGatewayTransaction}. Host order: optional `graphqlUrl` hostname first, then\n * {@link getDefaultArweaveReadGatewayHostsOrdered}.\n */\nexport async function queryArweaveGatewayTransactionWithFallback(\n graphqlUrl: string | undefined,\n dataItemId: string,\n init?: Pick<RequestInit, 'signal'>,\n): Promise<ArweaveGatewayTransactionQueryResult | null> {\n const defaults = getDefaultArweaveReadGatewayHostsOrdered()\n const trimmed = graphqlUrl?.trim()\n let protocol: 'http' | 'https' = 'https'\n let preferredHost: string | null = null\n if (trimmed) {\n try {\n const u = new URL(trimmed)\n protocol = u.protocol === 'http:' ? 'http' : 'https'\n preferredHost = u.hostname || null\n } catch {\n preferredHost = null\n }\n }\n\n const ordered =\n preferredHost && preferredHost.length > 0\n ? getArweaveReadGatewayHostsForPrimary(preferredHost)\n : [...defaults]\n\n const signal = init?.signal\n for (const host of ordered) {\n const base = `${protocol}://${host}`\n if (!(await probeGateway(base, signal ?? undefined))) continue\n const gqlUrl = `${protocol}://${host}/graphql`\n const result = await queryArweaveGatewayTransaction(gqlUrl, dataItemId, init)\n if (result !== null) {\n return result\n }\n }\n return null\n}\n","import type { ResolvedSeedGatewayEndpoints } from '../types/gateway.js'\n\nlet resolvedGatewayEndpoints: ResolvedSeedGatewayEndpoints | null = null\n\n/** Last endpoints applied during client init (for read-path helpers). */\nexport function getResolvedSeedGatewayEndpoints(): ResolvedSeedGatewayEndpoints | null {\n return resolvedGatewayEndpoints\n}\n\nexport function setResolvedSeedGatewayEndpoints(\n value: ResolvedSeedGatewayEndpoints | null,\n): void {\n resolvedGatewayEndpoints = value\n}\n","import { probeGateway } from '../ArweaveClient/selectReadGateway.js'\nimport {\n DEFAULT_ARWEAVE_HOST,\n DEFAULT_GATEWAY_SIDECAR_HOST,\n DEFAULT_GATEWAY_SIDECAR_PORT,\n getArweaveReadGatewayHostsForPrimary,\n} from '../constants.js'\nimport type {\n ResolvedSeedGatewayEndpoints,\n SeedGatewayConfig,\n SeedGatewayTransportMode,\n} from '../types/gateway.js'\n\nconst SIDECAR_PROBE_TTL_MS = 3 * 60 * 1000\n\nlet sidecarProbeCache: { healthy: boolean; expiresAt: number } | null = null\n\n/** Clears cached sidecar probe (tests / forced re-probe). */\nexport function invalidateSidecarProbeCache(): void {\n sidecarProbeCache = null\n}\n\nfunction parseGatewayHost(input: string | undefined): { host: string; protocol: 'http' | 'https' } {\n const raw = (input ?? DEFAULT_ARWEAVE_HOST).trim()\n if (raw.startsWith('http://')) {\n return { protocol: 'http', host: raw.slice(7).replace(/\\/$/, '') }\n }\n if (raw.startsWith('https://')) {\n return { protocol: 'https', host: raw.slice(8).replace(/\\/$/, '') }\n }\n return { protocol: 'https', host: raw.replace(/\\/$/, '') }\n}\n\nfunction sidecarOrigin(config: SeedGatewayConfig): {\n host: string\n port: number\n baseUrl: string\n} {\n const host = config.hyper?.localSidecarHost?.trim() || DEFAULT_GATEWAY_SIDECAR_HOST\n const port = config.hyper?.localSidecarPort ?? DEFAULT_GATEWAY_SIDECAR_PORT\n const hostWithPort = port === 80 || port === 443 ? host : `${host}:${port}`\n return {\n host: hostWithPort,\n port,\n baseUrl: `http://${host}:${port}`,\n }\n}\n\nasync function probeSidecarHealthy(baseUrl: string, signal?: AbortSignal): Promise<boolean> {\n const now = Date.now()\n if (sidecarProbeCache && now < sidecarProbeCache.expiresAt) {\n return sidecarProbeCache.healthy\n }\n\n const healthy = await probeGateway(baseUrl, signal)\n sidecarProbeCache = {\n healthy,\n expiresAt: now + SIDECAR_PROBE_TTL_MS,\n }\n return healthy\n}\n\nfunction buildHttpEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const { host, protocol } = parseGatewayHost(config.arweaveDomain)\n const baseUrl = `${protocol}://${host}`\n const uploadApiBaseUrl = config.uploadApiBaseUrl?.trim() || baseUrl\n return {\n mode: config.transport ?? 'http-gateway',\n arweaveHost: host,\n arweaveProtocol: protocol,\n arweaveBaseUrl: baseUrl,\n arweaveGraphqlUrl: `${protocol}://${host}/graphql`,\n uploadApiBaseUrl,\n activePath: 'http',\n gatewayHyperKey: config.hyper?.gatewayHyperKey?.trim() || undefined,\n }\n}\n\nfunction buildHyperEndpoints(config: SeedGatewayConfig): ResolvedSeedGatewayEndpoints {\n const sidecar = sidecarOrigin(config)\n const key = config.hyper?.gatewayHyperKey?.trim()\n return {\n mode: 'hyper',\n arweaveHost: sidecar.host,\n arweaveProtocol: 'http',\n arweaveBaseUrl: sidecar.baseUrl,\n arweaveGraphqlUrl: `${sidecar.baseUrl}/graphql`,\n uploadApiBaseUrl: sidecar.baseUrl,\n activePath: 'hyper-sidecar',\n gatewayHyperKey: key || undefined,\n }\n}\n\nexport type ResolveSeedGatewayEndpointsOptions = {\n signal?: AbortSignal\n /** Skip cache and probe sidecar again (hybrid). */\n forceSidecarProbe?: boolean\n}\n\n/**\n * Resolve effective gateway + upload API URLs for the configured transport mode.\n */\nexport async function resolveSeedGatewayEndpoints(\n config: SeedGatewayConfig,\n options?: ResolveSeedGatewayEndpointsOptions,\n): Promise<ResolvedSeedGatewayEndpoints> {\n if (options?.forceSidecarProbe) {\n invalidateSidecarProbeCache()\n }\n\n const mode: SeedGatewayTransportMode = config.transport ?? 'http-gateway'\n\n if (mode === 'http-gateway') {\n return buildHttpEndpoints({ ...config, transport: mode })\n }\n\n if (mode === 'hyper') {\n const hyperEndpoints = buildHyperEndpoints(config)\n const shouldProbe = config.hyper?.probeSidecar !== false\n if (shouldProbe) {\n const ok = await probeSidecarHealthy(hyperEndpoints.arweaveBaseUrl, options?.signal)\n if (!ok) {\n throw new Error(\n `Gateway Hyper sidecar not reachable at ${hyperEndpoints.arweaveBaseUrl}. ` +\n 'Run: seed gateway tunnel connect <operator-z32-key>',\n )\n }\n }\n return hyperEndpoints\n }\n\n // hybrid\n const sidecar = sidecarOrigin(config)\n const shouldProbe = config.hyper?.probeSidecar !== false\n if (shouldProbe && (await probeSidecarHealthy(sidecar.baseUrl, options?.signal))) {\n return buildHyperEndpoints({ ...config, transport: 'hyper' })\n }\n\n const http = buildHttpEndpoints({ ...config, transport: 'http-gateway' })\n return {\n ...http,\n mode: 'hybrid',\n activePath: 'hybrid-fallback-http',\n }\n}\n\n/** Build ordered gateway host list for read fallback (sidecar first in hybrid when active). */\nexport function getReadGatewayHostsForConfig(\n resolved: ResolvedSeedGatewayEndpoints,\n _defaults?: readonly string[],\n): string[] {\n if (resolved.activePath === 'hyper-sidecar') {\n return [resolved.arweaveHost]\n }\n return getArweaveReadGatewayHostsForPrimary(resolved.arweaveHost)\n}\n","import type {\n ClientGatewayContextInput,\n SeedConfigGatewayInput,\n SeedGatewayConfig,\n} from '../types/seedConfig.js'\nimport { DEFAULT_SEED_GATEWAY_HYPER_KEY } from '../constants.js'\n\n/** Merge seed.config gateway fields into {@link SeedGatewayConfig}. */\nexport function seedGatewayConfigFromSeedConfig(\n config: SeedConfigGatewayInput,\n): SeedGatewayConfig {\n const gateway = config.gateway ?? {}\n return {\n transport: gateway.transport,\n arweaveDomain: config.arweaveDomain ?? gateway.arweaveDomain,\n uploadApiBaseUrl: config.uploadApiBaseUrl ?? gateway.uploadApiBaseUrl,\n hyper: {\n gatewayHyperKey:\n gateway.hyper?.gatewayHyperKey?.trim() ||\n gateway.gatewayHyperKey?.trim() ||\n DEFAULT_SEED_GATEWAY_HYPER_KEY ||\n undefined,\n localSidecarHost: gateway.hyper?.localSidecarHost ?? gateway.localSidecarHost,\n localSidecarPort: gateway.hyper?.localSidecarPort ?? gateway.localSidecarPort,\n probeSidecar: gateway.hyper?.probeSidecar ?? gateway.probeSidecar,\n },\n }\n}\n\nexport function seedGatewayConfigFromClientContext(\n context: ClientGatewayContextInput,\n): SeedGatewayConfig {\n return {\n transport: context.gatewayTransport,\n arweaveDomain: context.arweaveDomain,\n uploadApiBaseUrl: context.uploadApiBaseUrl,\n hyper: {\n gatewayHyperKey:\n context.gatewayHyperKey?.trim() || DEFAULT_SEED_GATEWAY_HYPER_KEY || undefined,\n localSidecarHost: context.gatewaySidecarHost,\n localSidecarPort: context.gatewaySidecarPort,\n },\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export type FeedFieldRole = 'image' | 'file' | 'html' | 'text';
2
+ export type FeedFieldDescriptor = {
3
+ role: FeedFieldRole;
4
+ treatAs?: 'arweaveTx' | 'seedUid' | 'url';
5
+ };
6
+ export type FeedFieldManifest = Record<string, FeedFieldDescriptor>;
7
+ export type ClassifyMediaRefOptions = {
8
+ treatAs?: FeedFieldDescriptor['treatAs'];
9
+ };
10
+ export type MediaRefClassification = {
11
+ kind: 'empty';
12
+ } | {
13
+ kind: 'url';
14
+ href: string;
15
+ } | {
16
+ kind: 'seedUid';
17
+ uid: string;
18
+ } | {
19
+ kind: 'seedLocalId';
20
+ localId: string;
21
+ } | {
22
+ kind: 'arweaveTxId';
23
+ txId: string;
24
+ } | {
25
+ kind: 'unknown';
26
+ raw: string;
27
+ };
28
+ export type ResolveMediaRefResult = {
29
+ status: 'ready';
30
+ href: string;
31
+ source: 'direct' | 'gateway' | 'localBlob';
32
+ } | {
33
+ status: 'empty';
34
+ } | {
35
+ status: 'unresolved';
36
+ reason: string;
37
+ classification: MediaRefClassification;
38
+ };
39
+ export type ResolveMediaRefOptions = ClassifyMediaRefOptions;
40
+ export declare function classifyMediaRef(raw: string, options?: ClassifyMediaRefOptions): MediaRefClassification;
41
+ export type NormalizedMediaField = {
42
+ role: 'image' | 'file';
43
+ raw: string;
44
+ classification: MediaRefClassification;
45
+ };
46
+ export type NormalizedHtmlField = {
47
+ role: 'html';
48
+ raw: string;
49
+ };
50
+ export type NormalizedTextField = {
51
+ role: 'text';
52
+ raw: string;
53
+ };
54
+ export type NormalizedFeedFieldValue = NormalizedMediaField | NormalizedHtmlField | NormalizedTextField;
55
+ export declare function getFeedItemStringField(item: Record<string, unknown>, key: string): string;
56
+ export declare function normalizeFeedItemFields(item: Record<string, unknown>, manifest: FeedFieldManifest): Record<string, NormalizedFeedFieldValue | undefined>;
57
+ export declare function getArweaveUrlForTransaction(transactionId: string): string;
58
+ //# sourceMappingURL=mediaRef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaRef.d.ts","sourceRoot":"","sources":["../src/mediaRef.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAE9D,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,aAAa,CAAA;IACnB,OAAO,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,KAAK,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;AAEnE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpC,MAAM,MAAM,qBAAqB,GAC7B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;CAAE,GAC7E;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IACE,MAAM,EAAE,YAAY,CAAA;IACpB,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAEL,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AA8B5D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,sBAAsB,CA+CxB;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAA;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,cAAc,EAAE,sBAAsB,CAAA;CACvC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,wBAAwB,GAChC,oBAAoB,GACpB,mBAAmB,GACnB,mBAAmB,CAAA;AAEvB,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAgBzF;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,EAAE,iBAAiB,GAC1B,MAAM,CAAC,MAAM,EAAE,wBAAwB,GAAG,SAAS,CAAC,CAwBtD;AAED,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEzE"}
@@ -0,0 +1,14 @@
1
+ import type { IArweaveClient } from '../ArweaveClient/IArweaveClient.js';
2
+ import { GraphQLClient } from 'graphql-request';
3
+ import type { TransactionStatus, TransactionTag, GetDataOptions, DownloadFilesParams, DownloadResult, CreateTransactionOptions } from '../types/arweave.js';
4
+ export declare class NodeArweaveClient implements IArweaveClient {
5
+ getArweaveClient(): GraphQLClient;
6
+ getTransactionStatus(transactionId: string): Promise<TransactionStatus>;
7
+ getTransactionData(transactionId: string, options?: GetDataOptions): Promise<Uint8Array | string>;
8
+ getTransactionTags(transactionId: string): Promise<TransactionTag[]>;
9
+ createTransaction(data: string | Uint8Array, options?: CreateTransactionOptions): Promise<any>;
10
+ downloadFiles(params: DownloadFilesParams): Promise<DownloadResult[]>;
11
+ }
12
+ /** @deprecated Prefer NodeArweaveClient */
13
+ export declare const ArweaveClient: typeof NodeArweaveClient;
14
+ //# sourceMappingURL=ArweaveClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ArweaveClient.d.ts","sourceRoot":"","sources":["../../src/node/ArweaveClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,cAAc,EACd,wBAAwB,EACzB,MAAM,qBAAqB,CAAC;AAwC7B,qBAAa,iBAAkB,YAAW,cAAc;IACtD,gBAAgB,IAAI,aAAa;IAI3B,oBAAoB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqCvE,kBAAkB,CACtB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC;IA8BzB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBpE,iBAAiB,CACrB,IAAI,EAAE,MAAM,GAAG,UAAU,EACzB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,GAAG,CAAC;IAiBT,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAgD5E;AAED,2CAA2C;AAC3C,eAAO,MAAM,aAAa,0BAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import './ArweaveClient.js';
2
+ export { ArweaveClient, NodeArweaveClient } from './ArweaveClient.js';
3
+ /** Register Node.js Arweave client and set default read gateway host. */
4
+ export declare function registerNodeArweavePlatform(options?: {
5
+ arweaveDomain?: string;
6
+ }): void;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAK3B,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAErE,yEAAyE;AACzE,wBAAgB,2BAA2B,CAAC,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGtF"}