@velajs/storage 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/CHANGELOG.md +14 -0
- package/LICENSE +21 -0
- package/README.md +56 -0
- package/dist/base64.d.ts +8 -0
- package/dist/base64.js +25 -0
- package/dist/client/index.d.ts +50 -0
- package/dist/client/index.js +243 -0
- package/dist/decorators/inject-storage.decorator.d.ts +17 -0
- package/dist/decorators/inject-storage.decorator.js +21 -0
- package/dist/drivers/memory/index.d.ts +16 -0
- package/dist/drivers/memory/index.js +202 -0
- package/dist/drivers/r2/index.d.ts +11 -0
- package/dist/drivers/r2/index.js +166 -0
- package/dist/drivers/r2/r2.types.d.ts +67 -0
- package/dist/drivers/r2/r2.types.js +5 -0
- package/dist/drivers/r2-http/index.d.ts +33 -0
- package/dist/drivers/r2-http/index.js +52 -0
- package/dist/drivers/s3/index.d.ts +5 -0
- package/dist/drivers/s3/index.js +3 -0
- package/dist/drivers/s3/s3-client.d.ts +33 -0
- package/dist/drivers/s3/s3-client.js +154 -0
- package/dist/drivers/s3/s3.driver.d.ts +4 -0
- package/dist/drivers/s3/s3.driver.js +404 -0
- package/dist/drivers/s3/s3.types.d.ts +28 -0
- package/dist/drivers/s3/s3.types.js +1 -0
- package/dist/drivers/s3/xml.d.ts +6 -0
- package/dist/drivers/s3/xml.js +52 -0
- package/dist/http/authorizer.types.d.ts +59 -0
- package/dist/http/authorizer.types.js +1 -0
- package/dist/http/http-helpers.d.ts +22 -0
- package/dist/http/http-helpers.js +80 -0
- package/dist/http/protocol.types.d.ts +76 -0
- package/dist/http/protocol.types.js +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +16 -0
- package/dist/internal/body.d.ts +18 -0
- package/dist/internal/body.js +90 -0
- package/dist/internal/retry.d.ts +41 -0
- package/dist/internal/retry.js +127 -0
- package/dist/internal/stored-file.d.ts +27 -0
- package/dist/internal/stored-file.js +114 -0
- package/dist/middleware/cache.d.ts +50 -0
- package/dist/middleware/cache.js +101 -0
- package/dist/middleware/compose.d.ts +12 -0
- package/dist/middleware/compose.js +11 -0
- package/dist/middleware/compression.d.ts +16 -0
- package/dist/middleware/compression.js +101 -0
- package/dist/middleware/encryption.d.ts +14 -0
- package/dist/middleware/encryption.js +134 -0
- package/dist/middleware/failover.d.ts +18 -0
- package/dist/middleware/failover.js +52 -0
- package/dist/middleware/index.d.ts +15 -0
- package/dist/middleware/index.js +8 -0
- package/dist/middleware/retry.d.ts +14 -0
- package/dist/middleware/retry.js +47 -0
- package/dist/middleware/versioning.d.ts +36 -0
- package/dist/middleware/versioning.js +89 -0
- package/dist/middleware/wrap.d.ts +11 -0
- package/dist/middleware/wrap.js +46 -0
- package/dist/object-key.d.ts +17 -0
- package/dist/object-key.js +42 -0
- package/dist/storage.controller.d.ts +21 -0
- package/dist/storage.controller.js +380 -0
- package/dist/storage.error.d.ts +28 -0
- package/dist/storage.error.js +46 -0
- package/dist/storage.facade.d.ts +47 -0
- package/dist/storage.facade.js +443 -0
- package/dist/storage.module.d.ts +46 -0
- package/dist/storage.module.js +113 -0
- package/dist/storage.service.d.ts +42 -0
- package/dist/storage.service.js +86 -0
- package/dist/storage.tokens.d.ts +13 -0
- package/dist/storage.tokens.js +26 -0
- package/dist/storage.types.d.ts +245 -0
- package/dist/storage.types.js +1 -0
- package/dist/storagesdk/index.d.ts +85 -0
- package/dist/storagesdk/index.js +136 -0
- package/package.json +116 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { byteLengthOf } from "../internal/body.js";
|
|
2
|
+
import { createStoredFile } from "../internal/stored-file.js";
|
|
3
|
+
import { StorageError } from "../storage.error.js";
|
|
4
|
+
function toMillis(d) {
|
|
5
|
+
if (d == null) return undefined;
|
|
6
|
+
return d instanceof Date ? d.getTime() : d;
|
|
7
|
+
}
|
|
8
|
+
function metaOf(item) {
|
|
9
|
+
return {
|
|
10
|
+
key: item.path,
|
|
11
|
+
size: item.size,
|
|
12
|
+
type: item.contentType || 'application/octet-stream',
|
|
13
|
+
etag: item.etag,
|
|
14
|
+
lastModified: toMillis(item.lastModified),
|
|
15
|
+
metadata: item.metadata
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Adapt a `@storagesdk/adapters` adapter to a {@link StorageDriver}.
|
|
20
|
+
*
|
|
21
|
+
* storagesdk's shape differs from ours (path-based; `download` returns buffered
|
|
22
|
+
* bytes rather than a stream; no first-class multipart or capability flags),
|
|
23
|
+
* so this is an explicit mapping. Multipart / presigned-multipart are not
|
|
24
|
+
* exposed (the facade will gate them as `Unsupported`).
|
|
25
|
+
*/ export function storageSdkDriver(adapter, options) {
|
|
26
|
+
const hasUploadUrl = typeof adapter.signedUploadUrl === 'function';
|
|
27
|
+
const driver = {
|
|
28
|
+
name: `storagesdk:${adapter.name ?? 'adapter'}`,
|
|
29
|
+
raw: adapter.raw,
|
|
30
|
+
supportsRange: options?.supportsRange ?? false,
|
|
31
|
+
supportsDelimiter: options?.supportsDelimiter ?? false,
|
|
32
|
+
supportsMetadata: options?.supportsMetadata ?? true,
|
|
33
|
+
supportsCacheControl: options?.supportsCacheControl ?? false,
|
|
34
|
+
supportsServerSideCopy: true,
|
|
35
|
+
reportsUploadProgress: false,
|
|
36
|
+
signedUrl: {
|
|
37
|
+
supported: typeof adapter.url === 'function',
|
|
38
|
+
upload: hasUploadUrl
|
|
39
|
+
},
|
|
40
|
+
async upload (key, body, opts) {
|
|
41
|
+
const r = await adapter.upload(key, body, {
|
|
42
|
+
contentType: opts?.contentType,
|
|
43
|
+
metadata: opts?.metadata,
|
|
44
|
+
signal: opts?.signal
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
key,
|
|
48
|
+
size: r?.size ?? byteLengthOf(body) ?? 0,
|
|
49
|
+
contentType: opts?.contentType ?? r?.contentType ?? 'application/octet-stream',
|
|
50
|
+
etag: r?.etag,
|
|
51
|
+
lastModified: toMillis(r?.lastModified)
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
async download (key, opts) {
|
|
55
|
+
const item = await adapter.download(key, {
|
|
56
|
+
signal: opts?.signal
|
|
57
|
+
});
|
|
58
|
+
return createStoredFile(metaOf(item), {
|
|
59
|
+
kind: 'bytes',
|
|
60
|
+
bytes: item.body
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
async head (key, opts) {
|
|
64
|
+
const item = await adapter.head(key, {
|
|
65
|
+
signal: opts?.signal
|
|
66
|
+
});
|
|
67
|
+
return createStoredFile(metaOf(item), {
|
|
68
|
+
kind: 'lazy',
|
|
69
|
+
fetch: async ()=>new Response((await adapter.download(key)).body)
|
|
70
|
+
});
|
|
71
|
+
},
|
|
72
|
+
async exists (key, opts) {
|
|
73
|
+
if (adapter.exists) return adapter.exists(key, {
|
|
74
|
+
signal: opts?.signal
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
await adapter.head(key, {
|
|
78
|
+
signal: opts?.signal
|
|
79
|
+
});
|
|
80
|
+
return true;
|
|
81
|
+
} catch (e) {
|
|
82
|
+
if (e instanceof StorageError && e.code === 'NotFound') return false;
|
|
83
|
+
if (e && typeof e === 'object' && e.code === 'NotFound') return false;
|
|
84
|
+
throw e;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
async delete (key, opts) {
|
|
88
|
+
await adapter.delete(key, {
|
|
89
|
+
signal: opts?.signal
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
async copy (from, to, opts) {
|
|
93
|
+
await adapter.copy(from, to, {
|
|
94
|
+
signal: opts?.signal
|
|
95
|
+
});
|
|
96
|
+
},
|
|
97
|
+
async list (opts) {
|
|
98
|
+
const r = await adapter.list({
|
|
99
|
+
prefix: opts?.prefix,
|
|
100
|
+
cursor: opts?.cursor,
|
|
101
|
+
limit: opts?.limit,
|
|
102
|
+
delimiter: opts?.delimiter,
|
|
103
|
+
signal: opts?.signal
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
items: r.items.map((item)=>createStoredFile(metaOf(item), {
|
|
107
|
+
kind: 'lazy',
|
|
108
|
+
fetch: async ()=>new Response((await adapter.download(item.path)).body)
|
|
109
|
+
})),
|
|
110
|
+
prefixes: r.prefixes,
|
|
111
|
+
cursor: r.cursor
|
|
112
|
+
};
|
|
113
|
+
},
|
|
114
|
+
async url (key, opts) {
|
|
115
|
+
return adapter.url(key, {
|
|
116
|
+
expiresIn: opts?.expiresIn,
|
|
117
|
+
signal: opts?.signal
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
async signedUploadUrl (key, opts) {
|
|
121
|
+
if (!adapter.signedUploadUrl) {
|
|
122
|
+
throw new StorageError('Unsupported', 'storagesdk adapter cannot presign uploads');
|
|
123
|
+
}
|
|
124
|
+
return adapter.signedUploadUrl(key, {
|
|
125
|
+
expiresIn: opts.expiresIn,
|
|
126
|
+
contentType: opts.contentType
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
if (adapter.move) {
|
|
131
|
+
driver.move = (from, to, opts)=>adapter.move(from, to, {
|
|
132
|
+
signal: opts?.signal
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return driver;
|
|
136
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@velajs/storage",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Edge-first, driver-based object/file storage for the Vela framework",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./client": {
|
|
14
|
+
"types": "./dist/client/index.d.ts",
|
|
15
|
+
"import": "./dist/client/index.js"
|
|
16
|
+
},
|
|
17
|
+
"./drivers/memory": {
|
|
18
|
+
"types": "./dist/drivers/memory/index.d.ts",
|
|
19
|
+
"import": "./dist/drivers/memory/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./drivers/s3": {
|
|
22
|
+
"types": "./dist/drivers/s3/index.d.ts",
|
|
23
|
+
"import": "./dist/drivers/s3/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./drivers/r2": {
|
|
26
|
+
"types": "./dist/drivers/r2/index.d.ts",
|
|
27
|
+
"import": "./dist/drivers/r2/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./drivers/r2-http": {
|
|
30
|
+
"types": "./dist/drivers/r2-http/index.d.ts",
|
|
31
|
+
"import": "./dist/drivers/r2-http/index.js"
|
|
32
|
+
},
|
|
33
|
+
"./middleware": {
|
|
34
|
+
"types": "./dist/middleware/index.d.ts",
|
|
35
|
+
"import": "./dist/middleware/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./storagesdk": {
|
|
38
|
+
"types": "./dist/storagesdk/index.d.ts",
|
|
39
|
+
"import": "./dist/storagesdk/index.js"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"dist",
|
|
44
|
+
"README.md",
|
|
45
|
+
"LICENSE",
|
|
46
|
+
"CHANGELOG.md"
|
|
47
|
+
],
|
|
48
|
+
"scripts": {
|
|
49
|
+
"build": "rm -rf dist && swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:workers": "vitest run --config vitest.config.workers.ts",
|
|
52
|
+
"typecheck": "tsc --noEmit",
|
|
53
|
+
"prepare": "swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
|
|
54
|
+
"prepublishOnly": "pnpm run typecheck && pnpm test"
|
|
55
|
+
},
|
|
56
|
+
"sideEffects": false,
|
|
57
|
+
"keywords": [
|
|
58
|
+
"vela",
|
|
59
|
+
"storage",
|
|
60
|
+
"object-storage",
|
|
61
|
+
"s3",
|
|
62
|
+
"r2",
|
|
63
|
+
"presigned-url",
|
|
64
|
+
"multipart",
|
|
65
|
+
"edge",
|
|
66
|
+
"cloudflare-workers",
|
|
67
|
+
"framework"
|
|
68
|
+
],
|
|
69
|
+
"author": "ksh",
|
|
70
|
+
"license": "MIT",
|
|
71
|
+
"repository": {
|
|
72
|
+
"type": "git",
|
|
73
|
+
"url": "git+https://github.com/velajs/storage.git"
|
|
74
|
+
},
|
|
75
|
+
"homepage": "https://github.com/velajs/storage#readme",
|
|
76
|
+
"bugs": {
|
|
77
|
+
"url": "https://github.com/velajs/storage/issues"
|
|
78
|
+
},
|
|
79
|
+
"engines": {
|
|
80
|
+
"node": ">=20"
|
|
81
|
+
},
|
|
82
|
+
"dependencies": {
|
|
83
|
+
"aws4fetch": "^1.0.20"
|
|
84
|
+
},
|
|
85
|
+
"peerDependencies": {
|
|
86
|
+
"@velajs/vela": ">=1.11.0",
|
|
87
|
+
"hono": ">=4",
|
|
88
|
+
"@cloudflare/workers-types": ">=4"
|
|
89
|
+
},
|
|
90
|
+
"peerDependenciesMeta": {
|
|
91
|
+
"@cloudflare/workers-types": {
|
|
92
|
+
"optional": true
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"devDependencies": {
|
|
96
|
+
"@cloudflare/vitest-pool-workers": "^0.16.18",
|
|
97
|
+
"@cloudflare/workers-types": "^4.20260624.1",
|
|
98
|
+
"@swc/cli": "^0.8.1",
|
|
99
|
+
"@swc/core": "^1.15.43",
|
|
100
|
+
"@velajs/testing": "^0.4.0",
|
|
101
|
+
"@velajs/vela": "^1.12.0",
|
|
102
|
+
"aws4fetch": "^1.0.20",
|
|
103
|
+
"hono": "^4.12.27",
|
|
104
|
+
"typescript": "^6.0.3",
|
|
105
|
+
"unplugin-swc": "^1.5.9",
|
|
106
|
+
"vitest": "^4.1.9"
|
|
107
|
+
},
|
|
108
|
+
"packageManager": "pnpm@10.20.0",
|
|
109
|
+
"pnpm": {
|
|
110
|
+
"onlyBuiltDependencies": [
|
|
111
|
+
"@swc/core",
|
|
112
|
+
"esbuild",
|
|
113
|
+
"workerd"
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
}
|