resourcexjs 0.0.3 → 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.
package/README.md CHANGED
@@ -23,6 +23,20 @@ const resource = await rx.resolve("arp:text:https://example.com/file.txt");
23
23
  console.log(resource.type); // "text"
24
24
  console.log(resource.content); // file content as string
25
25
  console.log(resource.meta); // { url, semantic, transport, ... }
26
+
27
+ // Deposit a local text resource
28
+ await rx.deposit("arp:text:file://./data/config.txt", "hello world");
29
+
30
+ // Binary resources
31
+ await rx.deposit("arp:binary:file://./data/image.png", imageBuffer);
32
+ const binary = await rx.resolve("arp:binary:file://./data/image.png");
33
+ console.log(binary.content); // Buffer
34
+
35
+ // Check if resource exists
36
+ const exists = await rx.exists("arp:text:file://./data/config.txt");
37
+
38
+ // Delete a resource
39
+ await rx.delete("arp:text:file://./data/config.txt");
26
40
  ```
27
41
 
28
42
  ## ARP URL Format
@@ -31,15 +45,49 @@ console.log(resource.meta); // { url, semantic, transport, ... }
31
45
  arp:{semantic}:{transport}://{location}
32
46
  ```
33
47
 
34
- - **semantic**: What the resource is (e.g., `text`)
35
- - **transport**: How to fetch it (e.g., `https`, `http`, `file`)
48
+ - **semantic**: What the resource is (e.g., `text`, `binary`)
49
+ - **transport**: How to access it (e.g., `https`, `http`, `file`)
36
50
  - **location**: Where to find it
37
51
 
38
52
  Examples:
39
53
 
40
54
  - `arp:text:https://example.com/readme.txt`
41
- - `arp:text:http://localhost:3000/data.txt`
42
- - `arp:text:file:///path/to/local/file.txt`
55
+ - `arp:binary:file:///path/to/image.png`
56
+ - `arp:text:file://./local/file.txt`
57
+
58
+ ## Resource Definition
59
+
60
+ Define custom resources as shortcuts for commonly used ARP URLs:
61
+
62
+ ```typescript
63
+ import { createResourceX } from "resourcexjs";
64
+ import { join } from "path";
65
+ import { homedir } from "os";
66
+
67
+ const rx = createResourceX({
68
+ resources: [
69
+ {
70
+ name: "logs",
71
+ semantic: "text",
72
+ transport: "file",
73
+ basePath: join(homedir(), ".myapp", "logs"),
74
+ },
75
+ {
76
+ name: "cache",
77
+ semantic: "binary",
78
+ transport: "file",
79
+ basePath: join(homedir(), ".myapp", "cache"),
80
+ },
81
+ ],
82
+ });
83
+
84
+ // Use resource URL
85
+ await rx.deposit("logs://app.log", "log entry");
86
+ await rx.deposit("cache://data.bin", buffer);
87
+
88
+ // Equivalent to full ARP URL
89
+ await rx.deposit("arp:text:file://~/.myapp/logs/app.log", "log entry");
90
+ ```
43
91
 
44
92
  ## API
45
93
 
@@ -52,25 +100,58 @@ const rx = createResourceX({
52
100
  timeout: 5000, // request timeout in ms
53
101
  transports: [], // custom transport handlers
54
102
  semantics: [], // custom semantic handlers
103
+ resources: [], // resource definitions
55
104
  });
56
105
  ```
57
106
 
58
107
  ### `rx.resolve(url)`
59
108
 
60
- Resolve an ARP URL and return the resource.
109
+ Resolve an ARP or Resource URL and return the resource.
61
110
 
62
111
  ```typescript
63
112
  const resource = await rx.resolve("arp:text:https://example.com/file.txt");
64
113
  // Returns: { type, content, meta }
114
+
115
+ const resource = await rx.resolve("myresource://file.txt");
116
+ // Also works with resource URLs
117
+ ```
118
+
119
+ ### `rx.deposit(url, data)`
120
+
121
+ Deposit data to an ARP or Resource URL.
122
+
123
+ ```typescript
124
+ await rx.deposit("arp:text:file://./data/config.txt", "content");
125
+ await rx.deposit("arp:binary:file://./data/image.png", buffer);
126
+ ```
127
+
128
+ ### `rx.exists(url)`
129
+
130
+ Check if a resource exists.
131
+
132
+ ```typescript
133
+ const exists = await rx.exists("arp:text:file://./data/config.txt");
134
+ // Returns: boolean
135
+ ```
136
+
137
+ ### `rx.delete(url)`
138
+
139
+ Delete a resource.
140
+
141
+ ```typescript
142
+ await rx.delete("arp:text:file://./data/config.txt");
65
143
  ```
66
144
 
67
145
  ### `rx.parse(url)`
68
146
 
69
- Parse an ARP URL without fetching.
147
+ Parse a URL without fetching.
70
148
 
71
149
  ```typescript
72
150
  const parsed = rx.parse("arp:text:https://example.com/file.txt");
73
151
  // Returns: { semantic: "text", transport: "https", location: "example.com/file.txt" }
152
+
153
+ const parsed = rx.parse("myresource://file.txt");
154
+ // Also works with resource URLs (expanded to full location)
74
155
  ```
75
156
 
76
157
  ### `rx.registerTransport(handler)`
@@ -81,21 +162,27 @@ Register a custom transport handler.
81
162
 
82
163
  Register a custom semantic handler.
83
164
 
165
+ ## Built-in Semantic Types
166
+
167
+ | Type | Content | Description |
168
+ | -------- | -------- | ------------------------------ |
169
+ | `text` | `string` | Plain text with UTF-8 encoding |
170
+ | `binary` | `Buffer` | Raw binary, no transformation |
171
+
84
172
  ## Resource Object
85
173
 
86
174
  ```typescript
87
175
  interface Resource {
88
- type: string; // semantic type (e.g., "text")
89
- content: unknown; // parsed content
176
+ type: string; // semantic type (e.g., "text", "binary")
177
+ content: unknown; // parsed content (string for text, Buffer for binary)
90
178
  meta: {
91
- url: string; // original ARP URL
179
+ url: string; // original URL
92
180
  semantic: string; // semantic type
93
181
  transport: string; // transport protocol
94
182
  location: string; // resource location
95
183
  size: number; // content size in bytes
96
- encoding?: string; // content encoding
97
- mimeType?: string; // MIME type
98
- fetchedAt: string; // ISO timestamp
184
+ encoding?: string; // content encoding (for text)
185
+ resolvedAt: string; // ISO timestamp
99
186
  };
100
187
  }
101
188
  ```
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ParsedARP, Resource, TransportHandler, SemanticHandler } from "@resourcexjs/core";
1
+ import { ParsedARP, Resource, TransportHandler, SemanticHandler, ResourceDefinition } from "@resourcexjs/core";
2
2
  /**
3
3
  * ResourceX configuration
4
4
  */
@@ -15,22 +15,43 @@ interface ResourceXConfig {
15
15
  * Custom semantic handlers to register
16
16
  */
17
17
  semantics?: SemanticHandler[];
18
+ /**
19
+ * Resource definitions
20
+ */
21
+ resources?: ResourceDefinition[];
18
22
  }
19
23
  /**
20
24
  * ResourceX instance
21
25
  */
22
26
  declare class ResourceX {
23
27
  readonly timeout?: number;
28
+ private readonly resourceRegistry;
24
29
  constructor(config?: ResourceXConfig);
25
30
  /**
31
+ * Parse URL (supports both ARP and Resource URLs)
32
+ */
33
+ private parseURL;
34
+ /**
26
35
  * Parse an ARP URL without fetching
27
36
  */
28
37
  parse(url: string): ParsedARP;
29
38
  /**
30
- * Resolve an ARP URL to a resource
39
+ * Resolve a URL to a resource
31
40
  */
32
41
  resolve(url: string): Promise<Resource>;
33
42
  /**
43
+ * Deposit data to a URL
44
+ */
45
+ deposit(url: string, data: unknown): Promise<void>;
46
+ /**
47
+ * Check if resource exists at URL
48
+ */
49
+ exists(url: string): Promise<boolean>;
50
+ /**
51
+ * Delete resource at URL
52
+ */
53
+ delete(url: string): Promise<void>;
54
+ /**
34
55
  * Register a custom transport handler
35
56
  */
36
57
  registerTransport(handler: TransportHandler): void;
@@ -39,13 +60,13 @@ declare class ResourceX {
39
60
  */
40
61
  registerSemantic(handler: SemanticHandler): void;
41
62
  /**
42
- * Get a transport handler by type
63
+ * Get a transport handler by name
43
64
  */
44
- getTransport(type: string): TransportHandler;
65
+ getTransport(name: string): TransportHandler;
45
66
  /**
46
- * Get a semantic handler by type
67
+ * Get a semantic handler by name
47
68
  */
48
- getSemantic(type: string): SemanticHandler;
69
+ getSemantic(name: string): SemanticHandler;
49
70
  }
50
71
  /**
51
72
  * Create a new ResourceX instance
@@ -69,6 +90,6 @@ declare class ResourceX {
69
90
  * ```
70
91
  */
71
92
  declare function createResourceX(config?: ResourceXConfig): ResourceX;
72
- import { Resource as Resource2, ResourceMeta, ParsedARP as ParsedARP2, ParseContext, TransportHandler as TransportHandler2, SemanticHandler as SemanticHandler2, TextResource } from "@resourcexjs/core";
93
+ import { Resource as Resource2, ResourceMeta, ParsedARP as ParsedARP2, SemanticContext, TransportHandler as TransportHandler2, TransportCapabilities, ResourceStat, SemanticHandler as SemanticHandler2, TextResource, ResourceDefinition as ResourceDefinition2 } from "@resourcexjs/core";
73
94
  import { ResourceXError, ParseError, TransportError, SemanticError } from "@resourcexjs/core";
74
- export { createResourceX, TransportHandler2 as TransportHandler, TransportError, TextResource, SemanticHandler2 as SemanticHandler, SemanticError, ResourceXError, ResourceXConfig, ResourceX, ResourceMeta, Resource2 as Resource, ParsedARP2 as ParsedARP, ParseError, ParseContext };
95
+ export { createResourceX, TransportHandler2 as TransportHandler, TransportError, TransportCapabilities, TextResource, SemanticHandler2 as SemanticHandler, SemanticError, SemanticContext, ResourceXError, ResourceXConfig, ResourceX, ResourceStat, ResourceMeta, ResourceDefinition2 as ResourceDefinition, Resource2 as Resource, ParsedARP2 as ParsedARP, ParseError };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // ../core/dist/index.js
2
- import { readFile } from "node:fs/promises";
3
- import { resolve } from "node:path";
2
+ import { readFile, writeFile, readdir, mkdir, rm, access, stat as fsStat } from "node:fs/promises";
3
+ import { resolve, dirname } from "node:path";
4
4
 
5
5
  class ResourceXError extends Error {
6
6
  constructor(message, options) {
@@ -65,18 +65,25 @@ function parseARP(url) {
65
65
  }
66
66
 
67
67
  class HttpTransportHandler {
68
- type;
68
+ name;
69
69
  protocol;
70
+ capabilities = {
71
+ canRead: true,
72
+ canWrite: false,
73
+ canList: false,
74
+ canDelete: false,
75
+ canStat: false
76
+ };
70
77
  constructor(protocol = "https") {
71
78
  this.protocol = protocol;
72
- this.type = protocol;
79
+ this.name = protocol;
73
80
  }
74
- async fetch(location) {
81
+ async read(location) {
75
82
  const url = `${this.protocol}://${location}`;
76
83
  try {
77
84
  const response = await fetch(url);
78
85
  if (!response.ok) {
79
- throw new TransportError(`HTTP ${response.status}: ${response.statusText} - ${url}`, this.type);
86
+ throw new TransportError(`HTTP ${response.status}: ${response.statusText} - ${url}`, this.name);
80
87
  }
81
88
  const arrayBuffer = await response.arrayBuffer();
82
89
  return Buffer.from(arrayBuffer);
@@ -84,7 +91,9 @@ class HttpTransportHandler {
84
91
  if (error instanceof TransportError) {
85
92
  throw error;
86
93
  }
87
- throw new TransportError(`Network error: ${url}`, this.type, { cause: error });
94
+ throw new TransportError(`Network error: ${url}`, this.name, {
95
+ cause: error
96
+ });
88
97
  }
89
98
  }
90
99
  }
@@ -92,14 +101,94 @@ var httpsHandler = new HttpTransportHandler("https");
92
101
  var httpHandler = new HttpTransportHandler("http");
93
102
 
94
103
  class FileTransportHandler {
95
- type = "file";
96
- async fetch(location) {
97
- const filePath = resolve(process.cwd(), location);
104
+ name = "file";
105
+ capabilities = {
106
+ canRead: true,
107
+ canWrite: true,
108
+ canList: true,
109
+ canDelete: true,
110
+ canStat: true
111
+ };
112
+ resolvePath(location) {
113
+ return resolve(process.cwd(), location);
114
+ }
115
+ async read(location) {
116
+ const filePath = this.resolvePath(location);
98
117
  try {
99
118
  return await readFile(filePath);
100
119
  } catch (error) {
101
120
  const err = error;
102
- throw new TransportError(`File read error: ${err.code} - ${filePath}`, this.type, {
121
+ throw new TransportError(`File read error: ${err.code} - ${filePath}`, this.name, {
122
+ cause: err
123
+ });
124
+ }
125
+ }
126
+ async write(location, content) {
127
+ const filePath = this.resolvePath(location);
128
+ try {
129
+ await mkdir(dirname(filePath), { recursive: true });
130
+ await writeFile(filePath, content);
131
+ } catch (error) {
132
+ const err = error;
133
+ throw new TransportError(`File write error: ${err.code} - ${filePath}`, this.name, {
134
+ cause: err
135
+ });
136
+ }
137
+ }
138
+ async list(location) {
139
+ const dirPath = this.resolvePath(location);
140
+ try {
141
+ return await readdir(dirPath);
142
+ } catch (error) {
143
+ const err = error;
144
+ throw new TransportError(`Directory list error: ${err.code} - ${dirPath}`, this.name, {
145
+ cause: err
146
+ });
147
+ }
148
+ }
149
+ async mkdir(location) {
150
+ const dirPath = this.resolvePath(location);
151
+ try {
152
+ await mkdir(dirPath, { recursive: true });
153
+ } catch (error) {
154
+ const err = error;
155
+ throw new TransportError(`Directory create error: ${err.code} - ${dirPath}`, this.name, {
156
+ cause: err
157
+ });
158
+ }
159
+ }
160
+ async exists(location) {
161
+ const filePath = this.resolvePath(location);
162
+ try {
163
+ await access(filePath);
164
+ return true;
165
+ } catch {
166
+ return false;
167
+ }
168
+ }
169
+ async stat(location) {
170
+ const filePath = this.resolvePath(location);
171
+ try {
172
+ const stats = await fsStat(filePath);
173
+ return {
174
+ size: stats.size,
175
+ modifiedAt: stats.mtime,
176
+ isDirectory: stats.isDirectory()
177
+ };
178
+ } catch (error) {
179
+ const err = error;
180
+ throw new TransportError(`File stat error: ${err.code} - ${filePath}`, this.name, {
181
+ cause: err
182
+ });
183
+ }
184
+ }
185
+ async delete(location) {
186
+ const filePath = this.resolvePath(location);
187
+ try {
188
+ await rm(filePath, { recursive: true });
189
+ } catch (error) {
190
+ const err = error;
191
+ throw new TransportError(`File delete error: ${err.code} - ${filePath}`, this.name, {
103
192
  cause: err
104
193
  });
105
194
  }
@@ -111,30 +200,31 @@ var handlers = new Map([
111
200
  ["http", httpHandler],
112
201
  ["file", fileHandler]
113
202
  ]);
114
- function getTransportHandler(type) {
115
- const handler = handlers.get(type);
203
+ function getTransportHandler(name) {
204
+ const handler = handlers.get(name);
116
205
  if (!handler) {
117
- throw new TransportError(`Unsupported transport type: ${type}`, type);
206
+ throw new TransportError(`Unsupported transport type: ${name}`, name);
118
207
  }
119
208
  return handler;
120
209
  }
121
210
  function registerTransportHandler(handler) {
122
- handlers.set(handler.type, handler);
211
+ handlers.set(handler.name, handler);
123
212
  }
124
213
 
125
214
  class TextSemanticHandler {
126
- type = "text";
127
- parse(content, context) {
128
- const text = content.toString("utf-8");
215
+ name = "text";
216
+ async resolve(transport, location, context) {
217
+ const buffer = await transport.read(location);
218
+ const text = buffer.toString("utf-8");
129
219
  const meta = {
130
220
  url: context.url,
131
221
  semantic: context.semantic,
132
222
  transport: context.transport,
133
223
  location: context.location,
134
- size: content.length,
224
+ size: buffer.length,
135
225
  encoding: "utf-8",
136
226
  mimeType: "text/plain",
137
- fetchedAt: context.fetchedAt.toISOString()
227
+ resolvedAt: context.timestamp.toISOString()
138
228
  };
139
229
  return {
140
230
  type: "text",
@@ -142,40 +232,195 @@ class TextSemanticHandler {
142
232
  meta
143
233
  };
144
234
  }
235
+ async deposit(transport, location, data, _context) {
236
+ if (!transport.write) {
237
+ throw new SemanticError(`Transport "${transport.name}" does not support write operation`, this.name);
238
+ }
239
+ const buffer = Buffer.from(data, "utf-8");
240
+ await transport.write(location, buffer);
241
+ }
242
+ async exists(transport, location, _context) {
243
+ if (transport.exists) {
244
+ return transport.exists(location);
245
+ }
246
+ try {
247
+ await transport.read(location);
248
+ return true;
249
+ } catch {
250
+ return false;
251
+ }
252
+ }
253
+ async delete(transport, location, _context) {
254
+ if (!transport.delete) {
255
+ throw new SemanticError(`Transport "${transport.name}" does not support delete operation`, this.name);
256
+ }
257
+ await transport.delete(location);
258
+ }
145
259
  }
146
260
  var textHandler = new TextSemanticHandler;
147
- var handlers2 = new Map([["text", textHandler]]);
148
- function getSemanticHandler(type) {
149
- const handler = handlers2.get(type);
261
+ function toBuffer(data) {
262
+ if (Buffer.isBuffer(data)) {
263
+ return data;
264
+ }
265
+ if (data instanceof Uint8Array) {
266
+ return Buffer.from(data);
267
+ }
268
+ if (data instanceof ArrayBuffer) {
269
+ return Buffer.from(data);
270
+ }
271
+ if (Array.isArray(data)) {
272
+ return Buffer.from(data);
273
+ }
274
+ throw new SemanticError(`Unsupported binary input type`, "binary");
275
+ }
276
+
277
+ class BinarySemanticHandler {
278
+ name = "binary";
279
+ async resolve(transport, location, context) {
280
+ const buffer = await transport.read(location);
281
+ const meta = {
282
+ url: context.url,
283
+ semantic: context.semantic,
284
+ transport: context.transport,
285
+ location: context.location,
286
+ size: buffer.length,
287
+ resolvedAt: context.timestamp.toISOString()
288
+ };
289
+ return {
290
+ type: "binary",
291
+ content: buffer,
292
+ meta
293
+ };
294
+ }
295
+ async deposit(transport, location, data, _context) {
296
+ if (!transport.write) {
297
+ throw new SemanticError(`Transport "${transport.name}" does not support write operation`, this.name);
298
+ }
299
+ const buffer = toBuffer(data);
300
+ await transport.write(location, buffer);
301
+ }
302
+ async exists(transport, location, _context) {
303
+ if (transport.exists) {
304
+ return transport.exists(location);
305
+ }
306
+ try {
307
+ await transport.read(location);
308
+ return true;
309
+ } catch {
310
+ return false;
311
+ }
312
+ }
313
+ async delete(transport, location, _context) {
314
+ if (!transport.delete) {
315
+ throw new SemanticError(`Transport "${transport.name}" does not support delete operation`, this.name);
316
+ }
317
+ await transport.delete(location);
318
+ }
319
+ }
320
+ var binaryHandler = new BinarySemanticHandler;
321
+ var handlers2 = new Map([
322
+ ["text", textHandler],
323
+ ["binary", binaryHandler]
324
+ ]);
325
+ function getSemanticHandler(name) {
326
+ const handler = handlers2.get(name);
150
327
  if (!handler) {
151
- throw new SemanticError(`Unsupported semantic type: ${type}`, type);
328
+ throw new SemanticError(`Unsupported semantic type: ${name}`, name);
152
329
  }
153
330
  return handler;
154
331
  }
155
332
  function registerSemanticHandler(handler) {
156
- handlers2.set(handler.type, handler);
333
+ handlers2.set(handler.name, handler);
334
+ }
335
+ function createContext(url, semantic, transport, location) {
336
+ return {
337
+ url,
338
+ semantic,
339
+ transport,
340
+ location,
341
+ timestamp: new Date
342
+ };
157
343
  }
158
344
  async function resolve2(url) {
159
- const fetchedAt = new Date;
160
345
  const parsed = parseARP(url);
161
- const transportHandler = getTransportHandler(parsed.transport);
162
- const semanticHandler = getSemanticHandler(parsed.semantic);
163
- const content = await transportHandler.fetch(parsed.location);
164
- const context = {
165
- url,
166
- semantic: parsed.semantic,
167
- transport: parsed.transport,
168
- location: parsed.location,
169
- fetchedAt
346
+ const transport = getTransportHandler(parsed.transport);
347
+ const semantic = getSemanticHandler(parsed.semantic);
348
+ const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);
349
+ return semantic.resolve(transport, parsed.location, context);
350
+ }
351
+ async function deposit(url, data) {
352
+ const parsed = parseARP(url);
353
+ const transport = getTransportHandler(parsed.transport);
354
+ const semantic = getSemanticHandler(parsed.semantic);
355
+ if (!semantic.deposit) {
356
+ throw new SemanticError(`Semantic "${semantic.name}" does not support deposit operation`, parsed.semantic);
357
+ }
358
+ const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);
359
+ await semantic.deposit(transport, parsed.location, data, context);
360
+ }
361
+ async function resourceExists(url) {
362
+ const parsed = parseARP(url);
363
+ const transport = getTransportHandler(parsed.transport);
364
+ const semantic = getSemanticHandler(parsed.semantic);
365
+ const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);
366
+ if (semantic.exists) {
367
+ return semantic.exists(transport, parsed.location, context);
368
+ }
369
+ if (transport.exists) {
370
+ return transport.exists(parsed.location);
371
+ }
372
+ try {
373
+ await transport.read(parsed.location);
374
+ return true;
375
+ } catch {
376
+ return false;
377
+ }
378
+ }
379
+ async function resourceDelete(url) {
380
+ const parsed = parseARP(url);
381
+ const transport = getTransportHandler(parsed.transport);
382
+ const semantic = getSemanticHandler(parsed.semantic);
383
+ const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);
384
+ if (semantic.delete) {
385
+ return semantic.delete(transport, parsed.location, context);
386
+ }
387
+ if (!transport.delete) {
388
+ throw new SemanticError(`Neither semantic "${semantic.name}" nor transport "${transport.name}" supports delete operation`, parsed.semantic);
389
+ }
390
+ await transport.delete(parsed.location);
391
+ }
392
+ function createResourceRegistry() {
393
+ const registry = new Map;
394
+ return {
395
+ register(definition) {
396
+ if (!/^[a-z][a-z0-9-]*$/.test(definition.name)) {
397
+ throw new ParseError(`Invalid resource name: "${definition.name}". Must start with lowercase letter and contain only lowercase letters, numbers, and hyphens.`, definition.name);
398
+ }
399
+ getSemanticHandler(definition.semantic);
400
+ getTransportHandler(definition.transport);
401
+ registry.set(definition.name, definition);
402
+ },
403
+ get(name) {
404
+ return registry.get(name);
405
+ },
406
+ has(name) {
407
+ return registry.has(name);
408
+ },
409
+ clear() {
410
+ registry.clear();
411
+ }
170
412
  };
171
- return semanticHandler.parse(content, context);
172
413
  }
173
414
 
174
415
  // src/ResourceX.ts
416
+ import { join } from "node:path";
417
+
175
418
  class ResourceX {
176
419
  timeout;
420
+ resourceRegistry;
177
421
  constructor(config = {}) {
178
422
  this.timeout = config.timeout;
423
+ this.resourceRegistry = createResourceRegistry();
179
424
  if (config.transports) {
180
425
  for (const handler of config.transports) {
181
426
  registerTransportHandler(handler);
@@ -186,12 +431,54 @@ class ResourceX {
186
431
  registerSemanticHandler(handler);
187
432
  }
188
433
  }
434
+ if (config.resources) {
435
+ for (const resource of config.resources) {
436
+ this.resourceRegistry.register(resource);
437
+ }
438
+ }
439
+ }
440
+ parseURL(url) {
441
+ if (url.startsWith("arp:")) {
442
+ return { arpUrl: url, parsed: parseARP(url) };
443
+ }
444
+ const match = url.match(/^([a-z][a-z0-9-]*):\/\/(.*)$/);
445
+ if (!match) {
446
+ throw new ParseError(`Invalid URL format: ${url}`, url);
447
+ }
448
+ const [, name, location] = match;
449
+ const definition = this.resourceRegistry.get(name);
450
+ if (!definition) {
451
+ throw new ParseError(`Unknown resource: "${name}"`, url);
452
+ }
453
+ const fullLocation = definition.basePath ? join(definition.basePath, location) : location;
454
+ const arpUrl = `arp:${definition.semantic}:${definition.transport}://${fullLocation}`;
455
+ return {
456
+ arpUrl,
457
+ parsed: {
458
+ semantic: definition.semantic,
459
+ transport: definition.transport,
460
+ location: fullLocation
461
+ }
462
+ };
189
463
  }
190
464
  parse(url) {
191
- return parseARP(url);
465
+ return this.parseURL(url).parsed;
192
466
  }
193
467
  async resolve(url) {
194
- return resolve2(url);
468
+ const { arpUrl } = this.parseURL(url);
469
+ return resolve2(arpUrl);
470
+ }
471
+ async deposit(url, data) {
472
+ const { arpUrl } = this.parseURL(url);
473
+ return deposit(arpUrl, data);
474
+ }
475
+ async exists(url) {
476
+ const { arpUrl } = this.parseURL(url);
477
+ return resourceExists(arpUrl);
478
+ }
479
+ async delete(url) {
480
+ const { arpUrl } = this.parseURL(url);
481
+ return resourceDelete(arpUrl);
195
482
  }
196
483
  registerTransport(handler) {
197
484
  registerTransportHandler(handler);
@@ -199,11 +486,11 @@ class ResourceX {
199
486
  registerSemantic(handler) {
200
487
  registerSemanticHandler(handler);
201
488
  }
202
- getTransport(type) {
203
- return getTransportHandler(type);
489
+ getTransport(name) {
490
+ return getTransportHandler(name);
204
491
  }
205
- getSemantic(type) {
206
- return getSemanticHandler(type);
492
+ getSemantic(name) {
493
+ return getSemanticHandler(name);
207
494
  }
208
495
  }
209
496
 
@@ -220,4 +507,4 @@ export {
220
507
  ParseError
221
508
  };
222
509
 
223
- //# debugId=ACA93DAB894BAF0C64756E2164756E21
510
+ //# debugId=B9D21F1A64C8C12664756E2164756E21
package/dist/index.js.map CHANGED
@@ -2,11 +2,11 @@
2
2
  "version": 3,
3
3
  "sources": ["../../core/dist/index.js", "../src/ResourceX.ts", "../src/createResourceX.ts"],
4
4
  "sourcesContent": [
5
- "// src/errors.ts\nclass ResourceXError extends Error {\n constructor(message, options) {\n super(message, options);\n this.name = \"ResourceXError\";\n }\n}\n\nclass ParseError extends ResourceXError {\n url;\n constructor(message, url) {\n super(message);\n this.url = url;\n this.name = \"ParseError\";\n }\n}\n\nclass TransportError extends ResourceXError {\n transport;\n constructor(message, transport, options) {\n super(message, options);\n this.transport = transport;\n this.name = \"TransportError\";\n }\n}\n\nclass SemanticError extends ResourceXError {\n semantic;\n constructor(message, semantic, options) {\n super(message, options);\n this.semantic = semantic;\n this.name = \"SemanticError\";\n }\n}\n// src/parser.ts\nfunction parseARP(url) {\n if (!url.startsWith(\"arp:\")) {\n throw new ParseError(`Invalid ARP URL: must start with \"arp:\"`, url);\n }\n const content = url.substring(4);\n const separatorIndex = content.indexOf(\"://\");\n if (separatorIndex === -1) {\n throw new ParseError(`Invalid ARP URL: missing \"://\"`, url);\n }\n const typePart = content.substring(0, separatorIndex);\n const location = content.substring(separatorIndex + 3);\n const colonIndex = typePart.indexOf(\":\");\n if (colonIndex === -1) {\n throw new ParseError(`Invalid ARP URL: must have exactly 2 types (semantic:transport)`, url);\n }\n const semantic = typePart.substring(0, colonIndex);\n const transport = typePart.substring(colonIndex + 1);\n if (!semantic) {\n throw new ParseError(`Invalid ARP URL: semantic type cannot be empty`, url);\n }\n if (!transport) {\n throw new ParseError(`Invalid ARP URL: transport type cannot be empty`, url);\n }\n if (!location) {\n throw new ParseError(`Invalid ARP URL: location cannot be empty`, url);\n }\n return { semantic, transport, location };\n}\n// src/transport/http.ts\nclass HttpTransportHandler {\n type;\n protocol;\n constructor(protocol = \"https\") {\n this.protocol = protocol;\n this.type = protocol;\n }\n async fetch(location) {\n const url = `${this.protocol}://${location}`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new TransportError(`HTTP ${response.status}: ${response.statusText} - ${url}`, this.type);\n }\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n } catch (error) {\n if (error instanceof TransportError) {\n throw error;\n }\n throw new TransportError(`Network error: ${url}`, this.type, { cause: error });\n }\n }\n}\nvar httpsHandler = new HttpTransportHandler(\"https\");\nvar httpHandler = new HttpTransportHandler(\"http\");\n// src/transport/file.ts\nimport { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nclass FileTransportHandler {\n type = \"file\";\n async fetch(location) {\n const filePath = resolve(process.cwd(), location);\n try {\n return await readFile(filePath);\n } catch (error) {\n const err = error;\n throw new TransportError(`File read error: ${err.code} - ${filePath}`, this.type, {\n cause: err\n });\n }\n }\n}\nvar fileHandler = new FileTransportHandler;\n// src/transport/index.ts\nvar handlers = new Map([\n [\"https\", httpsHandler],\n [\"http\", httpHandler],\n [\"file\", fileHandler]\n]);\nfunction getTransportHandler(type) {\n const handler = handlers.get(type);\n if (!handler) {\n throw new TransportError(`Unsupported transport type: ${type}`, type);\n }\n return handler;\n}\nfunction registerTransportHandler(handler) {\n handlers.set(handler.type, handler);\n}\n// src/semantic/text.ts\nclass TextSemanticHandler {\n type = \"text\";\n parse(content, context) {\n const text = content.toString(\"utf-8\");\n const meta = {\n url: context.url,\n semantic: context.semantic,\n transport: context.transport,\n location: context.location,\n size: content.length,\n encoding: \"utf-8\",\n mimeType: \"text/plain\",\n fetchedAt: context.fetchedAt.toISOString()\n };\n return {\n type: \"text\",\n content: text,\n meta\n };\n }\n}\nvar textHandler = new TextSemanticHandler;\n// src/semantic/index.ts\nvar handlers2 = new Map([[\"text\", textHandler]]);\nfunction getSemanticHandler(type) {\n const handler = handlers2.get(type);\n if (!handler) {\n throw new SemanticError(`Unsupported semantic type: ${type}`, type);\n }\n return handler;\n}\nfunction registerSemanticHandler(handler) {\n handlers2.set(handler.type, handler);\n}\n// src/resolve.ts\nasync function resolve2(url) {\n const fetchedAt = new Date;\n const parsed = parseARP(url);\n const transportHandler = getTransportHandler(parsed.transport);\n const semanticHandler = getSemanticHandler(parsed.semantic);\n const content = await transportHandler.fetch(parsed.location);\n const context = {\n url,\n semantic: parsed.semantic,\n transport: parsed.transport,\n location: parsed.location,\n fetchedAt\n };\n return semanticHandler.parse(content, context);\n}\n\n// src/index.ts\nvar VERSION = \"0.0.3\";\nexport {\n textHandler,\n resolve2 as resolve,\n registerTransportHandler,\n registerSemanticHandler,\n parseARP,\n httpsHandler,\n httpHandler,\n getTransportHandler,\n getSemanticHandler,\n fileHandler,\n VERSION,\n TransportError,\n SemanticError,\n ResourceXError,\n ParseError\n};\n\n//# debugId=31FB3920A030247564756E2164756E21\n",
6
- "/**\n * ResourceX - Main API class\n */\n\nimport {\n parseARP,\n resolve as coreResolve,\n getTransportHandler,\n getSemanticHandler,\n registerTransportHandler,\n registerSemanticHandler,\n type ParsedARP,\n type Resource,\n type TransportHandler,\n type SemanticHandler,\n} from \"@resourcexjs/core\";\n\n/**\n * ResourceX configuration\n */\nexport interface ResourceXConfig {\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Custom transport handlers to register\n */\n transports?: TransportHandler[];\n\n /**\n * Custom semantic handlers to register\n */\n semantics?: SemanticHandler[];\n}\n\n/**\n * ResourceX instance\n */\nexport class ResourceX {\n readonly timeout?: number;\n\n constructor(config: ResourceXConfig = {}) {\n this.timeout = config.timeout;\n\n // Register custom handlers from config\n if (config.transports) {\n for (const handler of config.transports) {\n registerTransportHandler(handler);\n }\n }\n\n if (config.semantics) {\n for (const handler of config.semantics) {\n registerSemanticHandler(handler);\n }\n }\n }\n\n /**\n * Parse an ARP URL without fetching\n */\n parse(url: string): ParsedARP {\n return parseARP(url);\n }\n\n /**\n * Resolve an ARP URL to a resource\n */\n async resolve(url: string): Promise<Resource> {\n // TODO: implement timeout using this.timeout\n return coreResolve(url);\n }\n\n /**\n * Register a custom transport handler\n */\n registerTransport(handler: TransportHandler): void {\n registerTransportHandler(handler);\n }\n\n /**\n * Register a custom semantic handler\n */\n registerSemantic(handler: SemanticHandler): void {\n registerSemanticHandler(handler);\n }\n\n /**\n * Get a transport handler by type\n */\n getTransport(type: string): TransportHandler {\n return getTransportHandler(type);\n }\n\n /**\n * Get a semantic handler by type\n */\n getSemantic(type: string): SemanticHandler {\n return getSemanticHandler(type);\n }\n}\n",
5
+ "// src/errors.ts\nclass ResourceXError extends Error {\n constructor(message, options) {\n super(message, options);\n this.name = \"ResourceXError\";\n }\n}\n\nclass ParseError extends ResourceXError {\n url;\n constructor(message, url) {\n super(message);\n this.url = url;\n this.name = \"ParseError\";\n }\n}\n\nclass TransportError extends ResourceXError {\n transport;\n constructor(message, transport, options) {\n super(message, options);\n this.transport = transport;\n this.name = \"TransportError\";\n }\n}\n\nclass SemanticError extends ResourceXError {\n semantic;\n constructor(message, semantic, options) {\n super(message, options);\n this.semantic = semantic;\n this.name = \"SemanticError\";\n }\n}\n// src/parser.ts\nfunction parseARP(url) {\n if (!url.startsWith(\"arp:\")) {\n throw new ParseError(`Invalid ARP URL: must start with \"arp:\"`, url);\n }\n const content = url.substring(4);\n const separatorIndex = content.indexOf(\"://\");\n if (separatorIndex === -1) {\n throw new ParseError(`Invalid ARP URL: missing \"://\"`, url);\n }\n const typePart = content.substring(0, separatorIndex);\n const location = content.substring(separatorIndex + 3);\n const colonIndex = typePart.indexOf(\":\");\n if (colonIndex === -1) {\n throw new ParseError(`Invalid ARP URL: must have exactly 2 types (semantic:transport)`, url);\n }\n const semantic = typePart.substring(0, colonIndex);\n const transport = typePart.substring(colonIndex + 1);\n if (!semantic) {\n throw new ParseError(`Invalid ARP URL: semantic type cannot be empty`, url);\n }\n if (!transport) {\n throw new ParseError(`Invalid ARP URL: transport type cannot be empty`, url);\n }\n if (!location) {\n throw new ParseError(`Invalid ARP URL: location cannot be empty`, url);\n }\n return { semantic, transport, location };\n}\n// src/transport/http.ts\nclass HttpTransportHandler {\n name;\n protocol;\n capabilities = {\n canRead: true,\n canWrite: false,\n canList: false,\n canDelete: false,\n canStat: false\n };\n constructor(protocol = \"https\") {\n this.protocol = protocol;\n this.name = protocol;\n }\n async read(location) {\n const url = `${this.protocol}://${location}`;\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new TransportError(`HTTP ${response.status}: ${response.statusText} - ${url}`, this.name);\n }\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n } catch (error) {\n if (error instanceof TransportError) {\n throw error;\n }\n throw new TransportError(`Network error: ${url}`, this.name, {\n cause: error\n });\n }\n }\n}\nvar httpsHandler = new HttpTransportHandler(\"https\");\nvar httpHandler = new HttpTransportHandler(\"http\");\n// src/transport/file.ts\nimport { readFile, writeFile, readdir, mkdir, rm, access, stat as fsStat } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nclass FileTransportHandler {\n name = \"file\";\n capabilities = {\n canRead: true,\n canWrite: true,\n canList: true,\n canDelete: true,\n canStat: true\n };\n resolvePath(location) {\n return resolve(process.cwd(), location);\n }\n async read(location) {\n const filePath = this.resolvePath(location);\n try {\n return await readFile(filePath);\n } catch (error) {\n const err = error;\n throw new TransportError(`File read error: ${err.code} - ${filePath}`, this.name, {\n cause: err\n });\n }\n }\n async write(location, content) {\n const filePath = this.resolvePath(location);\n try {\n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, content);\n } catch (error) {\n const err = error;\n throw new TransportError(`File write error: ${err.code} - ${filePath}`, this.name, {\n cause: err\n });\n }\n }\n async list(location) {\n const dirPath = this.resolvePath(location);\n try {\n return await readdir(dirPath);\n } catch (error) {\n const err = error;\n throw new TransportError(`Directory list error: ${err.code} - ${dirPath}`, this.name, {\n cause: err\n });\n }\n }\n async mkdir(location) {\n const dirPath = this.resolvePath(location);\n try {\n await mkdir(dirPath, { recursive: true });\n } catch (error) {\n const err = error;\n throw new TransportError(`Directory create error: ${err.code} - ${dirPath}`, this.name, {\n cause: err\n });\n }\n }\n async exists(location) {\n const filePath = this.resolvePath(location);\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n }\n async stat(location) {\n const filePath = this.resolvePath(location);\n try {\n const stats = await fsStat(filePath);\n return {\n size: stats.size,\n modifiedAt: stats.mtime,\n isDirectory: stats.isDirectory()\n };\n } catch (error) {\n const err = error;\n throw new TransportError(`File stat error: ${err.code} - ${filePath}`, this.name, {\n cause: err\n });\n }\n }\n async delete(location) {\n const filePath = this.resolvePath(location);\n try {\n await rm(filePath, { recursive: true });\n } catch (error) {\n const err = error;\n throw new TransportError(`File delete error: ${err.code} - ${filePath}`, this.name, {\n cause: err\n });\n }\n }\n}\nvar fileHandler = new FileTransportHandler;\n// src/transport/index.ts\nvar handlers = new Map([\n [\"https\", httpsHandler],\n [\"http\", httpHandler],\n [\"file\", fileHandler]\n]);\nfunction getTransportHandler(name) {\n const handler = handlers.get(name);\n if (!handler) {\n throw new TransportError(`Unsupported transport type: ${name}`, name);\n }\n return handler;\n}\nfunction registerTransportHandler(handler) {\n handlers.set(handler.name, handler);\n}\n// src/semantic/text.ts\nclass TextSemanticHandler {\n name = \"text\";\n async resolve(transport, location, context) {\n const buffer = await transport.read(location);\n const text = buffer.toString(\"utf-8\");\n const meta = {\n url: context.url,\n semantic: context.semantic,\n transport: context.transport,\n location: context.location,\n size: buffer.length,\n encoding: \"utf-8\",\n mimeType: \"text/plain\",\n resolvedAt: context.timestamp.toISOString()\n };\n return {\n type: \"text\",\n content: text,\n meta\n };\n }\n async deposit(transport, location, data, _context) {\n if (!transport.write) {\n throw new SemanticError(`Transport \"${transport.name}\" does not support write operation`, this.name);\n }\n const buffer = Buffer.from(data, \"utf-8\");\n await transport.write(location, buffer);\n }\n async exists(transport, location, _context) {\n if (transport.exists) {\n return transport.exists(location);\n }\n try {\n await transport.read(location);\n return true;\n } catch {\n return false;\n }\n }\n async delete(transport, location, _context) {\n if (!transport.delete) {\n throw new SemanticError(`Transport \"${transport.name}\" does not support delete operation`, this.name);\n }\n await transport.delete(location);\n }\n}\nvar textHandler = new TextSemanticHandler;\n// src/semantic/binary.ts\nfunction toBuffer(data) {\n if (Buffer.isBuffer(data)) {\n return data;\n }\n if (data instanceof Uint8Array) {\n return Buffer.from(data);\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data);\n }\n if (Array.isArray(data)) {\n return Buffer.from(data);\n }\n throw new SemanticError(`Unsupported binary input type`, \"binary\");\n}\n\nclass BinarySemanticHandler {\n name = \"binary\";\n async resolve(transport, location, context) {\n const buffer = await transport.read(location);\n const meta = {\n url: context.url,\n semantic: context.semantic,\n transport: context.transport,\n location: context.location,\n size: buffer.length,\n resolvedAt: context.timestamp.toISOString()\n };\n return {\n type: \"binary\",\n content: buffer,\n meta\n };\n }\n async deposit(transport, location, data, _context) {\n if (!transport.write) {\n throw new SemanticError(`Transport \"${transport.name}\" does not support write operation`, this.name);\n }\n const buffer = toBuffer(data);\n await transport.write(location, buffer);\n }\n async exists(transport, location, _context) {\n if (transport.exists) {\n return transport.exists(location);\n }\n try {\n await transport.read(location);\n return true;\n } catch {\n return false;\n }\n }\n async delete(transport, location, _context) {\n if (!transport.delete) {\n throw new SemanticError(`Transport \"${transport.name}\" does not support delete operation`, this.name);\n }\n await transport.delete(location);\n }\n}\nvar binaryHandler = new BinarySemanticHandler;\n// src/semantic/index.ts\nvar handlers2 = new Map([\n [\"text\", textHandler],\n [\"binary\", binaryHandler]\n]);\nfunction getSemanticHandler(name) {\n const handler = handlers2.get(name);\n if (!handler) {\n throw new SemanticError(`Unsupported semantic type: ${name}`, name);\n }\n return handler;\n}\nfunction registerSemanticHandler(handler) {\n handlers2.set(handler.name, handler);\n}\n// src/resolve.ts\nfunction createContext(url, semantic, transport, location) {\n return {\n url,\n semantic,\n transport,\n location,\n timestamp: new Date\n };\n}\nasync function resolve2(url) {\n const parsed = parseARP(url);\n const transport = getTransportHandler(parsed.transport);\n const semantic = getSemanticHandler(parsed.semantic);\n const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);\n return semantic.resolve(transport, parsed.location, context);\n}\nasync function deposit(url, data) {\n const parsed = parseARP(url);\n const transport = getTransportHandler(parsed.transport);\n const semantic = getSemanticHandler(parsed.semantic);\n if (!semantic.deposit) {\n throw new SemanticError(`Semantic \"${semantic.name}\" does not support deposit operation`, parsed.semantic);\n }\n const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);\n await semantic.deposit(transport, parsed.location, data, context);\n}\nasync function resourceExists(url) {\n const parsed = parseARP(url);\n const transport = getTransportHandler(parsed.transport);\n const semantic = getSemanticHandler(parsed.semantic);\n const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);\n if (semantic.exists) {\n return semantic.exists(transport, parsed.location, context);\n }\n if (transport.exists) {\n return transport.exists(parsed.location);\n }\n try {\n await transport.read(parsed.location);\n return true;\n } catch {\n return false;\n }\n}\nasync function resourceDelete(url) {\n const parsed = parseARP(url);\n const transport = getTransportHandler(parsed.transport);\n const semantic = getSemanticHandler(parsed.semantic);\n const context = createContext(url, parsed.semantic, parsed.transport, parsed.location);\n if (semantic.delete) {\n return semantic.delete(transport, parsed.location, context);\n }\n if (!transport.delete) {\n throw new SemanticError(`Neither semantic \"${semantic.name}\" nor transport \"${transport.name}\" supports delete operation`, parsed.semantic);\n }\n await transport.delete(parsed.location);\n}\n// src/resource/registry.ts\nfunction createResourceRegistry() {\n const registry = new Map;\n return {\n register(definition) {\n if (!/^[a-z][a-z0-9-]*$/.test(definition.name)) {\n throw new ParseError(`Invalid resource name: \"${definition.name}\". Must start with lowercase letter and contain only lowercase letters, numbers, and hyphens.`, definition.name);\n }\n getSemanticHandler(definition.semantic);\n getTransportHandler(definition.transport);\n registry.set(definition.name, definition);\n },\n get(name) {\n return registry.get(name);\n },\n has(name) {\n return registry.has(name);\n },\n clear() {\n registry.clear();\n }\n };\n}\n// src/index.ts\nvar VERSION = \"0.2.0\";\nexport {\n textHandler,\n resourceExists,\n resourceDelete,\n resolve2 as resolve,\n registerTransportHandler,\n registerSemanticHandler,\n parseARP,\n httpsHandler,\n httpHandler,\n getTransportHandler,\n getSemanticHandler,\n fileHandler,\n deposit,\n createResourceRegistry,\n binaryHandler,\n VERSION,\n TransportError,\n SemanticError,\n ResourceXError,\n ParseError\n};\n\n//# debugId=2B754A97DA9C772F64756E2164756E21\n",
6
+ "/**\n * ResourceX - Main API class\n */\n\nimport {\n parseARP,\n resolve as coreResolve,\n deposit as coreDeposit,\n resourceExists as coreExists,\n resourceDelete as coreDelete,\n getTransportHandler,\n getSemanticHandler,\n registerTransportHandler,\n registerSemanticHandler,\n createResourceRegistry,\n ParseError,\n type ParsedARP,\n type Resource,\n type TransportHandler,\n type SemanticHandler,\n type ResourceDefinition,\n type ResourceRegistry,\n} from \"@resourcexjs/core\";\nimport { join } from \"node:path\";\n\n/**\n * ResourceX configuration\n */\nexport interface ResourceXConfig {\n /**\n * Request timeout in milliseconds\n */\n timeout?: number;\n\n /**\n * Custom transport handlers to register\n */\n transports?: TransportHandler[];\n\n /**\n * Custom semantic handlers to register\n */\n semantics?: SemanticHandler[];\n\n /**\n * Resource definitions\n */\n resources?: ResourceDefinition[];\n}\n\n/**\n * ResourceX instance\n */\nexport class ResourceX {\n readonly timeout?: number;\n private readonly resourceRegistry: ResourceRegistry;\n\n constructor(config: ResourceXConfig = {}) {\n this.timeout = config.timeout;\n this.resourceRegistry = createResourceRegistry();\n\n // Register custom handlers from config\n if (config.transports) {\n for (const handler of config.transports) {\n registerTransportHandler(handler);\n }\n }\n\n if (config.semantics) {\n for (const handler of config.semantics) {\n registerSemanticHandler(handler);\n }\n }\n\n // Register resources from config\n if (config.resources) {\n for (const resource of config.resources) {\n this.resourceRegistry.register(resource);\n }\n }\n }\n\n /**\n * Parse URL (supports both ARP and Resource URLs)\n */\n private parseURL(url: string): { arpUrl: string; parsed: ParsedARP } {\n // Standard ARP URL\n if (url.startsWith(\"arp:\")) {\n return { arpUrl: url, parsed: parseARP(url) };\n }\n\n // Resource URL: name://location\n const match = url.match(/^([a-z][a-z0-9-]*):\\/\\/(.*)$/);\n if (!match) {\n throw new ParseError(`Invalid URL format: ${url}`, url);\n }\n\n const [, name, location] = match;\n const definition = this.resourceRegistry.get(name);\n\n if (!definition) {\n throw new ParseError(`Unknown resource: \"${name}\"`, url);\n }\n\n // Expand to full location\n const fullLocation = definition.basePath ? join(definition.basePath, location) : location;\n\n // Build ARP URL\n const arpUrl = `arp:${definition.semantic}:${definition.transport}://${fullLocation}`;\n\n return {\n arpUrl,\n parsed: {\n semantic: definition.semantic,\n transport: definition.transport,\n location: fullLocation,\n },\n };\n }\n\n /**\n * Parse an ARP URL without fetching\n */\n parse(url: string): ParsedARP {\n return this.parseURL(url).parsed;\n }\n\n /**\n * Resolve a URL to a resource\n */\n async resolve(url: string): Promise<Resource> {\n const { arpUrl } = this.parseURL(url);\n // TODO: implement timeout using this.timeout\n return coreResolve(arpUrl);\n }\n\n /**\n * Deposit data to a URL\n */\n async deposit(url: string, data: unknown): Promise<void> {\n const { arpUrl } = this.parseURL(url);\n return coreDeposit(arpUrl, data);\n }\n\n /**\n * Check if resource exists at URL\n */\n async exists(url: string): Promise<boolean> {\n const { arpUrl } = this.parseURL(url);\n return coreExists(arpUrl);\n }\n\n /**\n * Delete resource at URL\n */\n async delete(url: string): Promise<void> {\n const { arpUrl } = this.parseURL(url);\n return coreDelete(arpUrl);\n }\n\n /**\n * Register a custom transport handler\n */\n registerTransport(handler: TransportHandler): void {\n registerTransportHandler(handler);\n }\n\n /**\n * Register a custom semantic handler\n */\n registerSemantic(handler: SemanticHandler): void {\n registerSemanticHandler(handler);\n }\n\n /**\n * Get a transport handler by name\n */\n getTransport(name: string): TransportHandler {\n return getTransportHandler(name);\n }\n\n /**\n * Get a semantic handler by name\n */\n getSemantic(name: string): SemanticHandler {\n return getSemanticHandler(name);\n }\n}\n",
7
7
  "/**\n * Factory function for creating ResourceX instances\n */\n\nimport { ResourceX, type ResourceXConfig } from \"./ResourceX.js\";\n\n/**\n * Create a new ResourceX instance\n *\n * @example\n * ```typescript\n * import { createResourceX } from \"resourcexjs\";\n *\n * const rx = createResourceX();\n * const resource = await rx.resolve(\"arp:text:https://example.com/file.txt\");\n * ```\n *\n * @example\n * ```typescript\n * // With custom config\n * const rx = createResourceX({\n * timeout: 5000,\n * transports: [myCustomTransport],\n * semantics: [myCustomSemantic],\n * });\n * ```\n */\nexport function createResourceX(config?: ResourceXConfig): ResourceX {\n return new ResourceX(config);\n}\n"
8
8
  ],
9
- "mappings": "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",
10
- "debugId": "ACA93DAB894BAF0C64756E2164756E21",
9
+ "mappings": "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",
10
+ "debugId": "B9D21F1A64C8C12664756E2164756E21",
11
11
  "names": []
12
12
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "resourcexjs",
3
- "version": "0.0.3",
3
+ "version": "0.2.0",
4
4
  "description": "ResourceX - Agent Resource Protocol for AI Agents",
5
5
  "keywords": [
6
6
  "resourcex",
@@ -38,7 +38,7 @@
38
38
  "clean": "rm -rf dist"
39
39
  },
40
40
  "dependencies": {
41
- "@resourcexjs/core": "^0.0.3"
41
+ "@resourcexjs/core": "^0.2.0"
42
42
  },
43
43
  "devDependencies": {},
44
44
  "publishConfig": {