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 +99 -12
- package/dist/index.d.ts +29 -8
- package/dist/index.js +330 -43
- package/dist/index.js.map +4 -4
- package/package.json +2 -2
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
|
|
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:
|
|
42
|
-
- `arp:text:file
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
63
|
+
* Get a transport handler by name
|
|
43
64
|
*/
|
|
44
|
-
getTransport(
|
|
65
|
+
getTransport(name: string): TransportHandler;
|
|
45
66
|
/**
|
|
46
|
-
* Get a semantic handler by
|
|
67
|
+
* Get a semantic handler by name
|
|
47
68
|
*/
|
|
48
|
-
getSemantic(
|
|
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,
|
|
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
|
|
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
|
-
|
|
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.
|
|
79
|
+
this.name = protocol;
|
|
73
80
|
}
|
|
74
|
-
async
|
|
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.
|
|
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.
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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.
|
|
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(
|
|
115
|
-
const handler = handlers.get(
|
|
203
|
+
function getTransportHandler(name) {
|
|
204
|
+
const handler = handlers.get(name);
|
|
116
205
|
if (!handler) {
|
|
117
|
-
throw new TransportError(`Unsupported transport 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.
|
|
211
|
+
handlers.set(handler.name, handler);
|
|
123
212
|
}
|
|
124
213
|
|
|
125
214
|
class TextSemanticHandler {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const
|
|
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:
|
|
224
|
+
size: buffer.length,
|
|
135
225
|
encoding: "utf-8",
|
|
136
226
|
mimeType: "text/plain",
|
|
137
|
-
|
|
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
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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: ${
|
|
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.
|
|
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
|
|
162
|
-
const
|
|
163
|
-
const
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
|
465
|
+
return this.parseURL(url).parsed;
|
|
192
466
|
}
|
|
193
467
|
async resolve(url) {
|
|
194
|
-
|
|
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(
|
|
203
|
-
return getTransportHandler(
|
|
489
|
+
getTransport(name) {
|
|
490
|
+
return getTransportHandler(name);
|
|
204
491
|
}
|
|
205
|
-
getSemantic(
|
|
206
|
-
return getSemanticHandler(
|
|
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=
|
|
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
|
|
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": "
|
|
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
|
+
"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
|
|
41
|
+
"@resourcexjs/core": "^0.2.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {},
|
|
44
44
|
"publishConfig": {
|