@beignet/provider-storage-s3 0.0.2 → 0.0.4
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 +46 -0
- package/README.md +70 -5
- package/dist/index.d.ts +46 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +134 -3
- package/dist/index.js.map +1 -1
- package/package.json +48 -4
- package/src/index.ts +186 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# @beignet/provider-storage-s3
|
|
2
2
|
|
|
3
|
+
## 0.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8bcb31f: Mark package READMEs with Beignet's experimental alpha status and 0.0.x stability expectations.
|
|
8
|
+
- d137044: Declare `@beignet/core` as a peer dependency with a lockstep version range in
|
|
9
|
+
every integration and provider package instead of a regular `"*"` dependency.
|
|
10
|
+
Installs now always resolve a single shared copy of core, so `instanceof`
|
|
11
|
+
checks such as `isContractError` and upload error identity keep working, and
|
|
12
|
+
mixed Beignet versions fail loudly at install time instead of at runtime.
|
|
13
|
+
|
|
14
|
+
If your package manager does not install peer dependencies automatically, add
|
|
15
|
+
`@beignet/core` to your app alongside these packages. `@beignet/nuqs` now also
|
|
16
|
+
declares `@beignet/react-query` as a peer dependency, and
|
|
17
|
+
`@beignet/provider-storage-s3` now expects you to install
|
|
18
|
+
`@aws-sdk/client-s3` and `@aws-sdk/s3-request-presigner` yourself, matching
|
|
19
|
+
how other providers treat their SDKs.
|
|
20
|
+
|
|
21
|
+
- 1a79090: Emit Node-compatible ESM: all relative imports in published packages now carry explicit .js extensions, fixing ERR_MODULE_NOT_FOUND when running the CLI or importing package dist files under plain Node.
|
|
22
|
+
- 44f1192: Move first-party provider diagnostics to package-owned `beignet.provider`
|
|
23
|
+
manifest metadata and have doctor read installed provider package manifests.
|
|
24
|
+
- 2aa77ca: Add static provider metadata and provider wiring diagnostics for generated apps.
|
|
25
|
+
- 89390fe: Destroy the AWS SDK S3 client the storage provider created when the server
|
|
26
|
+
stops, releasing keep-alive sockets. Clients injected through `createClient`
|
|
27
|
+
or `client` stay caller-owned and are never destroyed. `publicUrl(...)` now
|
|
28
|
+
returns `null` without a `HeadObject` request when `publicBaseUrl` is not
|
|
29
|
+
configured.
|
|
30
|
+
|
|
31
|
+
## 0.0.3
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- 4cb1784: Add first-class upload router primitives, a typed browser upload client, a
|
|
36
|
+
React upload adapter, Next.js upload route helper, S3-compatible direct upload
|
|
37
|
+
signing, devtools upload watcher support, an upload generator, and a
|
|
38
|
+
first-class `beignet make feature` command with optional policy, event, job,
|
|
39
|
+
and upload artifacts for the standard vertical slice. Add first-class job retry
|
|
40
|
+
helpers, outbox retry policy integration, and job retry/dead-letter devtools
|
|
41
|
+
events. Add a Next.js outbox drain route helper and doctor warnings for
|
|
42
|
+
serverless background-work footguns.
|
|
43
|
+
- Updated dependencies [3160184]
|
|
44
|
+
- Updated dependencies [254ef6d]
|
|
45
|
+
- Updated dependencies [4cb1784]
|
|
46
|
+
- Updated dependencies [8bd9085]
|
|
47
|
+
- @beignet/core@0.0.3
|
|
48
|
+
|
|
3
49
|
## 0.0.2
|
|
4
50
|
|
|
5
51
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# @beignet/provider-storage-s3
|
|
2
2
|
|
|
3
|
+
> [!CAUTION]
|
|
4
|
+
> Beignet is experimental alpha software. The `0.0.x` package line is for early
|
|
5
|
+
> evaluation, and APIs may change between releases while the framework settles.
|
|
6
|
+
|
|
3
7
|
S3-compatible object storage provider for Beignet.
|
|
4
8
|
|
|
5
9
|
The provider installs the app-facing `ctx.ports.storage` port. Use it for
|
|
@@ -9,7 +13,7 @@ DigitalOcean Spaces, or another S3-compatible backend.
|
|
|
9
13
|
## Install
|
|
10
14
|
|
|
11
15
|
```bash
|
|
12
|
-
bun add @beignet/provider-storage-s3
|
|
16
|
+
bun add @beignet/provider-storage-s3 @beignet/core @aws-sdk/client-s3 @aws-sdk/s3-request-presigner
|
|
13
17
|
```
|
|
14
18
|
|
|
15
19
|
## Provider setup
|
|
@@ -21,7 +25,7 @@ import { createServer } from "@beignet/core/server";
|
|
|
21
25
|
const server = await createServer({
|
|
22
26
|
ports: basePorts,
|
|
23
27
|
providers: [s3StorageProvider],
|
|
24
|
-
|
|
28
|
+
context: ({ ports }) => ({ ports }),
|
|
25
29
|
routes,
|
|
26
30
|
});
|
|
27
31
|
```
|
|
@@ -66,6 +70,37 @@ R2 is S3-compatible, but not every S3 feature exists on every compatible
|
|
|
66
70
|
service. This provider only relies on object `put`, `get`, `head`, and
|
|
67
71
|
`delete`.
|
|
68
72
|
|
|
73
|
+
## Client lifecycle
|
|
74
|
+
|
|
75
|
+
When the provider creates the AWS SDK `S3Client` itself, its `stop` hook
|
|
76
|
+
destroys that client on server shutdown to release keep-alive sockets.
|
|
77
|
+
|
|
78
|
+
Clients you inject — through `createClient` on `createS3StorageProvider(...)`
|
|
79
|
+
or `client` on `createS3Storage(...)` and `createS3UploadSigner(...)` — are
|
|
80
|
+
caller-owned. Beignet never destroys them, so close them yourself when your
|
|
81
|
+
app shuts down.
|
|
82
|
+
|
|
83
|
+
## Request cost
|
|
84
|
+
|
|
85
|
+
Some port operations need more than one S3 request to honor the `StoragePort`
|
|
86
|
+
contract:
|
|
87
|
+
|
|
88
|
+
| Operation | S3 requests |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| `put(...)` | `PutObject` + `HeadObject` |
|
|
91
|
+
| `get(...)` | `GetObject` |
|
|
92
|
+
| `stat(...)` | `HeadObject` |
|
|
93
|
+
| `exists(...)` | `HeadObject` |
|
|
94
|
+
| `delete(...)` | `HeadObject` + `DeleteObject` |
|
|
95
|
+
| `publicUrl(...)` | `HeadObject`, or none when `publicBaseUrl` is unset |
|
|
96
|
+
|
|
97
|
+
- `put(...)` stats after writing so the returned `StorageObject` reflects what
|
|
98
|
+
S3 actually stored instead of echoing the inputs.
|
|
99
|
+
- `delete(...)` stats before deleting because S3 `DeleteObject` does not report
|
|
100
|
+
whether the object existed, and the port returns that boolean.
|
|
101
|
+
- `publicUrl(...)` stats to check the stored visibility, and skips S3 entirely
|
|
102
|
+
when no public base URL is configured.
|
|
103
|
+
|
|
69
104
|
## Direct port factory
|
|
70
105
|
|
|
71
106
|
```typescript
|
|
@@ -96,6 +131,35 @@ const object = await ctx.ports.storage.get("avatars/user_123.png");
|
|
|
96
131
|
const url = await ctx.ports.storage.publicUrl("avatars/user_123.png");
|
|
97
132
|
```
|
|
98
133
|
|
|
134
|
+
## Direct upload signer
|
|
135
|
+
|
|
136
|
+
Use `createS3UploadSigner(...)` with `@beignet/core/uploads` when browsers
|
|
137
|
+
should upload directly to S3 or an S3-compatible service:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { createUploadRouter } from "@beignet/core/uploads";
|
|
141
|
+
import { createS3UploadSigner } from "@beignet/provider-storage-s3";
|
|
142
|
+
|
|
143
|
+
const uploadRouter = createUploadRouter({
|
|
144
|
+
uploads: postUploads,
|
|
145
|
+
ctx: () => server.createContextFromNext(),
|
|
146
|
+
storage: server.ports.storage,
|
|
147
|
+
signer: createS3UploadSigner({
|
|
148
|
+
bucket: "my-app-assets",
|
|
149
|
+
region: "auto",
|
|
150
|
+
endpoint: "https://<account-id>.r2.cloudflarestorage.com",
|
|
151
|
+
credentials: {
|
|
152
|
+
accessKeyId: process.env.R2_ACCESS_KEY_ID!,
|
|
153
|
+
secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
|
|
154
|
+
},
|
|
155
|
+
keyPrefix: "production",
|
|
156
|
+
}),
|
|
157
|
+
});
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The signer returns presigned PUT URLs with the content type, cache control, and
|
|
161
|
+
Beignet storage metadata headers the browser must send.
|
|
162
|
+
|
|
99
163
|
## Visibility
|
|
100
164
|
|
|
101
165
|
`visibility` is stored as reserved object metadata so `publicUrl(...)` can
|
|
@@ -132,9 +196,10 @@ helpers apply the configured `STORAGE_S3_KEY_PREFIX`.
|
|
|
132
196
|
## Devtools
|
|
133
197
|
|
|
134
198
|
When `ctx.ports.devtools` is installed, the provider records storage
|
|
135
|
-
operations under the `storage` watcher
|
|
136
|
-
|
|
137
|
-
bodies and metadata values
|
|
199
|
+
operations under the `storage` watcher and direct upload signing under the
|
|
200
|
+
`uploads` watcher. Events include operation name, key, bucket, duration, object
|
|
201
|
+
size, visibility, and whether a lookup hit. Object bodies and metadata values
|
|
202
|
+
are never recorded.
|
|
138
203
|
|
|
139
204
|
## License
|
|
140
205
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { S3Client, type S3ClientConfig } from "@aws-sdk/client-s3";
|
|
1
|
+
import { PutObjectCommand, S3Client, type S3ClientConfig } from "@aws-sdk/client-s3";
|
|
2
2
|
import type { StoragePort } from "@beignet/core/ports";
|
|
3
3
|
import { type ProviderInstrumentationTarget } from "@beignet/core/providers";
|
|
4
|
+
import type { UploadSignerPort } from "@beignet/core/uploads";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
/**
|
|
6
7
|
* Storage port types re-exported for S3 storage consumers.
|
|
@@ -38,6 +39,9 @@ export interface S3StorageOptions {
|
|
|
38
39
|
bucket: string;
|
|
39
40
|
/**
|
|
40
41
|
* S3-compatible client. Omit to create an AWS SDK S3Client from config.
|
|
42
|
+
*
|
|
43
|
+
* Injected clients are caller-owned: Beignet never destroys them, so close
|
|
44
|
+
* them yourself when your app shuts down.
|
|
41
45
|
*/
|
|
42
46
|
client?: S3StorageClient;
|
|
43
47
|
/**
|
|
@@ -81,6 +85,29 @@ export interface S3StorageOptions {
|
|
|
81
85
|
*/
|
|
82
86
|
instrumentation?: ProviderInstrumentationTarget;
|
|
83
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Options for creating an S3-compatible direct upload signer.
|
|
90
|
+
*/
|
|
91
|
+
export interface S3UploadSignerOptions extends S3StorageOptions {
|
|
92
|
+
/**
|
|
93
|
+
* Number of seconds before generated direct upload URLs expire.
|
|
94
|
+
*
|
|
95
|
+
* @default 900
|
|
96
|
+
*/
|
|
97
|
+
expiresInSeconds?: number;
|
|
98
|
+
/**
|
|
99
|
+
* Clock used for deterministic tests.
|
|
100
|
+
*/
|
|
101
|
+
now?: () => Date;
|
|
102
|
+
/**
|
|
103
|
+
* Test hook for replacing AWS SDK signing.
|
|
104
|
+
*/
|
|
105
|
+
signUrl?: (args: {
|
|
106
|
+
client: S3StorageClient;
|
|
107
|
+
command: PutObjectCommand;
|
|
108
|
+
expiresInSeconds: number;
|
|
109
|
+
}) => Promise<string> | string;
|
|
110
|
+
}
|
|
84
111
|
/**
|
|
85
112
|
* Options for creating an env-backed S3-compatible storage provider.
|
|
86
113
|
*/
|
|
@@ -95,6 +122,9 @@ export interface S3StorageProviderOptions extends Omit<S3StorageOptions, "bucket
|
|
|
95
122
|
bucket?: string;
|
|
96
123
|
/**
|
|
97
124
|
* Optional client factory for tests or custom S3 clients.
|
|
125
|
+
*
|
|
126
|
+
* Clients returned here are caller-owned: the provider `stop` hook does not
|
|
127
|
+
* destroy them, so close them yourself when your app shuts down.
|
|
98
128
|
*/
|
|
99
129
|
createClient?: (config: S3StorageConfig) => S3StorageClient;
|
|
100
130
|
}
|
|
@@ -105,6 +135,14 @@ export interface S3StorageProviderOptions extends Omit<S3StorageOptions, "bucket
|
|
|
105
135
|
* `endpoint`, `forcePathStyle`, credentials, and optional `keyPrefix`.
|
|
106
136
|
*/
|
|
107
137
|
export declare function createS3Storage(options: S3StorageOptions): StoragePort;
|
|
138
|
+
/**
|
|
139
|
+
* Create an S3-compatible direct upload signer.
|
|
140
|
+
*
|
|
141
|
+
* The signer creates presigned PUT URLs for AWS S3, Cloudflare R2, MinIO,
|
|
142
|
+
* Spaces, and similar object stores. Use it with `createUploadRouter(...)`
|
|
143
|
+
* from `@beignet/core/uploads`.
|
|
144
|
+
*/
|
|
145
|
+
export declare function createS3UploadSigner(options: S3UploadSignerOptions): UploadSignerPort;
|
|
108
146
|
/**
|
|
109
147
|
* Ports contributed by the S3 storage provider.
|
|
110
148
|
*/
|
|
@@ -129,6 +167,11 @@ export interface S3StorageProviderPorts {
|
|
|
129
167
|
*
|
|
130
168
|
* Reads `STORAGE_S3_*` env vars, contributes `ports.storage`, and exposes
|
|
131
169
|
* `ports.s3Storage` for raw client access and key-prefix helpers.
|
|
170
|
+
*
|
|
171
|
+
* When the provider creates the AWS SDK client itself, its `stop` hook
|
|
172
|
+
* destroys that client on server shutdown to release keep-alive sockets.
|
|
173
|
+
* Clients injected through `createClient` are caller-owned and never
|
|
174
|
+
* destroyed by the provider.
|
|
132
175
|
*/
|
|
133
176
|
export declare function createS3StorageProvider(options?: S3StorageProviderOptions): import("@beignet/core/providers").ServiceProvider<unknown, z.ZodObject<{
|
|
134
177
|
ACCESS_KEY_ID: z.ZodOptional<z.ZodString>;
|
|
@@ -155,7 +198,7 @@ export declare function createS3StorageProvider(options?: S3StorageProviderOptio
|
|
|
155
198
|
objectKey(key: string): string;
|
|
156
199
|
objectPrefix(prefix: string): string;
|
|
157
200
|
};
|
|
158
|
-
}>;
|
|
201
|
+
}, unknown, void>;
|
|
159
202
|
/**
|
|
160
203
|
* Default env-backed S3-compatible storage provider.
|
|
161
204
|
*/
|
|
@@ -184,5 +227,5 @@ export declare const s3StorageProvider: import("@beignet/core/providers").Servic
|
|
|
184
227
|
objectKey(key: string): string;
|
|
185
228
|
objectPrefix(prefix: string): string;
|
|
186
229
|
};
|
|
187
|
-
}>;
|
|
230
|
+
}, unknown, void>;
|
|
188
231
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,gBAAgB,EAChB,QAAQ,EACR,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAKV,WAAW,EAEZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAGL,KAAK,6BAA6B,EACnC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,YAAY,EACV,WAAW,EACX,eAAe,EACf,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAQ7B,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;iBAUzB,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,WAAW,CAAC,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,YAAY,CAAC,EAAE,IAAI,CACjB,cAAc,EACd,QAAQ,GAAG,UAAU,GAAG,aAAa,GAAG,gBAAgB,CACzD,CAAC;IAEF;;;OAGG;IACH,eAAe,CAAC,EAAE,6BAA6B,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QACf,MAAM,EAAE,eAAe,CAAC;QACxB,OAAO,EAAE,gBAAgB,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBACf,SAAQ,IAAI,CAAC,gBAAgB,EAAE,QAAQ,GAAG,QAAQ,GAAG,iBAAiB,CAAC;IACvE;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,eAAe,CAAC;CAC7D;AAgXD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,WAAW,CA0UtE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,qBAAqB,GAC7B,gBAAgB,CA0FlB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC;IACrB;;OAEG;IACH,SAAS,EAAE;QACT,MAAM,EAAE,eAAe,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;QAC/B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;KACtC,CAAC;CACH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B;;;;;;;;;;;;;;;;;;;;;;;;;kBA0GvC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;iBAA4B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Readable } from "node:stream";
|
|
2
2
|
import { DeleteObjectCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, } from "@aws-sdk/client-s3";
|
|
3
|
+
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
3
4
|
import { createProvider, createProviderInstrumentation, } from "@beignet/core/providers";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
const visibilityMetadataKey = "beignet-visibility";
|
|
@@ -244,6 +245,12 @@ function metadataForPut(metadata, visibility) {
|
|
|
244
245
|
[visibilityMetadataKey]: visibility,
|
|
245
246
|
};
|
|
246
247
|
}
|
|
248
|
+
function metadataHeaders(metadata) {
|
|
249
|
+
return Object.fromEntries(Object.entries(metadata).map(([key, value]) => [
|
|
250
|
+
`x-amz-meta-${key.toLowerCase()}`,
|
|
251
|
+
value,
|
|
252
|
+
]));
|
|
253
|
+
}
|
|
247
254
|
function objectFromHead(key, output) {
|
|
248
255
|
return {
|
|
249
256
|
key,
|
|
@@ -345,6 +352,8 @@ export function createS3Storage(options) {
|
|
|
345
352
|
: {}),
|
|
346
353
|
Metadata: metadataForPut(putOptions?.metadata, visibility),
|
|
347
354
|
}));
|
|
355
|
+
// Post-write HeadObject: `StoragePort.put` promises the authoritative
|
|
356
|
+
// stored `StorageObject` (size, lastModified), not an echo of inputs.
|
|
348
357
|
const object = (await statObject(key)) ??
|
|
349
358
|
{
|
|
350
359
|
key,
|
|
@@ -469,6 +478,8 @@ export function createS3Storage(options) {
|
|
|
469
478
|
const startedAt = Date.now();
|
|
470
479
|
try {
|
|
471
480
|
const s3Key = objectKey(keyPrefix, key);
|
|
481
|
+
// Pre-delete HeadObject: S3 DeleteObject does not report whether the
|
|
482
|
+
// object existed, and `StoragePort.delete` promises that boolean.
|
|
472
483
|
const existed = (await statObject(key)) !== null;
|
|
473
484
|
await client.send(new DeleteObjectCommand({
|
|
474
485
|
Bucket: options.bucket,
|
|
@@ -533,8 +544,24 @@ export function createS3Storage(options) {
|
|
|
533
544
|
const startedAt = Date.now();
|
|
534
545
|
try {
|
|
535
546
|
const s3Key = objectKey(keyPrefix, key);
|
|
547
|
+
// Without a base URL no object can have a public URL, so skip the
|
|
548
|
+
// HeadObject visibility check entirely.
|
|
549
|
+
if (!options.publicBaseUrl) {
|
|
550
|
+
recordStorageEvent({
|
|
551
|
+
operation: "publicUrl",
|
|
552
|
+
key,
|
|
553
|
+
summary: "No public URL",
|
|
554
|
+
details: {
|
|
555
|
+
s3Key,
|
|
556
|
+
hasPublicUrl: false,
|
|
557
|
+
publicBaseUrlConfigured: false,
|
|
558
|
+
durationMs: Date.now() - startedAt,
|
|
559
|
+
},
|
|
560
|
+
});
|
|
561
|
+
return null;
|
|
562
|
+
}
|
|
536
563
|
const object = await statObject(key);
|
|
537
|
-
const url = object?.visibility === "public"
|
|
564
|
+
const url = object?.visibility === "public"
|
|
538
565
|
? joinPublicUrl(options.publicBaseUrl, s3Key)
|
|
539
566
|
: null;
|
|
540
567
|
recordStorageEvent({
|
|
@@ -566,11 +593,103 @@ export function createS3Storage(options) {
|
|
|
566
593
|
},
|
|
567
594
|
};
|
|
568
595
|
}
|
|
596
|
+
/**
|
|
597
|
+
* Create an S3-compatible direct upload signer.
|
|
598
|
+
*
|
|
599
|
+
* The signer creates presigned PUT URLs for AWS S3, Cloudflare R2, MinIO,
|
|
600
|
+
* Spaces, and similar object stores. Use it with `createUploadRouter(...)`
|
|
601
|
+
* from `@beignet/core/uploads`.
|
|
602
|
+
*/
|
|
603
|
+
export function createS3UploadSigner(options) {
|
|
604
|
+
const client = options.client ?? createDefaultClient(options);
|
|
605
|
+
const keyPrefix = normalizeKeyPrefix(options.keyPrefix);
|
|
606
|
+
const expiresInSeconds = options.expiresInSeconds ?? 900;
|
|
607
|
+
const now = options.now ?? (() => new Date());
|
|
608
|
+
const instrumentation = createProviderInstrumentation(options.instrumentation, {
|
|
609
|
+
providerName: "storage-s3",
|
|
610
|
+
watcher: "uploads",
|
|
611
|
+
});
|
|
612
|
+
return {
|
|
613
|
+
async sign(args) {
|
|
614
|
+
const startedAt = Date.now();
|
|
615
|
+
const s3Key = objectKey(keyPrefix, args.key);
|
|
616
|
+
const metadata = metadataForPut(args.storage.metadata, args.storage.visibility);
|
|
617
|
+
const command = new PutObjectCommand({
|
|
618
|
+
Bucket: options.bucket,
|
|
619
|
+
Key: s3Key,
|
|
620
|
+
ContentType: args.file.contentType,
|
|
621
|
+
...(args.storage.cacheControl !== undefined
|
|
622
|
+
? { CacheControl: args.storage.cacheControl }
|
|
623
|
+
: {}),
|
|
624
|
+
Metadata: metadata,
|
|
625
|
+
});
|
|
626
|
+
try {
|
|
627
|
+
const url = await (options.signUrl
|
|
628
|
+
? options.signUrl({ client, command, expiresInSeconds })
|
|
629
|
+
: getSignedUrl(client, command, {
|
|
630
|
+
expiresIn: expiresInSeconds,
|
|
631
|
+
}));
|
|
632
|
+
const expiresAt = new Date(now().getTime() + expiresInSeconds * 1000).toISOString();
|
|
633
|
+
instrumentation.custom({
|
|
634
|
+
name: "upload.sign.completed",
|
|
635
|
+
label: "Upload signed",
|
|
636
|
+
summary: args.uploadName,
|
|
637
|
+
details: {
|
|
638
|
+
provider: "s3",
|
|
639
|
+
uploadName: args.uploadName,
|
|
640
|
+
uploadId: args.uploadId,
|
|
641
|
+
key: args.key,
|
|
642
|
+
s3Key,
|
|
643
|
+
bucket: options.bucket,
|
|
644
|
+
contentType: args.file.contentType,
|
|
645
|
+
expiresInSeconds,
|
|
646
|
+
durationMs: Date.now() - startedAt,
|
|
647
|
+
},
|
|
648
|
+
});
|
|
649
|
+
return {
|
|
650
|
+
method: "PUT",
|
|
651
|
+
url,
|
|
652
|
+
headers: {
|
|
653
|
+
"content-type": args.file.contentType,
|
|
654
|
+
...(args.storage.cacheControl !== undefined
|
|
655
|
+
? { "cache-control": args.storage.cacheControl }
|
|
656
|
+
: {}),
|
|
657
|
+
...metadataHeaders(metadata),
|
|
658
|
+
},
|
|
659
|
+
expiresAt,
|
|
660
|
+
};
|
|
661
|
+
}
|
|
662
|
+
catch (error) {
|
|
663
|
+
instrumentation.custom({
|
|
664
|
+
name: "upload.sign.failed",
|
|
665
|
+
label: "Upload sign failed",
|
|
666
|
+
summary: args.uploadName,
|
|
667
|
+
details: {
|
|
668
|
+
provider: "s3",
|
|
669
|
+
uploadName: args.uploadName,
|
|
670
|
+
uploadId: args.uploadId,
|
|
671
|
+
key: args.key,
|
|
672
|
+
s3Key,
|
|
673
|
+
bucket: options.bucket,
|
|
674
|
+
durationMs: Date.now() - startedAt,
|
|
675
|
+
error: errorMessage(error),
|
|
676
|
+
},
|
|
677
|
+
});
|
|
678
|
+
throw error;
|
|
679
|
+
}
|
|
680
|
+
},
|
|
681
|
+
};
|
|
682
|
+
}
|
|
569
683
|
/**
|
|
570
684
|
* Create an env-backed S3-compatible storage provider.
|
|
571
685
|
*
|
|
572
686
|
* Reads `STORAGE_S3_*` env vars, contributes `ports.storage`, and exposes
|
|
573
687
|
* `ports.s3Storage` for raw client access and key-prefix helpers.
|
|
688
|
+
*
|
|
689
|
+
* When the provider creates the AWS SDK client itself, its `stop` hook
|
|
690
|
+
* destroys that client on server shutdown to release keep-alive sockets.
|
|
691
|
+
* Clients injected through `createClient` are caller-owned and never
|
|
692
|
+
* destroyed by the provider.
|
|
574
693
|
*/
|
|
575
694
|
export function createS3StorageProvider(options = {}) {
|
|
576
695
|
const ConfigSchema = S3StorageConfigSchema.extend({
|
|
@@ -606,8 +725,15 @@ export function createS3StorageProvider(options = {}) {
|
|
|
606
725
|
"Please set STORAGE_S3_BUCKET.");
|
|
607
726
|
}
|
|
608
727
|
const keyPrefix = normalizeKeyPrefix(config.KEY_PREFIX ?? options.keyPrefix);
|
|
609
|
-
|
|
610
|
-
|
|
728
|
+
// Only clients constructed by the provider are destroyed on stop.
|
|
729
|
+
// Injected `createClient` clients are caller-owned.
|
|
730
|
+
let ownedClient;
|
|
731
|
+
let client;
|
|
732
|
+
if (options.createClient) {
|
|
733
|
+
client = options.createClient(config);
|
|
734
|
+
}
|
|
735
|
+
else {
|
|
736
|
+
ownedClient = createDefaultClient({
|
|
611
737
|
...options,
|
|
612
738
|
bucket: config.BUCKET,
|
|
613
739
|
region: config.REGION ?? options.region,
|
|
@@ -625,6 +751,8 @@ export function createS3StorageProvider(options = {}) {
|
|
|
625
751
|
}
|
|
626
752
|
: options.credentials,
|
|
627
753
|
});
|
|
754
|
+
client = ownedClient;
|
|
755
|
+
}
|
|
628
756
|
return {
|
|
629
757
|
ports: {
|
|
630
758
|
storage: createS3Storage({
|
|
@@ -647,6 +775,9 @@ export function createS3StorageProvider(options = {}) {
|
|
|
647
775
|
},
|
|
648
776
|
},
|
|
649
777
|
},
|
|
778
|
+
stop() {
|
|
779
|
+
ownedClient?.destroy();
|
|
780
|
+
},
|
|
650
781
|
};
|
|
651
782
|
},
|
|
652
783
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@beignet/provider-storage-s3",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "S3-compatible object storage provider for Beignet",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -53,15 +53,59 @@
|
|
|
53
53
|
"engines": {
|
|
54
54
|
"node": ">=18.0.0"
|
|
55
55
|
},
|
|
56
|
-
"
|
|
56
|
+
"peerDependencies": {
|
|
57
57
|
"@aws-sdk/client-s3": "^3.955.0",
|
|
58
|
-
"
|
|
59
|
-
"@beignet/core": "
|
|
58
|
+
"@aws-sdk/s3-request-presigner": "^3.955.0",
|
|
59
|
+
"@beignet/core": ">=0.0.3 <1.0.0"
|
|
60
|
+
},
|
|
61
|
+
"dependencies": {
|
|
62
|
+
"zod": "^4.0.0"
|
|
60
63
|
},
|
|
61
64
|
"devDependencies": {
|
|
65
|
+
"@aws-sdk/client-s3": "^3.955.0",
|
|
66
|
+
"@aws-sdk/s3-request-presigner": "^3.955.0",
|
|
62
67
|
"@beignet/devtools": "*",
|
|
63
68
|
"@types/bun": "^1.3.13",
|
|
64
69
|
"@types/node": "^20.10.0",
|
|
65
70
|
"typescript": "^5.3.0"
|
|
71
|
+
},
|
|
72
|
+
"beignet": {
|
|
73
|
+
"provider": {
|
|
74
|
+
"displayName": "S3 storage provider",
|
|
75
|
+
"ports": [
|
|
76
|
+
"storage",
|
|
77
|
+
"s3Storage"
|
|
78
|
+
],
|
|
79
|
+
"appPorts": [
|
|
80
|
+
{
|
|
81
|
+
"name": "storage",
|
|
82
|
+
"type": "StoragePort"
|
|
83
|
+
}
|
|
84
|
+
],
|
|
85
|
+
"env": [
|
|
86
|
+
"STORAGE_S3_BUCKET",
|
|
87
|
+
"STORAGE_S3_REGION",
|
|
88
|
+
"STORAGE_S3_ENDPOINT",
|
|
89
|
+
"STORAGE_S3_ACCESS_KEY_ID",
|
|
90
|
+
"STORAGE_S3_SECRET_ACCESS_KEY",
|
|
91
|
+
"STORAGE_S3_SESSION_TOKEN",
|
|
92
|
+
"STORAGE_S3_PUBLIC_BASE_URL",
|
|
93
|
+
"STORAGE_S3_FORCE_PATH_STYLE",
|
|
94
|
+
"STORAGE_S3_KEY_PREFIX"
|
|
95
|
+
],
|
|
96
|
+
"requiredEnv": [
|
|
97
|
+
"STORAGE_S3_BUCKET"
|
|
98
|
+
],
|
|
99
|
+
"watchers": [
|
|
100
|
+
"storage"
|
|
101
|
+
],
|
|
102
|
+
"registration": {
|
|
103
|
+
"required": true,
|
|
104
|
+
"tokens": [
|
|
105
|
+
"s3StorageProvider",
|
|
106
|
+
"createS3StorageProvider"
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
}
|
|
66
110
|
}
|
|
67
111
|
}
|
package/src/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
S3Client,
|
|
8
8
|
type S3ClientConfig,
|
|
9
9
|
} from "@aws-sdk/client-s3";
|
|
10
|
+
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
|
|
10
11
|
import type {
|
|
11
12
|
StorageBody,
|
|
12
13
|
StorageMetadata,
|
|
@@ -20,6 +21,7 @@ import {
|
|
|
20
21
|
createProviderInstrumentation,
|
|
21
22
|
type ProviderInstrumentationTarget,
|
|
22
23
|
} from "@beignet/core/providers";
|
|
24
|
+
import type { UploadSignerPort } from "@beignet/core/uploads";
|
|
23
25
|
import { z } from "zod";
|
|
24
26
|
|
|
25
27
|
/**
|
|
@@ -73,6 +75,9 @@ export interface S3StorageOptions {
|
|
|
73
75
|
|
|
74
76
|
/**
|
|
75
77
|
* S3-compatible client. Omit to create an AWS SDK S3Client from config.
|
|
78
|
+
*
|
|
79
|
+
* Injected clients are caller-owned: Beignet never destroys them, so close
|
|
80
|
+
* them yourself when your app shuts down.
|
|
76
81
|
*/
|
|
77
82
|
client?: S3StorageClient;
|
|
78
83
|
|
|
@@ -128,6 +133,30 @@ export interface S3StorageOptions {
|
|
|
128
133
|
instrumentation?: ProviderInstrumentationTarget;
|
|
129
134
|
}
|
|
130
135
|
|
|
136
|
+
/**
|
|
137
|
+
* Options for creating an S3-compatible direct upload signer.
|
|
138
|
+
*/
|
|
139
|
+
export interface S3UploadSignerOptions extends S3StorageOptions {
|
|
140
|
+
/**
|
|
141
|
+
* Number of seconds before generated direct upload URLs expire.
|
|
142
|
+
*
|
|
143
|
+
* @default 900
|
|
144
|
+
*/
|
|
145
|
+
expiresInSeconds?: number;
|
|
146
|
+
/**
|
|
147
|
+
* Clock used for deterministic tests.
|
|
148
|
+
*/
|
|
149
|
+
now?: () => Date;
|
|
150
|
+
/**
|
|
151
|
+
* Test hook for replacing AWS SDK signing.
|
|
152
|
+
*/
|
|
153
|
+
signUrl?: (args: {
|
|
154
|
+
client: S3StorageClient;
|
|
155
|
+
command: PutObjectCommand;
|
|
156
|
+
expiresInSeconds: number;
|
|
157
|
+
}) => Promise<string> | string;
|
|
158
|
+
}
|
|
159
|
+
|
|
131
160
|
/**
|
|
132
161
|
* Options for creating an env-backed S3-compatible storage provider.
|
|
133
162
|
*/
|
|
@@ -145,6 +174,9 @@ export interface S3StorageProviderOptions
|
|
|
145
174
|
|
|
146
175
|
/**
|
|
147
176
|
* Optional client factory for tests or custom S3 clients.
|
|
177
|
+
*
|
|
178
|
+
* Clients returned here are caller-owned: the provider `stop` hook does not
|
|
179
|
+
* destroy them, so close them yourself when your app shuts down.
|
|
148
180
|
*/
|
|
149
181
|
createClient?: (config: S3StorageConfig) => S3StorageClient;
|
|
150
182
|
}
|
|
@@ -445,6 +477,15 @@ function metadataForPut(
|
|
|
445
477
|
};
|
|
446
478
|
}
|
|
447
479
|
|
|
480
|
+
function metadataHeaders(metadata: StorageMetadata): Record<string, string> {
|
|
481
|
+
return Object.fromEntries(
|
|
482
|
+
Object.entries(metadata).map(([key, value]) => [
|
|
483
|
+
`x-amz-meta-${key.toLowerCase()}`,
|
|
484
|
+
value,
|
|
485
|
+
]),
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
|
|
448
489
|
function objectFromHead(
|
|
449
490
|
key: string,
|
|
450
491
|
output: {
|
|
@@ -492,7 +533,7 @@ function errorMessage(error: unknown): string {
|
|
|
492
533
|
return error instanceof Error ? error.message : String(error);
|
|
493
534
|
}
|
|
494
535
|
|
|
495
|
-
function createDefaultClient(options: S3StorageOptions):
|
|
536
|
+
function createDefaultClient(options: S3StorageOptions): S3Client {
|
|
496
537
|
return new S3Client({
|
|
497
538
|
...options.clientConfig,
|
|
498
539
|
region: options.region ?? "us-east-1",
|
|
@@ -579,6 +620,8 @@ export function createS3Storage(options: S3StorageOptions): StoragePort {
|
|
|
579
620
|
}),
|
|
580
621
|
);
|
|
581
622
|
|
|
623
|
+
// Post-write HeadObject: `StoragePort.put` promises the authoritative
|
|
624
|
+
// stored `StorageObject` (size, lastModified), not an echo of inputs.
|
|
582
625
|
const object =
|
|
583
626
|
(await statObject(key)) ??
|
|
584
627
|
({
|
|
@@ -714,6 +757,8 @@ export function createS3Storage(options: S3StorageOptions): StoragePort {
|
|
|
714
757
|
|
|
715
758
|
try {
|
|
716
759
|
const s3Key = objectKey(keyPrefix, key);
|
|
760
|
+
// Pre-delete HeadObject: S3 DeleteObject does not report whether the
|
|
761
|
+
// object existed, and `StoragePort.delete` promises that boolean.
|
|
717
762
|
const existed = (await statObject(key)) !== null;
|
|
718
763
|
|
|
719
764
|
await client.send(
|
|
@@ -785,9 +830,28 @@ export function createS3Storage(options: S3StorageOptions): StoragePort {
|
|
|
785
830
|
|
|
786
831
|
try {
|
|
787
832
|
const s3Key = objectKey(keyPrefix, key);
|
|
833
|
+
|
|
834
|
+
// Without a base URL no object can have a public URL, so skip the
|
|
835
|
+
// HeadObject visibility check entirely.
|
|
836
|
+
if (!options.publicBaseUrl) {
|
|
837
|
+
recordStorageEvent({
|
|
838
|
+
operation: "publicUrl",
|
|
839
|
+
key,
|
|
840
|
+
summary: "No public URL",
|
|
841
|
+
details: {
|
|
842
|
+
s3Key,
|
|
843
|
+
hasPublicUrl: false,
|
|
844
|
+
publicBaseUrlConfigured: false,
|
|
845
|
+
durationMs: Date.now() - startedAt,
|
|
846
|
+
},
|
|
847
|
+
});
|
|
848
|
+
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
|
|
788
852
|
const object = await statObject(key);
|
|
789
853
|
const url =
|
|
790
|
-
object?.visibility === "public"
|
|
854
|
+
object?.visibility === "public"
|
|
791
855
|
? joinPublicUrl(options.publicBaseUrl, s3Key)
|
|
792
856
|
: null;
|
|
793
857
|
|
|
@@ -821,6 +885,107 @@ export function createS3Storage(options: S3StorageOptions): StoragePort {
|
|
|
821
885
|
};
|
|
822
886
|
}
|
|
823
887
|
|
|
888
|
+
/**
|
|
889
|
+
* Create an S3-compatible direct upload signer.
|
|
890
|
+
*
|
|
891
|
+
* The signer creates presigned PUT URLs for AWS S3, Cloudflare R2, MinIO,
|
|
892
|
+
* Spaces, and similar object stores. Use it with `createUploadRouter(...)`
|
|
893
|
+
* from `@beignet/core/uploads`.
|
|
894
|
+
*/
|
|
895
|
+
export function createS3UploadSigner(
|
|
896
|
+
options: S3UploadSignerOptions,
|
|
897
|
+
): UploadSignerPort {
|
|
898
|
+
const client = options.client ?? createDefaultClient(options);
|
|
899
|
+
const keyPrefix = normalizeKeyPrefix(options.keyPrefix);
|
|
900
|
+
const expiresInSeconds = options.expiresInSeconds ?? 900;
|
|
901
|
+
const now = options.now ?? (() => new Date());
|
|
902
|
+
const instrumentation = createProviderInstrumentation(
|
|
903
|
+
options.instrumentation,
|
|
904
|
+
{
|
|
905
|
+
providerName: "storage-s3",
|
|
906
|
+
watcher: "uploads",
|
|
907
|
+
},
|
|
908
|
+
);
|
|
909
|
+
|
|
910
|
+
return {
|
|
911
|
+
async sign(args) {
|
|
912
|
+
const startedAt = Date.now();
|
|
913
|
+
const s3Key = objectKey(keyPrefix, args.key);
|
|
914
|
+
const metadata = metadataForPut(
|
|
915
|
+
args.storage.metadata,
|
|
916
|
+
args.storage.visibility,
|
|
917
|
+
);
|
|
918
|
+
const command = new PutObjectCommand({
|
|
919
|
+
Bucket: options.bucket,
|
|
920
|
+
Key: s3Key,
|
|
921
|
+
ContentType: args.file.contentType,
|
|
922
|
+
...(args.storage.cacheControl !== undefined
|
|
923
|
+
? { CacheControl: args.storage.cacheControl }
|
|
924
|
+
: {}),
|
|
925
|
+
Metadata: metadata,
|
|
926
|
+
});
|
|
927
|
+
|
|
928
|
+
try {
|
|
929
|
+
const url = await (options.signUrl
|
|
930
|
+
? options.signUrl({ client, command, expiresInSeconds })
|
|
931
|
+
: getSignedUrl(client as never, command, {
|
|
932
|
+
expiresIn: expiresInSeconds,
|
|
933
|
+
}));
|
|
934
|
+
const expiresAt = new Date(
|
|
935
|
+
now().getTime() + expiresInSeconds * 1000,
|
|
936
|
+
).toISOString();
|
|
937
|
+
|
|
938
|
+
instrumentation.custom({
|
|
939
|
+
name: "upload.sign.completed",
|
|
940
|
+
label: "Upload signed",
|
|
941
|
+
summary: args.uploadName,
|
|
942
|
+
details: {
|
|
943
|
+
provider: "s3",
|
|
944
|
+
uploadName: args.uploadName,
|
|
945
|
+
uploadId: args.uploadId,
|
|
946
|
+
key: args.key,
|
|
947
|
+
s3Key,
|
|
948
|
+
bucket: options.bucket,
|
|
949
|
+
contentType: args.file.contentType,
|
|
950
|
+
expiresInSeconds,
|
|
951
|
+
durationMs: Date.now() - startedAt,
|
|
952
|
+
},
|
|
953
|
+
});
|
|
954
|
+
|
|
955
|
+
return {
|
|
956
|
+
method: "PUT",
|
|
957
|
+
url,
|
|
958
|
+
headers: {
|
|
959
|
+
"content-type": args.file.contentType,
|
|
960
|
+
...(args.storage.cacheControl !== undefined
|
|
961
|
+
? { "cache-control": args.storage.cacheControl }
|
|
962
|
+
: {}),
|
|
963
|
+
...metadataHeaders(metadata),
|
|
964
|
+
},
|
|
965
|
+
expiresAt,
|
|
966
|
+
};
|
|
967
|
+
} catch (error) {
|
|
968
|
+
instrumentation.custom({
|
|
969
|
+
name: "upload.sign.failed",
|
|
970
|
+
label: "Upload sign failed",
|
|
971
|
+
summary: args.uploadName,
|
|
972
|
+
details: {
|
|
973
|
+
provider: "s3",
|
|
974
|
+
uploadName: args.uploadName,
|
|
975
|
+
uploadId: args.uploadId,
|
|
976
|
+
key: args.key,
|
|
977
|
+
s3Key,
|
|
978
|
+
bucket: options.bucket,
|
|
979
|
+
durationMs: Date.now() - startedAt,
|
|
980
|
+
error: errorMessage(error),
|
|
981
|
+
},
|
|
982
|
+
});
|
|
983
|
+
throw error;
|
|
984
|
+
}
|
|
985
|
+
},
|
|
986
|
+
};
|
|
987
|
+
}
|
|
988
|
+
|
|
824
989
|
/**
|
|
825
990
|
* Ports contributed by the S3 storage provider.
|
|
826
991
|
*/
|
|
@@ -846,6 +1011,11 @@ export interface S3StorageProviderPorts {
|
|
|
846
1011
|
*
|
|
847
1012
|
* Reads `STORAGE_S3_*` env vars, contributes `ports.storage`, and exposes
|
|
848
1013
|
* `ports.s3Storage` for raw client access and key-prefix helpers.
|
|
1014
|
+
*
|
|
1015
|
+
* When the provider creates the AWS SDK client itself, its `stop` hook
|
|
1016
|
+
* destroys that client on server shutdown to release keep-alive sockets.
|
|
1017
|
+
* Clients injected through `createClient` are caller-owned and never
|
|
1018
|
+
* destroyed by the provider.
|
|
849
1019
|
*/
|
|
850
1020
|
export function createS3StorageProvider(
|
|
851
1021
|
options: S3StorageProviderOptions = {},
|
|
@@ -896,9 +1066,15 @@ export function createS3StorageProvider(
|
|
|
896
1066
|
const keyPrefix = normalizeKeyPrefix(
|
|
897
1067
|
config.KEY_PREFIX ?? options.keyPrefix,
|
|
898
1068
|
);
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
1069
|
+
// Only clients constructed by the provider are destroyed on stop.
|
|
1070
|
+
// Injected `createClient` clients are caller-owned.
|
|
1071
|
+
let ownedClient: S3Client | undefined;
|
|
1072
|
+
let client: S3StorageClient;
|
|
1073
|
+
|
|
1074
|
+
if (options.createClient) {
|
|
1075
|
+
client = options.createClient(config);
|
|
1076
|
+
} else {
|
|
1077
|
+
ownedClient = createDefaultClient({
|
|
902
1078
|
...options,
|
|
903
1079
|
bucket: config.BUCKET,
|
|
904
1080
|
region: config.REGION ?? options.region,
|
|
@@ -917,6 +1093,8 @@ export function createS3StorageProvider(
|
|
|
917
1093
|
}
|
|
918
1094
|
: options.credentials,
|
|
919
1095
|
});
|
|
1096
|
+
client = ownedClient;
|
|
1097
|
+
}
|
|
920
1098
|
|
|
921
1099
|
return {
|
|
922
1100
|
ports: {
|
|
@@ -940,6 +1118,9 @@ export function createS3StorageProvider(
|
|
|
940
1118
|
},
|
|
941
1119
|
},
|
|
942
1120
|
} satisfies S3StorageProviderPorts,
|
|
1121
|
+
stop() {
|
|
1122
|
+
ownedClient?.destroy();
|
|
1123
|
+
},
|
|
943
1124
|
};
|
|
944
1125
|
},
|
|
945
1126
|
});
|