@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.
Files changed (78) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +56 -0
  4. package/dist/base64.d.ts +8 -0
  5. package/dist/base64.js +25 -0
  6. package/dist/client/index.d.ts +50 -0
  7. package/dist/client/index.js +243 -0
  8. package/dist/decorators/inject-storage.decorator.d.ts +17 -0
  9. package/dist/decorators/inject-storage.decorator.js +21 -0
  10. package/dist/drivers/memory/index.d.ts +16 -0
  11. package/dist/drivers/memory/index.js +202 -0
  12. package/dist/drivers/r2/index.d.ts +11 -0
  13. package/dist/drivers/r2/index.js +166 -0
  14. package/dist/drivers/r2/r2.types.d.ts +67 -0
  15. package/dist/drivers/r2/r2.types.js +5 -0
  16. package/dist/drivers/r2-http/index.d.ts +33 -0
  17. package/dist/drivers/r2-http/index.js +52 -0
  18. package/dist/drivers/s3/index.d.ts +5 -0
  19. package/dist/drivers/s3/index.js +3 -0
  20. package/dist/drivers/s3/s3-client.d.ts +33 -0
  21. package/dist/drivers/s3/s3-client.js +154 -0
  22. package/dist/drivers/s3/s3.driver.d.ts +4 -0
  23. package/dist/drivers/s3/s3.driver.js +404 -0
  24. package/dist/drivers/s3/s3.types.d.ts +28 -0
  25. package/dist/drivers/s3/s3.types.js +1 -0
  26. package/dist/drivers/s3/xml.d.ts +6 -0
  27. package/dist/drivers/s3/xml.js +52 -0
  28. package/dist/http/authorizer.types.d.ts +59 -0
  29. package/dist/http/authorizer.types.js +1 -0
  30. package/dist/http/http-helpers.d.ts +22 -0
  31. package/dist/http/http-helpers.js +80 -0
  32. package/dist/http/protocol.types.d.ts +76 -0
  33. package/dist/http/protocol.types.js +1 -0
  34. package/dist/index.d.ts +17 -0
  35. package/dist/index.js +16 -0
  36. package/dist/internal/body.d.ts +18 -0
  37. package/dist/internal/body.js +90 -0
  38. package/dist/internal/retry.d.ts +41 -0
  39. package/dist/internal/retry.js +127 -0
  40. package/dist/internal/stored-file.d.ts +27 -0
  41. package/dist/internal/stored-file.js +114 -0
  42. package/dist/middleware/cache.d.ts +50 -0
  43. package/dist/middleware/cache.js +101 -0
  44. package/dist/middleware/compose.d.ts +12 -0
  45. package/dist/middleware/compose.js +11 -0
  46. package/dist/middleware/compression.d.ts +16 -0
  47. package/dist/middleware/compression.js +101 -0
  48. package/dist/middleware/encryption.d.ts +14 -0
  49. package/dist/middleware/encryption.js +134 -0
  50. package/dist/middleware/failover.d.ts +18 -0
  51. package/dist/middleware/failover.js +52 -0
  52. package/dist/middleware/index.d.ts +15 -0
  53. package/dist/middleware/index.js +8 -0
  54. package/dist/middleware/retry.d.ts +14 -0
  55. package/dist/middleware/retry.js +47 -0
  56. package/dist/middleware/versioning.d.ts +36 -0
  57. package/dist/middleware/versioning.js +89 -0
  58. package/dist/middleware/wrap.d.ts +11 -0
  59. package/dist/middleware/wrap.js +46 -0
  60. package/dist/object-key.d.ts +17 -0
  61. package/dist/object-key.js +42 -0
  62. package/dist/storage.controller.d.ts +21 -0
  63. package/dist/storage.controller.js +380 -0
  64. package/dist/storage.error.d.ts +28 -0
  65. package/dist/storage.error.js +46 -0
  66. package/dist/storage.facade.d.ts +47 -0
  67. package/dist/storage.facade.js +443 -0
  68. package/dist/storage.module.d.ts +46 -0
  69. package/dist/storage.module.js +113 -0
  70. package/dist/storage.service.d.ts +42 -0
  71. package/dist/storage.service.js +86 -0
  72. package/dist/storage.tokens.d.ts +13 -0
  73. package/dist/storage.tokens.js +26 -0
  74. package/dist/storage.types.d.ts +245 -0
  75. package/dist/storage.types.js +1 -0
  76. package/dist/storagesdk/index.d.ts +85 -0
  77. package/dist/storagesdk/index.js +136 -0
  78. 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
+ }