@arke-institute/sdk 0.1.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +126 -184
  2. package/dist/generated/index.cjs +19 -0
  3. package/dist/generated/index.cjs.map +1 -0
  4. package/dist/generated/index.d.cts +6192 -0
  5. package/dist/generated/index.d.ts +6192 -0
  6. package/dist/generated/index.js +1 -0
  7. package/dist/generated/index.js.map +1 -0
  8. package/dist/index-BrXke2kI.d.ts +302 -0
  9. package/dist/index-FHcLPBSV.d.cts +302 -0
  10. package/dist/index.cjs +188 -4254
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +62 -7
  13. package/dist/index.d.ts +62 -7
  14. package/dist/index.js +168 -4226
  15. package/dist/index.js.map +1 -1
  16. package/dist/operations/index.cjs +113 -0
  17. package/dist/operations/index.cjs.map +1 -0
  18. package/dist/operations/index.d.cts +3 -0
  19. package/dist/operations/index.d.ts +3 -0
  20. package/dist/operations/index.js +84 -0
  21. package/dist/operations/index.js.map +1 -0
  22. package/package.json +44 -53
  23. package/dist/client-dAk3E64p.d.cts +0 -183
  24. package/dist/client-dAk3E64p.d.ts +0 -183
  25. package/dist/collections/index.cjs +0 -233
  26. package/dist/collections/index.cjs.map +0 -1
  27. package/dist/collections/index.d.cts +0 -9
  28. package/dist/collections/index.d.ts +0 -9
  29. package/dist/collections/index.js +0 -205
  30. package/dist/collections/index.js.map +0 -1
  31. package/dist/content/index.cjs +0 -591
  32. package/dist/content/index.cjs.map +0 -1
  33. package/dist/content/index.d.cts +0 -516
  34. package/dist/content/index.d.ts +0 -516
  35. package/dist/content/index.js +0 -558
  36. package/dist/content/index.js.map +0 -1
  37. package/dist/edit/index.cjs +0 -1503
  38. package/dist/edit/index.cjs.map +0 -1
  39. package/dist/edit/index.d.cts +0 -78
  40. package/dist/edit/index.d.ts +0 -78
  41. package/dist/edit/index.js +0 -1447
  42. package/dist/edit/index.js.map +0 -1
  43. package/dist/errors-3L7IiHcr.d.cts +0 -480
  44. package/dist/errors-BTe8GKRQ.d.ts +0 -480
  45. package/dist/errors-CT7yzKkU.d.cts +0 -874
  46. package/dist/errors-CT7yzKkU.d.ts +0 -874
  47. package/dist/graph/index.cjs +0 -427
  48. package/dist/graph/index.cjs.map +0 -1
  49. package/dist/graph/index.d.cts +0 -485
  50. package/dist/graph/index.d.ts +0 -485
  51. package/dist/graph/index.js +0 -396
  52. package/dist/graph/index.js.map +0 -1
  53. package/dist/query/index.cjs +0 -356
  54. package/dist/query/index.cjs.map +0 -1
  55. package/dist/query/index.d.cts +0 -636
  56. package/dist/query/index.d.ts +0 -636
  57. package/dist/query/index.js +0 -328
  58. package/dist/query/index.js.map +0 -1
  59. package/dist/upload/index.cjs +0 -1634
  60. package/dist/upload/index.cjs.map +0 -1
  61. package/dist/upload/index.d.cts +0 -150
  62. package/dist/upload/index.d.ts +0 -150
  63. package/dist/upload/index.js +0 -1597
  64. package/dist/upload/index.js.map +0 -1
@@ -1,558 +0,0 @@
1
- // src/content/errors.ts
2
- var ContentError = class extends Error {
3
- constructor(message, code = "CONTENT_ERROR", details) {
4
- super(message);
5
- this.code = code;
6
- this.details = details;
7
- this.name = "ContentError";
8
- }
9
- };
10
- var EntityNotFoundError = class extends ContentError {
11
- constructor(id) {
12
- super(`Entity not found: ${id}`, "ENTITY_NOT_FOUND", { id });
13
- this.name = "EntityNotFoundError";
14
- }
15
- };
16
- var ContentNotFoundError = class extends ContentError {
17
- constructor(cid) {
18
- super(`Content not found: ${cid}`, "CONTENT_NOT_FOUND", { cid });
19
- this.name = "ContentNotFoundError";
20
- }
21
- };
22
- var ComponentNotFoundError = class extends ContentError {
23
- constructor(id, componentName) {
24
- super(
25
- `Component '${componentName}' not found on entity ${id}`,
26
- "COMPONENT_NOT_FOUND",
27
- { id, componentName }
28
- );
29
- this.name = "ComponentNotFoundError";
30
- }
31
- };
32
- var VersionNotFoundError = class extends ContentError {
33
- constructor(id, selector) {
34
- super(
35
- `Version not found: ${selector} for entity ${id}`,
36
- "VERSION_NOT_FOUND",
37
- { id, selector }
38
- );
39
- this.name = "VersionNotFoundError";
40
- }
41
- };
42
- var NetworkError = class extends ContentError {
43
- constructor(message, statusCode) {
44
- super(message, "NETWORK_ERROR", { statusCode });
45
- this.statusCode = statusCode;
46
- this.name = "NetworkError";
47
- }
48
- };
49
-
50
- // src/content/client.ts
51
- var ContentClient = class {
52
- constructor(config) {
53
- this.baseUrl = config.gatewayUrl.replace(/\/$/, "");
54
- this.fetchImpl = config.fetchImpl ?? fetch;
55
- }
56
- // ---------------------------------------------------------------------------
57
- // Request helpers
58
- // ---------------------------------------------------------------------------
59
- buildUrl(path, query) {
60
- const url = new URL(`${this.baseUrl}${path}`);
61
- if (query) {
62
- Object.entries(query).forEach(([key, value]) => {
63
- if (value !== void 0 && value !== null) {
64
- url.searchParams.set(key, String(value));
65
- }
66
- });
67
- }
68
- return url.toString();
69
- }
70
- async request(path, options = {}) {
71
- const url = this.buildUrl(path, options.query);
72
- const headers = new Headers({ "Content-Type": "application/json" });
73
- if (options.headers) {
74
- Object.entries(options.headers).forEach(([k, v]) => {
75
- if (v !== void 0) headers.set(k, v);
76
- });
77
- }
78
- let response;
79
- try {
80
- response = await this.fetchImpl(url, { ...options, headers });
81
- } catch (err) {
82
- throw new NetworkError(
83
- err instanceof Error ? err.message : "Network request failed"
84
- );
85
- }
86
- if (response.ok) {
87
- const contentType = response.headers.get("content-type") || "";
88
- if (contentType.includes("application/json")) {
89
- return await response.json();
90
- }
91
- return await response.text();
92
- }
93
- let body;
94
- const text = await response.text();
95
- try {
96
- body = JSON.parse(text);
97
- } catch {
98
- body = text;
99
- }
100
- if (response.status === 404) {
101
- const errorCode = body?.error;
102
- if (errorCode === "NOT_FOUND" || errorCode === "ENTITY_NOT_FOUND") {
103
- throw new ContentError(
104
- body?.message || "Not found",
105
- "NOT_FOUND",
106
- body
107
- );
108
- }
109
- }
110
- const message = body?.error && typeof body.error === "string" ? body.error : body?.message && typeof body.message === "string" ? body.message : `Request failed with status ${response.status}`;
111
- throw new ContentError(message, "HTTP_ERROR", {
112
- status: response.status,
113
- body
114
- });
115
- }
116
- // ---------------------------------------------------------------------------
117
- // Entity Operations
118
- // ---------------------------------------------------------------------------
119
- /**
120
- * Get an entity by its Persistent Identifier (PI).
121
- *
122
- * @param pi - Persistent Identifier (ULID or test PI with II prefix)
123
- * @returns Full entity manifest
124
- * @throws EntityNotFoundError if the entity doesn't exist
125
- *
126
- * @example
127
- * ```typescript
128
- * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');
129
- * console.log('Version:', entity.ver);
130
- * console.log('Components:', Object.keys(entity.components));
131
- * ```
132
- */
133
- async get(pi) {
134
- try {
135
- return await this.request(`/api/entities/${encodeURIComponent(pi)}`);
136
- } catch (err) {
137
- if (err instanceof ContentError && err.code === "NOT_FOUND") {
138
- throw new EntityNotFoundError(pi);
139
- }
140
- throw err;
141
- }
142
- }
143
- /**
144
- * List entities with pagination.
145
- *
146
- * @param options - Pagination and metadata options
147
- * @returns Paginated list of entity summaries
148
- *
149
- * @example
150
- * ```typescript
151
- * // Get first page
152
- * const page1 = await content.list({ limit: 20, include_metadata: true });
153
- *
154
- * // Get next page
155
- * if (page1.next_cursor) {
156
- * const page2 = await content.list({ cursor: page1.next_cursor });
157
- * }
158
- * ```
159
- */
160
- async list(options = {}) {
161
- return this.request("/api/entities", {
162
- query: {
163
- limit: options.limit,
164
- cursor: options.cursor,
165
- include_metadata: options.include_metadata
166
- }
167
- });
168
- }
169
- /**
170
- * Get version history for an entity.
171
- *
172
- * @param pi - Persistent Identifier
173
- * @param options - Pagination options
174
- * @returns Version history (newest first)
175
- *
176
- * @example
177
- * ```typescript
178
- * const history = await content.versions('01K75HQQXNTDG7BBP7PS9AWYAN');
179
- * console.log('Total versions:', history.items.length);
180
- * history.items.forEach(v => {
181
- * console.log(`v${v.ver}: ${v.ts} - ${v.note || 'no note'}`);
182
- * });
183
- * ```
184
- */
185
- async versions(pi, options = {}) {
186
- try {
187
- return await this.request(
188
- `/api/entities/${encodeURIComponent(pi)}/versions`,
189
- {
190
- query: {
191
- limit: options.limit,
192
- cursor: options.cursor
193
- }
194
- }
195
- );
196
- } catch (err) {
197
- if (err instanceof ContentError && err.code === "NOT_FOUND") {
198
- throw new EntityNotFoundError(pi);
199
- }
200
- throw err;
201
- }
202
- }
203
- /**
204
- * Get a specific version of an entity.
205
- *
206
- * @param pi - Persistent Identifier
207
- * @param selector - Version selector: 'ver:N' for version number or 'cid:...' for CID
208
- * @returns Entity manifest for the specified version
209
- *
210
- * @example
211
- * ```typescript
212
- * // Get version 2
213
- * const v2 = await content.getVersion('01K75HQQXNTDG7BBP7PS9AWYAN', 'ver:2');
214
- *
215
- * // Get by CID
216
- * const vByCid = await content.getVersion('01K75HQQXNTDG7BBP7PS9AWYAN', 'cid:bafybeih...');
217
- * ```
218
- */
219
- async getVersion(pi, selector) {
220
- try {
221
- return await this.request(
222
- `/api/entities/${encodeURIComponent(pi)}/versions/${encodeURIComponent(selector)}`
223
- );
224
- } catch (err) {
225
- if (err instanceof ContentError && err.code === "NOT_FOUND") {
226
- throw new EntityNotFoundError(pi);
227
- }
228
- throw err;
229
- }
230
- }
231
- /**
232
- * Resolve a PI to its tip CID (fast lookup without fetching manifest).
233
- *
234
- * @param pi - Persistent Identifier
235
- * @returns PI and tip CID
236
- *
237
- * @example
238
- * ```typescript
239
- * const { tip } = await content.resolve('01K75HQQXNTDG7BBP7PS9AWYAN');
240
- * console.log('Latest manifest CID:', tip);
241
- * ```
242
- */
243
- async resolve(pi) {
244
- try {
245
- return await this.request(`/api/resolve/${encodeURIComponent(pi)}`);
246
- } catch (err) {
247
- if (err instanceof ContentError && err.code === "NOT_FOUND") {
248
- throw new EntityNotFoundError(pi);
249
- }
250
- throw err;
251
- }
252
- }
253
- /**
254
- * Get the list of child PIs for an entity (fast, returns only PIs).
255
- *
256
- * @param pi - Persistent Identifier of parent entity
257
- * @returns Array of child PIs
258
- *
259
- * @example
260
- * ```typescript
261
- * const childPis = await content.children('01K75HQQXNTDG7BBP7PS9AWYAN');
262
- * console.log('Children:', childPis);
263
- * ```
264
- */
265
- async children(pi) {
266
- const entity = await this.get(pi);
267
- return entity.children_pi || [];
268
- }
269
- /**
270
- * Get all child entities for a parent (fetches full entity for each child).
271
- *
272
- * @param pi - Persistent Identifier of parent entity
273
- * @returns Array of child entities
274
- *
275
- * @example
276
- * ```typescript
277
- * const childEntities = await content.childrenEntities('01K75HQQXNTDG7BBP7PS9AWYAN');
278
- * childEntities.forEach(child => {
279
- * console.log(`${child.pi}: v${child.ver}`);
280
- * });
281
- * ```
282
- */
283
- async childrenEntities(pi) {
284
- const childPis = await this.children(pi);
285
- if (childPis.length === 0) {
286
- return [];
287
- }
288
- const results = await Promise.allSettled(
289
- childPis.map((childPi) => this.get(childPi))
290
- );
291
- return results.filter((r) => r.status === "fulfilled").map((r) => r.value);
292
- }
293
- /**
294
- * Get the Arke origin block (root of the archive tree).
295
- *
296
- * @returns Arke origin entity
297
- *
298
- * @example
299
- * ```typescript
300
- * const origin = await content.arke();
301
- * console.log('Arke origin:', origin.pi);
302
- * ```
303
- */
304
- async arke() {
305
- return this.request("/api/arke");
306
- }
307
- // ---------------------------------------------------------------------------
308
- // Content Download
309
- // ---------------------------------------------------------------------------
310
- /**
311
- * Download content by CID.
312
- *
313
- * Returns Blob in browser environments, Buffer in Node.js.
314
- *
315
- * @param cid - Content Identifier
316
- * @returns Content as Blob (browser) or Buffer (Node)
317
- * @throws ContentNotFoundError if the content doesn't exist
318
- *
319
- * @example
320
- * ```typescript
321
- * const content = await client.download('bafybeih...');
322
- *
323
- * // In browser
324
- * const url = URL.createObjectURL(content as Blob);
325
- *
326
- * // In Node.js
327
- * fs.writeFileSync('output.bin', content as Buffer);
328
- * ```
329
- */
330
- async download(cid) {
331
- const url = this.buildUrl(`/api/cat/${encodeURIComponent(cid)}`);
332
- let response;
333
- try {
334
- response = await this.fetchImpl(url);
335
- } catch (err) {
336
- throw new NetworkError(
337
- err instanceof Error ? err.message : "Network request failed"
338
- );
339
- }
340
- if (!response.ok) {
341
- if (response.status === 404) {
342
- throw new ContentNotFoundError(cid);
343
- }
344
- throw new ContentError(
345
- `Failed to download content: ${response.status}`,
346
- "DOWNLOAD_ERROR",
347
- { status: response.status }
348
- );
349
- }
350
- if (typeof window !== "undefined") {
351
- return response.blob();
352
- } else {
353
- const arrayBuffer = await response.arrayBuffer();
354
- return Buffer.from(arrayBuffer);
355
- }
356
- }
357
- /**
358
- * Get a direct URL for content by CID.
359
- *
360
- * This is useful for embedding in img tags or for direct downloads.
361
- *
362
- * @param cid - Content Identifier
363
- * @returns URL string
364
- *
365
- * @example
366
- * ```typescript
367
- * const url = content.getUrl('bafybeih...');
368
- * // Use in img tag: <img src={url} />
369
- * ```
370
- */
371
- getUrl(cid) {
372
- return `${this.baseUrl}/api/cat/${encodeURIComponent(cid)}`;
373
- }
374
- /**
375
- * Stream content by CID.
376
- *
377
- * @param cid - Content Identifier
378
- * @returns ReadableStream of the content
379
- * @throws ContentNotFoundError if the content doesn't exist
380
- *
381
- * @example
382
- * ```typescript
383
- * const stream = await content.stream('bafybeih...');
384
- * const reader = stream.getReader();
385
- * while (true) {
386
- * const { done, value } = await reader.read();
387
- * if (done) break;
388
- * // Process chunk
389
- * }
390
- * ```
391
- */
392
- async stream(cid) {
393
- const url = this.buildUrl(`/api/cat/${encodeURIComponent(cid)}`);
394
- let response;
395
- try {
396
- response = await this.fetchImpl(url);
397
- } catch (err) {
398
- throw new NetworkError(
399
- err instanceof Error ? err.message : "Network request failed"
400
- );
401
- }
402
- if (!response.ok) {
403
- if (response.status === 404) {
404
- throw new ContentNotFoundError(cid);
405
- }
406
- throw new ContentError(
407
- `Failed to stream content: ${response.status}`,
408
- "STREAM_ERROR",
409
- { status: response.status }
410
- );
411
- }
412
- if (!response.body) {
413
- throw new ContentError("Response body is not available", "STREAM_ERROR");
414
- }
415
- return response.body;
416
- }
417
- /**
418
- * Download a DAG node (JSON) by CID.
419
- *
420
- * Use this to fetch JSON components like properties and relationships.
421
- *
422
- * @param cid - Content Identifier of the DAG node
423
- * @returns Parsed JSON object
424
- * @throws ContentNotFoundError if the content doesn't exist
425
- *
426
- * @example
427
- * ```typescript
428
- * const relationships = await content.getDag<RelationshipsComponent>(
429
- * entity.components.relationships
430
- * );
431
- * console.log('Relationships:', relationships.relationships);
432
- * ```
433
- */
434
- async getDag(cid) {
435
- const url = this.buildUrl(`/api/dag/${encodeURIComponent(cid)}`);
436
- let response;
437
- try {
438
- response = await this.fetchImpl(url);
439
- } catch (err) {
440
- throw new NetworkError(
441
- err instanceof Error ? err.message : "Network request failed"
442
- );
443
- }
444
- if (!response.ok) {
445
- if (response.status === 404) {
446
- throw new ContentNotFoundError(cid);
447
- }
448
- throw new ContentError(
449
- `Failed to fetch DAG node: ${response.status}`,
450
- "DAG_ERROR",
451
- { status: response.status }
452
- );
453
- }
454
- return await response.json();
455
- }
456
- // ---------------------------------------------------------------------------
457
- // Component Helpers
458
- // ---------------------------------------------------------------------------
459
- /**
460
- * Download a component from an entity.
461
- *
462
- * @param entity - Entity containing the component
463
- * @param componentName - Name of the component (e.g., 'pinax', 'description', 'source')
464
- * @returns Component content as Blob (browser) or Buffer (Node)
465
- * @throws ComponentNotFoundError if the component doesn't exist
466
- *
467
- * @example
468
- * ```typescript
469
- * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');
470
- * const pinax = await content.getComponent(entity, 'pinax');
471
- * ```
472
- */
473
- async getComponent(entity, componentName) {
474
- const cid = entity.components[componentName];
475
- if (!cid) {
476
- throw new ComponentNotFoundError(entity.id, componentName);
477
- }
478
- return this.download(cid);
479
- }
480
- /**
481
- * Get the URL for a component from an entity.
482
- *
483
- * @param entity - Entity containing the component
484
- * @param componentName - Name of the component
485
- * @returns URL string
486
- * @throws ComponentNotFoundError if the component doesn't exist
487
- *
488
- * @example
489
- * ```typescript
490
- * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');
491
- * const imageUrl = content.getComponentUrl(entity, 'source');
492
- * // Use in img tag: <img src={imageUrl} />
493
- * ```
494
- */
495
- getComponentUrl(entity, componentName) {
496
- const cid = entity.components[componentName];
497
- if (!cid) {
498
- throw new ComponentNotFoundError(entity.id, componentName);
499
- }
500
- return this.getUrl(cid);
501
- }
502
- /**
503
- * Get the properties component for an entity.
504
- *
505
- * @param entity - Entity containing the properties component
506
- * @returns Properties object, or null if no properties component exists
507
- *
508
- * @example
509
- * ```typescript
510
- * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');
511
- * const props = await content.getProperties(entity);
512
- * if (props) {
513
- * console.log('Title:', props.title);
514
- * }
515
- * ```
516
- */
517
- async getProperties(entity) {
518
- const cid = entity.components.properties;
519
- if (!cid) {
520
- return null;
521
- }
522
- return this.getDag(cid);
523
- }
524
- /**
525
- * Get the relationships component for an entity.
526
- *
527
- * @param entity - Entity containing the relationships component
528
- * @returns Relationships component, or null if no relationships exist
529
- *
530
- * @example
531
- * ```typescript
532
- * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');
533
- * const rels = await content.getRelationships(entity);
534
- * if (rels) {
535
- * rels.relationships.forEach(r => {
536
- * console.log(`${r.predicate} -> ${r.target_label}`);
537
- * });
538
- * }
539
- * ```
540
- */
541
- async getRelationships(entity) {
542
- const cid = entity.components.relationships;
543
- if (!cid) {
544
- return null;
545
- }
546
- return this.getDag(cid);
547
- }
548
- };
549
- export {
550
- ComponentNotFoundError,
551
- ContentClient,
552
- ContentError,
553
- ContentNotFoundError,
554
- EntityNotFoundError,
555
- NetworkError,
556
- VersionNotFoundError
557
- };
558
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/content/errors.ts","../../src/content/client.ts"],"sourcesContent":["/**\n * Content package error classes for the Arke SDK\n */\n\n/**\n * Base error class for content operations\n */\nexport class ContentError extends Error {\n constructor(\n message: string,\n public code: string = 'CONTENT_ERROR',\n public details?: unknown\n ) {\n super(message);\n this.name = 'ContentError';\n }\n}\n\n/**\n * Thrown when an entity is not found by ID\n */\nexport class EntityNotFoundError extends ContentError {\n constructor(id: string) {\n super(`Entity not found: ${id}`, 'ENTITY_NOT_FOUND', { id });\n this.name = 'EntityNotFoundError';\n }\n}\n\n/**\n * Thrown when content is not found by CID\n */\nexport class ContentNotFoundError extends ContentError {\n constructor(cid: string) {\n super(`Content not found: ${cid}`, 'CONTENT_NOT_FOUND', { cid });\n this.name = 'ContentNotFoundError';\n }\n}\n\n/**\n * Thrown when a component is not found on an entity\n */\nexport class ComponentNotFoundError extends ContentError {\n constructor(id: string, componentName: string) {\n super(\n `Component '${componentName}' not found on entity ${id}`,\n 'COMPONENT_NOT_FOUND',\n { id, componentName }\n );\n this.name = 'ComponentNotFoundError';\n }\n}\n\n/**\n * Thrown when a version is not found\n */\nexport class VersionNotFoundError extends ContentError {\n constructor(id: string, selector: string) {\n super(\n `Version not found: ${selector} for entity ${id}`,\n 'VERSION_NOT_FOUND',\n { id, selector }\n );\n this.name = 'VersionNotFoundError';\n }\n}\n\n/**\n * Thrown when a network error occurs\n */\nexport class NetworkError extends ContentError {\n constructor(message: string, public statusCode?: number) {\n super(message, 'NETWORK_ERROR', { statusCode });\n this.name = 'NetworkError';\n }\n}\n","import {\n ContentError,\n EntityNotFoundError,\n ContentNotFoundError,\n ComponentNotFoundError,\n NetworkError,\n} from './errors.js';\nimport type {\n Entity,\n EntityVersion,\n ListOptions,\n ListResponse,\n VersionsOptions,\n VersionsResponse,\n ResolveResponse,\n RelationshipsComponent,\n PropertiesComponent,\n} from './types.js';\n\n/**\n * Configuration for ContentClient\n */\nexport interface ContentClientConfig {\n /**\n * Gateway base URL (e.g., https://gateway.arke.institute).\n * The client will call /api/* endpoints for IPFS Wrapper.\n */\n gatewayUrl: string;\n /**\n * Optional custom fetch implementation (useful for testing).\n */\n fetchImpl?: typeof fetch;\n}\n\ntype JsonBody = Record<string, unknown>;\n\n/**\n * Client for accessing entities and content from the Arke archive.\n *\n * All endpoints are public and do not require authentication.\n *\n * @example\n * ```typescript\n * const content = new ContentClient({\n * gatewayUrl: 'https://gateway.arke.institute',\n * });\n *\n * // Get an entity\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n *\n * // Download content by CID\n * const blob = await content.download('bafybeihkoviema7g3gxyt6la7vd5ho32jywf7b4c4z3qtwcabpjqxwsumu');\n *\n * // Get component content\n * const pinax = await content.getComponent(entity, 'pinax');\n * ```\n */\nexport class ContentClient {\n private baseUrl: string;\n private fetchImpl: typeof fetch;\n\n constructor(config: ContentClientConfig) {\n this.baseUrl = config.gatewayUrl.replace(/\\/$/, '');\n this.fetchImpl = config.fetchImpl ?? fetch;\n }\n\n // ---------------------------------------------------------------------------\n // Request helpers\n // ---------------------------------------------------------------------------\n\n private buildUrl(path: string, query?: Record<string, string | number | boolean | undefined>) {\n const url = new URL(`${this.baseUrl}${path}`);\n if (query) {\n Object.entries(query).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n });\n }\n return url.toString();\n }\n\n private async request<T>(\n path: string,\n options: RequestInit & {\n query?: Record<string, string | number | boolean | undefined>;\n } = {}\n ): Promise<T> {\n const url = this.buildUrl(path, options.query);\n const headers = new Headers({ 'Content-Type': 'application/json' });\n if (options.headers) {\n Object.entries(options.headers).forEach(([k, v]) => {\n if (v !== undefined) headers.set(k, v as string);\n });\n }\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, { ...options, headers });\n } catch (err) {\n throw new NetworkError(\n err instanceof Error ? err.message : 'Network request failed'\n );\n }\n\n if (response.ok) {\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return (await response.json()) as T;\n }\n return (await response.text()) as unknown as T;\n }\n\n let body: unknown;\n const text = await response.text();\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n\n // Handle 404 specifically\n if (response.status === 404) {\n const errorCode = (body as JsonBody)?.error;\n if (errorCode === 'NOT_FOUND' || errorCode === 'ENTITY_NOT_FOUND') {\n throw new ContentError(\n (body as JsonBody)?.message as string || 'Not found',\n 'NOT_FOUND',\n body\n );\n }\n }\n\n const message =\n (body as JsonBody)?.error && typeof (body as JsonBody).error === 'string'\n ? ((body as JsonBody).error as string)\n : (body as JsonBody)?.message && typeof (body as JsonBody).message === 'string'\n ? ((body as JsonBody).message as string)\n : `Request failed with status ${response.status}`;\n\n throw new ContentError(message, 'HTTP_ERROR', {\n status: response.status,\n body,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Entity Operations\n // ---------------------------------------------------------------------------\n\n /**\n * Get an entity by its Persistent Identifier (PI).\n *\n * @param pi - Persistent Identifier (ULID or test PI with II prefix)\n * @returns Full entity manifest\n * @throws EntityNotFoundError if the entity doesn't exist\n *\n * @example\n * ```typescript\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n * console.log('Version:', entity.ver);\n * console.log('Components:', Object.keys(entity.components));\n * ```\n */\n async get(pi: string): Promise<Entity> {\n try {\n return await this.request<Entity>(`/api/entities/${encodeURIComponent(pi)}`);\n } catch (err) {\n if (err instanceof ContentError && err.code === 'NOT_FOUND') {\n throw new EntityNotFoundError(pi);\n }\n throw err;\n }\n }\n\n /**\n * List entities with pagination.\n *\n * @param options - Pagination and metadata options\n * @returns Paginated list of entity summaries\n *\n * @example\n * ```typescript\n * // Get first page\n * const page1 = await content.list({ limit: 20, include_metadata: true });\n *\n * // Get next page\n * if (page1.next_cursor) {\n * const page2 = await content.list({ cursor: page1.next_cursor });\n * }\n * ```\n */\n async list(options: ListOptions = {}): Promise<ListResponse> {\n return this.request<ListResponse>('/api/entities', {\n query: {\n limit: options.limit,\n cursor: options.cursor,\n include_metadata: options.include_metadata,\n },\n });\n }\n\n /**\n * Get version history for an entity.\n *\n * @param pi - Persistent Identifier\n * @param options - Pagination options\n * @returns Version history (newest first)\n *\n * @example\n * ```typescript\n * const history = await content.versions('01K75HQQXNTDG7BBP7PS9AWYAN');\n * console.log('Total versions:', history.items.length);\n * history.items.forEach(v => {\n * console.log(`v${v.ver}: ${v.ts} - ${v.note || 'no note'}`);\n * });\n * ```\n */\n async versions(pi: string, options: VersionsOptions = {}): Promise<VersionsResponse> {\n try {\n return await this.request<VersionsResponse>(\n `/api/entities/${encodeURIComponent(pi)}/versions`,\n {\n query: {\n limit: options.limit,\n cursor: options.cursor,\n },\n }\n );\n } catch (err) {\n if (err instanceof ContentError && err.code === 'NOT_FOUND') {\n throw new EntityNotFoundError(pi);\n }\n throw err;\n }\n }\n\n /**\n * Get a specific version of an entity.\n *\n * @param pi - Persistent Identifier\n * @param selector - Version selector: 'ver:N' for version number or 'cid:...' for CID\n * @returns Entity manifest for the specified version\n *\n * @example\n * ```typescript\n * // Get version 2\n * const v2 = await content.getVersion('01K75HQQXNTDG7BBP7PS9AWYAN', 'ver:2');\n *\n * // Get by CID\n * const vByCid = await content.getVersion('01K75HQQXNTDG7BBP7PS9AWYAN', 'cid:bafybeih...');\n * ```\n */\n async getVersion(pi: string, selector: string): Promise<Entity> {\n try {\n return await this.request<Entity>(\n `/api/entities/${encodeURIComponent(pi)}/versions/${encodeURIComponent(selector)}`\n );\n } catch (err) {\n if (err instanceof ContentError && err.code === 'NOT_FOUND') {\n throw new EntityNotFoundError(pi);\n }\n throw err;\n }\n }\n\n /**\n * Resolve a PI to its tip CID (fast lookup without fetching manifest).\n *\n * @param pi - Persistent Identifier\n * @returns PI and tip CID\n *\n * @example\n * ```typescript\n * const { tip } = await content.resolve('01K75HQQXNTDG7BBP7PS9AWYAN');\n * console.log('Latest manifest CID:', tip);\n * ```\n */\n async resolve(pi: string): Promise<ResolveResponse> {\n try {\n return await this.request<ResolveResponse>(`/api/resolve/${encodeURIComponent(pi)}`);\n } catch (err) {\n if (err instanceof ContentError && err.code === 'NOT_FOUND') {\n throw new EntityNotFoundError(pi);\n }\n throw err;\n }\n }\n\n /**\n * Get the list of child PIs for an entity (fast, returns only PIs).\n *\n * @param pi - Persistent Identifier of parent entity\n * @returns Array of child PIs\n *\n * @example\n * ```typescript\n * const childPis = await content.children('01K75HQQXNTDG7BBP7PS9AWYAN');\n * console.log('Children:', childPis);\n * ```\n */\n async children(pi: string): Promise<string[]> {\n const entity = await this.get(pi);\n return entity.children_pi || [];\n }\n\n /**\n * Get all child entities for a parent (fetches full entity for each child).\n *\n * @param pi - Persistent Identifier of parent entity\n * @returns Array of child entities\n *\n * @example\n * ```typescript\n * const childEntities = await content.childrenEntities('01K75HQQXNTDG7BBP7PS9AWYAN');\n * childEntities.forEach(child => {\n * console.log(`${child.pi}: v${child.ver}`);\n * });\n * ```\n */\n async childrenEntities(pi: string): Promise<Entity[]> {\n const childPis = await this.children(pi);\n if (childPis.length === 0) {\n return [];\n }\n\n // Fetch all children in parallel\n const results = await Promise.allSettled(\n childPis.map(childPi => this.get(childPi))\n );\n\n // Return only successful fetches\n return results\n .filter((r): r is PromiseFulfilledResult<Entity> => r.status === 'fulfilled')\n .map(r => r.value);\n }\n\n /**\n * Get the Arke origin block (root of the archive tree).\n *\n * @returns Arke origin entity\n *\n * @example\n * ```typescript\n * const origin = await content.arke();\n * console.log('Arke origin:', origin.pi);\n * ```\n */\n async arke(): Promise<Entity> {\n return this.request<Entity>('/api/arke');\n }\n\n // ---------------------------------------------------------------------------\n // Content Download\n // ---------------------------------------------------------------------------\n\n /**\n * Download content by CID.\n *\n * Returns Blob in browser environments, Buffer in Node.js.\n *\n * @param cid - Content Identifier\n * @returns Content as Blob (browser) or Buffer (Node)\n * @throws ContentNotFoundError if the content doesn't exist\n *\n * @example\n * ```typescript\n * const content = await client.download('bafybeih...');\n *\n * // In browser\n * const url = URL.createObjectURL(content as Blob);\n *\n * // In Node.js\n * fs.writeFileSync('output.bin', content as Buffer);\n * ```\n */\n async download(cid: string): Promise<Blob | Buffer> {\n const url = this.buildUrl(`/api/cat/${encodeURIComponent(cid)}`);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url);\n } catch (err) {\n throw new NetworkError(\n err instanceof Error ? err.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new ContentNotFoundError(cid);\n }\n throw new ContentError(\n `Failed to download content: ${response.status}`,\n 'DOWNLOAD_ERROR',\n { status: response.status }\n );\n }\n\n // Platform-aware response handling\n if (typeof window !== 'undefined') {\n // Browser environment\n return response.blob();\n } else {\n // Node.js environment\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n }\n\n /**\n * Get a direct URL for content by CID.\n *\n * This is useful for embedding in img tags or for direct downloads.\n *\n * @param cid - Content Identifier\n * @returns URL string\n *\n * @example\n * ```typescript\n * const url = content.getUrl('bafybeih...');\n * // Use in img tag: <img src={url} />\n * ```\n */\n getUrl(cid: string): string {\n return `${this.baseUrl}/api/cat/${encodeURIComponent(cid)}`;\n }\n\n /**\n * Stream content by CID.\n *\n * @param cid - Content Identifier\n * @returns ReadableStream of the content\n * @throws ContentNotFoundError if the content doesn't exist\n *\n * @example\n * ```typescript\n * const stream = await content.stream('bafybeih...');\n * const reader = stream.getReader();\n * while (true) {\n * const { done, value } = await reader.read();\n * if (done) break;\n * // Process chunk\n * }\n * ```\n */\n async stream(cid: string): Promise<ReadableStream<Uint8Array>> {\n const url = this.buildUrl(`/api/cat/${encodeURIComponent(cid)}`);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url);\n } catch (err) {\n throw new NetworkError(\n err instanceof Error ? err.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new ContentNotFoundError(cid);\n }\n throw new ContentError(\n `Failed to stream content: ${response.status}`,\n 'STREAM_ERROR',\n { status: response.status }\n );\n }\n\n if (!response.body) {\n throw new ContentError('Response body is not available', 'STREAM_ERROR');\n }\n\n return response.body;\n }\n\n /**\n * Download a DAG node (JSON) by CID.\n *\n * Use this to fetch JSON components like properties and relationships.\n *\n * @param cid - Content Identifier of the DAG node\n * @returns Parsed JSON object\n * @throws ContentNotFoundError if the content doesn't exist\n *\n * @example\n * ```typescript\n * const relationships = await content.getDag<RelationshipsComponent>(\n * entity.components.relationships\n * );\n * console.log('Relationships:', relationships.relationships);\n * ```\n */\n async getDag<T = unknown>(cid: string): Promise<T> {\n const url = this.buildUrl(`/api/dag/${encodeURIComponent(cid)}`);\n\n let response: Response;\n try {\n response = await this.fetchImpl(url);\n } catch (err) {\n throw new NetworkError(\n err instanceof Error ? err.message : 'Network request failed'\n );\n }\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new ContentNotFoundError(cid);\n }\n throw new ContentError(\n `Failed to fetch DAG node: ${response.status}`,\n 'DAG_ERROR',\n { status: response.status }\n );\n }\n\n return (await response.json()) as T;\n }\n\n // ---------------------------------------------------------------------------\n // Component Helpers\n // ---------------------------------------------------------------------------\n\n /**\n * Download a component from an entity.\n *\n * @param entity - Entity containing the component\n * @param componentName - Name of the component (e.g., 'pinax', 'description', 'source')\n * @returns Component content as Blob (browser) or Buffer (Node)\n * @throws ComponentNotFoundError if the component doesn't exist\n *\n * @example\n * ```typescript\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n * const pinax = await content.getComponent(entity, 'pinax');\n * ```\n */\n async getComponent(entity: Entity, componentName: string): Promise<Blob | Buffer> {\n const cid = entity.components[componentName];\n if (!cid) {\n throw new ComponentNotFoundError(entity.id, componentName);\n }\n return this.download(cid);\n }\n\n /**\n * Get the URL for a component from an entity.\n *\n * @param entity - Entity containing the component\n * @param componentName - Name of the component\n * @returns URL string\n * @throws ComponentNotFoundError if the component doesn't exist\n *\n * @example\n * ```typescript\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n * const imageUrl = content.getComponentUrl(entity, 'source');\n * // Use in img tag: <img src={imageUrl} />\n * ```\n */\n getComponentUrl(entity: Entity, componentName: string): string {\n const cid = entity.components[componentName];\n if (!cid) {\n throw new ComponentNotFoundError(entity.id, componentName);\n }\n return this.getUrl(cid);\n }\n\n /**\n * Get the properties component for an entity.\n *\n * @param entity - Entity containing the properties component\n * @returns Properties object, or null if no properties component exists\n *\n * @example\n * ```typescript\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n * const props = await content.getProperties(entity);\n * if (props) {\n * console.log('Title:', props.title);\n * }\n * ```\n */\n async getProperties(entity: Entity): Promise<PropertiesComponent | null> {\n const cid = entity.components.properties;\n if (!cid) {\n return null;\n }\n return this.getDag<PropertiesComponent>(cid);\n }\n\n /**\n * Get the relationships component for an entity.\n *\n * @param entity - Entity containing the relationships component\n * @returns Relationships component, or null if no relationships exist\n *\n * @example\n * ```typescript\n * const entity = await content.get('01K75HQQXNTDG7BBP7PS9AWYAN');\n * const rels = await content.getRelationships(entity);\n * if (rels) {\n * rels.relationships.forEach(r => {\n * console.log(`${r.predicate} -> ${r.target_label}`);\n * });\n * }\n * ```\n */\n async getRelationships(entity: Entity): Promise<RelationshipsComponent | null> {\n const cid = entity.components.relationships;\n if (!cid) {\n return null;\n }\n return this.getDag<RelationshipsComponent>(cid);\n }\n}\n"],"mappings":"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","names":[]}