@haverstack/blob-adapter-s3 0.30.0 → 0.32.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.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -12
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { S3Client, type S3ClientConfig } from '@aws-sdk/client-s3';
|
|
16
16
|
import type { FileId } from '@haverstack/core';
|
|
17
|
-
import type { StackBlobAdapter, BlobInfo } from '@haverstack/core/adapter';
|
|
17
|
+
import type { StackBlobAdapter, BlobInfo, BlobsQuery } from '@haverstack/core/adapter';
|
|
18
18
|
export type S3BlobAdapterOptions = {
|
|
19
19
|
/** Bucket to store blobs in. */
|
|
20
20
|
bucket: string;
|
|
@@ -38,6 +38,8 @@ export type S3BlobAdapterOptions = {
|
|
|
38
38
|
credentials?: S3ClientConfig['credentials'];
|
|
39
39
|
};
|
|
40
40
|
export declare class S3BlobAdapter implements StackBlobAdapter {
|
|
41
|
+
/** Moved by putBlob() and deleteBlob(); see head(). */
|
|
42
|
+
private readonly written;
|
|
41
43
|
private readonly client;
|
|
42
44
|
private readonly bucket;
|
|
43
45
|
constructor(options: S3BlobAdapterOptions);
|
|
@@ -45,6 +47,11 @@ export declare class S3BlobAdapter implements StackBlobAdapter {
|
|
|
45
47
|
putBlob(data: Uint8Array): Promise<FileId>;
|
|
46
48
|
getBlob(fileId: FileId): Promise<Uint8Array>;
|
|
47
49
|
deleteBlob(fileId: FileId): Promise<void>;
|
|
48
|
-
|
|
50
|
+
/**
|
|
51
|
+
* S3 lists keys in UTF-8 byte order, which for lowercase hex is `fileId`
|
|
52
|
+
* order, so `afterFileId` is S3's own `StartAfter`.
|
|
53
|
+
*/
|
|
54
|
+
listBlobs(query?: BlobsQuery): Promise<BlobInfo[]>;
|
|
55
|
+
head(): Promise<string>;
|
|
49
56
|
}
|
|
50
57
|
//# 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":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,QAAQ,EAQR,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,QAAQ,EAQR,KAAK,cAAc,EACpB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEvF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yCAAyC;IACzC,WAAW,CAAC,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CAC7C,CAAC;AAEF,qBAAa,aAAc,YAAW,gBAAgB;IACpD,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE,oBAAoB;YAY3B,YAAY;IAUpB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAU1C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAe5C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C;;;OAGG;IACG,SAAS,CAAC,KAAK,GAAE,UAAe,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsBtD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAG9B"}
|
package/dist/index.js
CHANGED
|
@@ -14,14 +14,11 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { createHash } from 'node:crypto';
|
|
16
16
|
import { S3Client, PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand, ListObjectsV2Command, NoSuchKey, NotFound, } from '@aws-sdk/client-s3';
|
|
17
|
-
import { StackNotFoundError
|
|
18
|
-
|
|
19
|
-
const assertFileId = (fileId) => {
|
|
20
|
-
if (!SHA256_HEX_RE.test(fileId)) {
|
|
21
|
-
throw new StackBadRequestError(`Invalid fileId: expected 64-character lowercase hex string`);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
17
|
+
import { StackNotFoundError } from '@haverstack/core';
|
|
18
|
+
import { FILE_ID_RE, trackWrites, assertFileId } from '@haverstack/core/adapter';
|
|
24
19
|
export class S3BlobAdapter {
|
|
20
|
+
/** Moved by putBlob() and deleteBlob(); see head(). */
|
|
21
|
+
written = trackWrites(this);
|
|
25
22
|
client;
|
|
26
23
|
bucket;
|
|
27
24
|
constructor(options) {
|
|
@@ -73,19 +70,31 @@ export class S3BlobAdapter {
|
|
|
73
70
|
// needed here the way blob-adapter-disk needs one for fs semantics.
|
|
74
71
|
await this.client.send(new DeleteObjectCommand({ Bucket: this.bucket, Key: fileId }));
|
|
75
72
|
}
|
|
76
|
-
|
|
73
|
+
/**
|
|
74
|
+
* S3 lists keys in UTF-8 byte order, which for lowercase hex is `fileId`
|
|
75
|
+
* order, so `afterFileId` is S3's own `StartAfter`.
|
|
76
|
+
*/
|
|
77
|
+
async listBlobs(query = {}) {
|
|
78
|
+
const { afterFileId, limit } = query;
|
|
77
79
|
const files = [];
|
|
78
80
|
let continuationToken;
|
|
79
81
|
do {
|
|
80
|
-
const response = await this.client.send(new ListObjectsV2Command({
|
|
82
|
+
const response = await this.client.send(new ListObjectsV2Command({
|
|
83
|
+
Bucket: this.bucket,
|
|
84
|
+
ContinuationToken: continuationToken,
|
|
85
|
+
StartAfter: afterFileId,
|
|
86
|
+
}));
|
|
81
87
|
for (const obj of response.Contents ?? []) {
|
|
82
|
-
if (obj.Key &&
|
|
88
|
+
if (obj.Key && FILE_ID_RE.test(obj.Key) && obj.Size !== undefined && obj.LastModified) {
|
|
83
89
|
files.push({ fileId: obj.Key, size: obj.Size, modifiedAt: obj.LastModified });
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
92
|
continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined;
|
|
87
|
-
} while (continuationToken);
|
|
88
|
-
return files;
|
|
93
|
+
} while (continuationToken && (limit === undefined || files.length < limit));
|
|
94
|
+
return limit === undefined ? files : files.slice(0, limit);
|
|
95
|
+
}
|
|
96
|
+
async head() {
|
|
97
|
+
return this.written.read();
|
|
89
98
|
}
|
|
90
99
|
}
|
|
91
100
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,SAAS,EACT,QAAQ,GAET,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,
|
|
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": "@haverstack/blob-adapter-s3",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.0",
|
|
4
4
|
"description": "S3 (and S3-compatible) blob adapter for Haverstack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@aws-sdk/client-s3": "^3.700.0",
|
|
34
|
-
"@haverstack/core": "^0.
|
|
34
|
+
"@haverstack/core": "^0.46.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.0.0",
|