@contract-kit/provider-storage-local 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,528 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { createReadStream, createWriteStream } from "node:fs";
3
+ import { mkdir, readFile, rename, rm, stat as statFile, writeFile, } from "node:fs/promises";
4
+ import { dirname, isAbsolute, relative, resolve } from "node:path";
5
+ import { Readable } from "node:stream";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { createProviderDevtools } from "@contract-kit/devtools";
8
+ import { createProvider, } from "@contract-kit/ports";
9
+ import { z } from "zod";
10
+ const metadataRootName = ".ck-storage-meta";
11
+ const LocalStorageConfigSchema = z.object({
12
+ ROOT: z.string().min(1).default("storage/app"),
13
+ PUBLIC_BASE_URL: z.string().min(1).optional(),
14
+ });
15
+ function copyBytes(bytes) {
16
+ return new Uint8Array(bytes);
17
+ }
18
+ function bytesToArrayBuffer(bytes) {
19
+ const buffer = new ArrayBuffer(bytes.byteLength);
20
+ new Uint8Array(buffer).set(bytes);
21
+ return buffer;
22
+ }
23
+ function hasControlCharacter(value) {
24
+ for (const char of value) {
25
+ const code = char.charCodeAt(0);
26
+ if (code <= 31 || code === 127)
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ async function writeStorageBody(filePath, body) {
32
+ if (typeof body === "string") {
33
+ await writeFile(filePath, body);
34
+ return;
35
+ }
36
+ if (body instanceof Uint8Array) {
37
+ await writeFile(filePath, copyBytes(body));
38
+ return;
39
+ }
40
+ if (body instanceof ArrayBuffer) {
41
+ await writeFile(filePath, new Uint8Array(body.slice(0)));
42
+ return;
43
+ }
44
+ if (body instanceof Blob) {
45
+ await pipeline(Readable.fromWeb(body.stream()), createWriteStream(filePath));
46
+ return;
47
+ }
48
+ await pipeline(Readable.fromWeb(body), createWriteStream(filePath));
49
+ }
50
+ function validateStorageKey(key) {
51
+ if (key.length === 0) {
52
+ throw new Error("Storage key must not be empty.");
53
+ }
54
+ if (hasControlCharacter(key)) {
55
+ throw new Error("Storage key must not include control characters.");
56
+ }
57
+ if (key.startsWith("/")) {
58
+ throw new Error("Storage key must not start with '/'.");
59
+ }
60
+ if (key.endsWith("/")) {
61
+ throw new Error("Storage key must not end with '/'.");
62
+ }
63
+ if (key.includes("\\")) {
64
+ throw new Error("Storage key must use '/' separators, not '\\'.");
65
+ }
66
+ const segments = key.split("/");
67
+ if (segments.some((segment) => segment === "")) {
68
+ throw new Error("Storage key must not include empty path segments.");
69
+ }
70
+ if (segments.some((segment) => segment === "." || segment === "..")) {
71
+ throw new Error("Storage key must not include '.' or '..' segments.");
72
+ }
73
+ if (segments.some((segment) => segment === metadataRootName)) {
74
+ throw new Error(`Local storage key must not use reserved segment '${metadataRootName}'.`);
75
+ }
76
+ }
77
+ function joinPublicUrl(baseUrl, key) {
78
+ const base = baseUrl.replace(/\/+$/, "");
79
+ const encodedKey = key
80
+ .split("/")
81
+ .map((part) => encodeURIComponent(part))
82
+ .join("/");
83
+ return `${base}/${encodedKey}`;
84
+ }
85
+ function assertInsideRoot(root, filePath) {
86
+ const pathFromRoot = relative(root, filePath);
87
+ if (pathFromRoot === "" ||
88
+ pathFromRoot.startsWith("..") ||
89
+ isAbsolute(pathFromRoot)) {
90
+ throw new Error("Storage key resolved outside the storage root.");
91
+ }
92
+ }
93
+ function objectPath(root, key) {
94
+ validateStorageKey(key);
95
+ const filePath = resolve(root, ...key.split("/"));
96
+ assertInsideRoot(root, filePath);
97
+ return filePath;
98
+ }
99
+ function metadataPath(root, key) {
100
+ validateStorageKey(key);
101
+ const filePath = `${resolve(root, metadataRootName, ...key.split("/"))}.json`;
102
+ assertInsideRoot(root, filePath);
103
+ return filePath;
104
+ }
105
+ async function fileExists(filePath) {
106
+ try {
107
+ const fileStat = await statFile(filePath);
108
+ return fileStat.isFile();
109
+ }
110
+ catch (error) {
111
+ if (error.code === "ENOENT")
112
+ return false;
113
+ throw error;
114
+ }
115
+ }
116
+ async function readMetadata(root, key) {
117
+ const filePath = metadataPath(root, key);
118
+ try {
119
+ const raw = await readFile(filePath, "utf8");
120
+ return JSON.parse(raw);
121
+ }
122
+ catch (error) {
123
+ if (error.code === "ENOENT")
124
+ return null;
125
+ throw error;
126
+ }
127
+ }
128
+ async function writeMetadata(filePath, metadata) {
129
+ await writeFile(filePath, `${JSON.stringify(metadata, null, 2)}\n`, "utf8");
130
+ }
131
+ function temporaryPath(filePath, purpose) {
132
+ return `${filePath}.${purpose}.${randomUUID()}`;
133
+ }
134
+ async function renameFileIfExists(from, to) {
135
+ try {
136
+ const current = await statFile(from);
137
+ if (!current.isFile()) {
138
+ throw new Error(`Storage path is not a file: ${from}`);
139
+ }
140
+ }
141
+ catch (error) {
142
+ if (error.code === "ENOENT")
143
+ return false;
144
+ throw error;
145
+ }
146
+ await rename(from, to);
147
+ return true;
148
+ }
149
+ async function cleanupFile(filePath) {
150
+ await rm(filePath, { force: true });
151
+ }
152
+ async function restoreBackup(backupPath, filePath, backedUp) {
153
+ if (!backedUp)
154
+ return;
155
+ await rm(filePath, { force: true });
156
+ await rename(backupPath, filePath);
157
+ }
158
+ async function writeObjectAndMetadata(filePath, metaPath, body, metadata) {
159
+ const tempFilePath = temporaryPath(filePath, "tmp");
160
+ const tempMetaPath = temporaryPath(metaPath, "tmp");
161
+ const backupFilePath = temporaryPath(filePath, "backup");
162
+ const backupMetaPath = temporaryPath(metaPath, "backup");
163
+ let objectBackedUp = false;
164
+ let metadataBackedUp = false;
165
+ let objectCommitted = false;
166
+ let metadataCommitted = false;
167
+ try {
168
+ await Promise.all([
169
+ mkdir(dirname(filePath), { recursive: true }),
170
+ mkdir(dirname(metaPath), { recursive: true }),
171
+ ]);
172
+ await writeStorageBody(tempFilePath, body);
173
+ const objectStat = await statFile(tempFilePath);
174
+ if (!objectStat.isFile()) {
175
+ throw new Error("Storage body did not produce a file.");
176
+ }
177
+ await writeMetadata(tempMetaPath, metadata);
178
+ objectBackedUp = await renameFileIfExists(filePath, backupFilePath);
179
+ metadataBackedUp = await renameFileIfExists(metaPath, backupMetaPath);
180
+ await rename(tempFilePath, filePath);
181
+ objectCommitted = true;
182
+ await rename(tempMetaPath, metaPath);
183
+ metadataCommitted = true;
184
+ await Promise.all([
185
+ cleanupFile(backupFilePath),
186
+ cleanupFile(backupMetaPath),
187
+ ]);
188
+ return objectStat.size;
189
+ }
190
+ catch (error) {
191
+ await Promise.allSettled([
192
+ cleanupFile(tempFilePath),
193
+ cleanupFile(tempMetaPath),
194
+ objectCommitted ? cleanupFile(filePath) : Promise.resolve(),
195
+ metadataCommitted ? cleanupFile(metaPath) : Promise.resolve(),
196
+ ]);
197
+ await Promise.allSettled([
198
+ restoreBackup(backupFilePath, filePath, objectBackedUp),
199
+ restoreBackup(backupMetaPath, metaPath, metadataBackedUp),
200
+ ]);
201
+ throw error;
202
+ }
203
+ }
204
+ function metadataToObject(key, size, fallbackLastModified, metadata) {
205
+ return {
206
+ key,
207
+ size,
208
+ ...(metadata?.contentType !== undefined
209
+ ? { contentType: metadata.contentType }
210
+ : {}),
211
+ ...(metadata?.cacheControl !== undefined
212
+ ? { cacheControl: metadata.cacheControl }
213
+ : {}),
214
+ metadata: { ...(metadata?.metadata ?? {}) },
215
+ visibility: metadata?.visibility ?? "private",
216
+ lastModified: metadata?.lastModified
217
+ ? new Date(metadata.lastModified)
218
+ : fallbackLastModified,
219
+ };
220
+ }
221
+ function createObjectBody(object, filePath) {
222
+ let bodyUsed = false;
223
+ function markConsumed() {
224
+ if (bodyUsed) {
225
+ throw new Error("Storage object body has already been consumed.");
226
+ }
227
+ bodyUsed = true;
228
+ }
229
+ return {
230
+ ...object,
231
+ get bodyUsed() {
232
+ return bodyUsed;
233
+ },
234
+ stream() {
235
+ markConsumed();
236
+ return Readable.toWeb(createReadStream(filePath));
237
+ },
238
+ async bytes() {
239
+ markConsumed();
240
+ return copyBytes(await readFile(filePath));
241
+ },
242
+ async arrayBuffer() {
243
+ markConsumed();
244
+ return bytesToArrayBuffer(await readFile(filePath));
245
+ },
246
+ async text() {
247
+ markConsumed();
248
+ return readFile(filePath, "utf8");
249
+ },
250
+ };
251
+ }
252
+ function errorMessage(error) {
253
+ return error instanceof Error ? error.message : String(error);
254
+ }
255
+ export function createLocalStorage(options) {
256
+ const root = resolve(options.root);
257
+ const devtools = createProviderDevtools(options.devtools, {
258
+ providerName: "storage-local",
259
+ watcher: "storage",
260
+ });
261
+ const recordStorageEvent = (event) => {
262
+ devtools.custom({
263
+ name: `storage.${event.operation}`,
264
+ label: `Storage ${event.operation}`,
265
+ summary: event.summary,
266
+ details: {
267
+ operation: event.operation,
268
+ key: event.key,
269
+ ...event.details,
270
+ },
271
+ });
272
+ };
273
+ async function statObject(key) {
274
+ const filePath = objectPath(root, key);
275
+ try {
276
+ const [fileStat, metadata] = await Promise.all([
277
+ statFile(filePath),
278
+ readMetadata(root, key),
279
+ ]);
280
+ if (!fileStat.isFile())
281
+ return null;
282
+ return metadataToObject(key, fileStat.size, fileStat.mtime, metadata);
283
+ }
284
+ catch (error) {
285
+ if (error.code === "ENOENT")
286
+ return null;
287
+ throw error;
288
+ }
289
+ }
290
+ return {
291
+ async put(key, body, putOptions) {
292
+ const startedAt = Date.now();
293
+ try {
294
+ const filePath = objectPath(root, key);
295
+ const metaPath = metadataPath(root, key);
296
+ const lastModified = new Date();
297
+ const metadata = {
298
+ ...(putOptions?.contentType !== undefined
299
+ ? { contentType: putOptions.contentType }
300
+ : {}),
301
+ ...(putOptions?.cacheControl !== undefined
302
+ ? { cacheControl: putOptions.cacheControl }
303
+ : {}),
304
+ metadata: { ...(putOptions?.metadata ?? {}) },
305
+ visibility: putOptions?.visibility ?? "private",
306
+ lastModified: lastModified.toISOString(),
307
+ };
308
+ const size = await writeObjectAndMetadata(filePath, metaPath, body, metadata);
309
+ const object = metadataToObject(key, size, lastModified, metadata);
310
+ recordStorageEvent({
311
+ operation: "put",
312
+ key,
313
+ summary: "Storage object written",
314
+ details: {
315
+ size: object.size,
316
+ visibility: object.visibility,
317
+ contentType: object.contentType ?? null,
318
+ metadataKeys: Object.keys(object.metadata),
319
+ durationMs: Date.now() - startedAt,
320
+ },
321
+ });
322
+ return object;
323
+ }
324
+ catch (error) {
325
+ recordStorageEvent({
326
+ operation: "put.failed",
327
+ key,
328
+ summary: "Storage put failed",
329
+ details: {
330
+ durationMs: Date.now() - startedAt,
331
+ error: errorMessage(error),
332
+ },
333
+ });
334
+ throw error;
335
+ }
336
+ },
337
+ async get(key) {
338
+ const startedAt = Date.now();
339
+ try {
340
+ const object = await statObject(key);
341
+ const filePath = objectPath(root, key);
342
+ recordStorageEvent({
343
+ operation: "get",
344
+ key,
345
+ summary: object ? "Storage object read" : "Storage object missing",
346
+ details: {
347
+ hit: object !== null,
348
+ size: object?.size ?? null,
349
+ durationMs: Date.now() - startedAt,
350
+ },
351
+ });
352
+ if (!object)
353
+ return null;
354
+ return createObjectBody(object, filePath);
355
+ }
356
+ catch (error) {
357
+ recordStorageEvent({
358
+ operation: "get.failed",
359
+ key,
360
+ summary: "Storage get failed",
361
+ details: {
362
+ durationMs: Date.now() - startedAt,
363
+ error: errorMessage(error),
364
+ },
365
+ });
366
+ throw error;
367
+ }
368
+ },
369
+ async stat(key) {
370
+ const startedAt = Date.now();
371
+ try {
372
+ const object = await statObject(key);
373
+ recordStorageEvent({
374
+ operation: "stat",
375
+ key,
376
+ summary: object ? "Storage object found" : "Storage object missing",
377
+ details: {
378
+ hit: object !== null,
379
+ size: object?.size ?? null,
380
+ durationMs: Date.now() - startedAt,
381
+ },
382
+ });
383
+ return object;
384
+ }
385
+ catch (error) {
386
+ recordStorageEvent({
387
+ operation: "stat.failed",
388
+ key,
389
+ summary: "Storage stat failed",
390
+ details: {
391
+ durationMs: Date.now() - startedAt,
392
+ error: errorMessage(error),
393
+ },
394
+ });
395
+ throw error;
396
+ }
397
+ },
398
+ async delete(key) {
399
+ const startedAt = Date.now();
400
+ try {
401
+ const filePath = objectPath(root, key);
402
+ const metaPath = metadataPath(root, key);
403
+ const existed = await fileExists(filePath);
404
+ await Promise.all([
405
+ existed ? rm(filePath, { force: true }) : Promise.resolve(),
406
+ rm(metaPath, { force: true }),
407
+ ]);
408
+ recordStorageEvent({
409
+ operation: "delete",
410
+ key,
411
+ summary: existed
412
+ ? "Storage object deleted"
413
+ : "Storage object missing",
414
+ details: {
415
+ deleted: existed,
416
+ durationMs: Date.now() - startedAt,
417
+ },
418
+ });
419
+ return existed;
420
+ }
421
+ catch (error) {
422
+ recordStorageEvent({
423
+ operation: "delete.failed",
424
+ key,
425
+ summary: "Storage delete failed",
426
+ details: {
427
+ durationMs: Date.now() - startedAt,
428
+ error: errorMessage(error),
429
+ },
430
+ });
431
+ throw error;
432
+ }
433
+ },
434
+ async exists(key) {
435
+ const startedAt = Date.now();
436
+ try {
437
+ const exists = await fileExists(objectPath(root, key));
438
+ recordStorageEvent({
439
+ operation: "exists",
440
+ key,
441
+ summary: exists ? "Storage object exists" : "Storage object missing",
442
+ details: {
443
+ exists,
444
+ durationMs: Date.now() - startedAt,
445
+ },
446
+ });
447
+ return exists;
448
+ }
449
+ catch (error) {
450
+ recordStorageEvent({
451
+ operation: "exists.failed",
452
+ key,
453
+ summary: "Storage exists failed",
454
+ details: {
455
+ durationMs: Date.now() - startedAt,
456
+ error: errorMessage(error),
457
+ },
458
+ });
459
+ throw error;
460
+ }
461
+ },
462
+ async publicUrl(key) {
463
+ const startedAt = Date.now();
464
+ try {
465
+ const object = await statObject(key);
466
+ const url = object?.visibility === "public" && options.publicBaseUrl
467
+ ? joinPublicUrl(options.publicBaseUrl, key)
468
+ : null;
469
+ recordStorageEvent({
470
+ operation: "publicUrl",
471
+ key,
472
+ summary: url ? "Storage public URL resolved" : "No public URL",
473
+ details: {
474
+ hit: object !== null,
475
+ visibility: object?.visibility ?? null,
476
+ hasPublicUrl: url !== null,
477
+ durationMs: Date.now() - startedAt,
478
+ },
479
+ });
480
+ return url;
481
+ }
482
+ catch (error) {
483
+ recordStorageEvent({
484
+ operation: "publicUrl.failed",
485
+ key,
486
+ summary: "Storage public URL failed",
487
+ details: {
488
+ durationMs: Date.now() - startedAt,
489
+ error: errorMessage(error),
490
+ },
491
+ });
492
+ throw error;
493
+ }
494
+ },
495
+ };
496
+ }
497
+ export function createLocalStorageProvider(options = {}) {
498
+ const ConfigSchema = LocalStorageConfigSchema.extend({
499
+ ROOT: z
500
+ .string()
501
+ .min(1)
502
+ .default(options.root ?? "storage/app"),
503
+ });
504
+ return createProvider({
505
+ name: options.name ?? "storage-local",
506
+ config: {
507
+ schema: ConfigSchema,
508
+ envPrefix: "STORAGE_",
509
+ },
510
+ async setup({ ports, config }) {
511
+ if (!config) {
512
+ throw new Error("[localStorageProvider] Missing storage config. " +
513
+ "Please set STORAGE_ROOT or use the default storage/app path.");
514
+ }
515
+ return {
516
+ ports: {
517
+ storage: createLocalStorage({
518
+ root: config.ROOT,
519
+ publicBaseUrl: config.PUBLIC_BASE_URL ?? options.publicBaseUrl,
520
+ devtools: ports,
521
+ }),
522
+ },
523
+ };
524
+ },
525
+ });
526
+ }
527
+ export const localStorageProvider = createLocalStorageProvider();
528
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@contract-kit/provider-storage-local",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "Local filesystem storage provider for Contract Kit",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "src",
17
+ "!src/**/*.test.ts",
18
+ "!src/**/*.test.tsx",
19
+ "!src/**/*.test-d.ts",
20
+ "README.md",
21
+ "CHANGELOG.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "dev": "tsc --watch",
26
+ "clean": "rm -rf dist coverage .turbo",
27
+ "test": "bun test",
28
+ "test:coverage": "bun test --coverage",
29
+ "lint": "biome check ."
30
+ },
31
+ "keywords": [
32
+ "contract-kit",
33
+ "storage",
34
+ "provider",
35
+ "filesystem",
36
+ "local",
37
+ "ports"
38
+ ],
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/taylorbryant/contract-kit.git",
43
+ "directory": "packages/provider-storage-local"
44
+ },
45
+ "author": "Taylor Bryant",
46
+ "homepage": "https://github.com/taylorbryant/contract-kit#readme",
47
+ "bugs": "https://github.com/taylorbryant/contract-kit/issues",
48
+ "sideEffects": false,
49
+ "publishConfig": {
50
+ "access": "public"
51
+ },
52
+ "engines": {
53
+ "node": ">=18.0.0"
54
+ },
55
+ "dependencies": {
56
+ "@contract-kit/devtools": "*",
57
+ "@contract-kit/ports": "*",
58
+ "zod": "^4.0.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/bun": "^1.3.13",
62
+ "@types/node": "^20.10.0",
63
+ "typescript": "^5.3.0"
64
+ }
65
+ }