@atproto/aws 0.2.0 → 0.2.1
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 +9 -0
- package/dist/s3.d.ts +2 -0
- package/dist/s3.d.ts.map +1 -1
- package/dist/s3.js +34 -5
- package/dist/s3.js.map +1 -1
- package/package.json +3 -3
- package/src/s3.ts +38 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @atproto/aws
|
|
2
2
|
|
|
3
|
+
## 0.2.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`acc9093d2`](https://github.com/bluesky-social/atproto/commit/acc9093d2845eba02b68fb2f9db33e4f1b59bb10)]:
|
|
8
|
+
- @atproto/common@0.4.1
|
|
9
|
+
- @atproto/crypto@0.4.0
|
|
10
|
+
- @atproto/repo@0.4.1
|
|
11
|
+
|
|
3
12
|
## 0.2.0
|
|
4
13
|
|
|
5
14
|
### Minor Changes
|
package/dist/s3.d.ts
CHANGED
|
@@ -5,11 +5,13 @@ import { CID } from 'multiformats/cid';
|
|
|
5
5
|
import stream from 'stream';
|
|
6
6
|
export type S3Config = {
|
|
7
7
|
bucket: string;
|
|
8
|
+
uploadTimeoutMs?: number;
|
|
8
9
|
} & Omit<aws.S3ClientConfig, 'apiVersion'>;
|
|
9
10
|
export declare class S3BlobStore implements BlobStore {
|
|
10
11
|
did: string;
|
|
11
12
|
private client;
|
|
12
13
|
private bucket;
|
|
14
|
+
private uploadTimeoutMs;
|
|
13
15
|
constructor(did: string, cfg: S3Config);
|
|
14
16
|
static creator(cfg: S3Config): (did: string) => S3BlobStore;
|
|
15
17
|
private genKey;
|
package/dist/s3.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAA;AAE5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAA;AAEzC,OAAO,EAAE,SAAS,EAAqB,MAAM,eAAe,CAAA;AAE5D,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,MAAM,MAAM,QAAQ,CAAA;AAE3B,MAAM,MAAM,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CACxE,GAAG,CAAC,cAAc,EAClB,YAAY,CACb,CAAA;AAKD,qBAAa,WAAY,YAAW,SAAS;IAMlC,GAAG,EAAE,MAAM;IALpB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,eAAe,CAAQ;gBAGtB,GAAG,EAAE,MAAM,EAClB,GAAG,EAAE,QAAQ;IAWf,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,SACb,MAAM;IAKrB,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,kBAAkB;IAIpB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B7D,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAanD,YAAY,CAChB,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,QAAQ,GAClC,OAAO,CAAC,IAAI,CAAC;IAwBV,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;YAO7B,SAAS;IAYjB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC;IAKvC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAK7C,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/B,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAIrC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAI9B,MAAM;YAYN,SAAS;YAOT,cAAc;YASd,IAAI;CAenB;AAUD,eAAe,WAAW,CAAA"}
|
package/dist/s3.js
CHANGED
|
@@ -50,8 +50,15 @@ class S3BlobStore {
|
|
|
50
50
|
writable: true,
|
|
51
51
|
value: void 0
|
|
52
52
|
});
|
|
53
|
-
|
|
53
|
+
Object.defineProperty(this, "uploadTimeoutMs", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: void 0
|
|
58
|
+
});
|
|
59
|
+
const { bucket, uploadTimeoutMs, ...rest } = cfg;
|
|
54
60
|
this.bucket = bucket;
|
|
61
|
+
this.uploadTimeoutMs = uploadTimeoutMs ?? 10000;
|
|
55
62
|
this.client = new aws.S3({
|
|
56
63
|
...rest,
|
|
57
64
|
apiVersion: '2006-03-01',
|
|
@@ -76,14 +83,25 @@ class S3BlobStore {
|
|
|
76
83
|
}
|
|
77
84
|
async putTemp(bytes) {
|
|
78
85
|
const key = this.genKey();
|
|
79
|
-
|
|
86
|
+
// @NOTE abort results in error from aws-sdk "Upload aborted." with name "AbortError"
|
|
87
|
+
const abortController = new AbortController();
|
|
88
|
+
const timeout = setTimeout(() => abortController.abort(), this.uploadTimeoutMs);
|
|
89
|
+
const upload = new lib_storage_1.Upload({
|
|
80
90
|
client: this.client,
|
|
81
91
|
params: {
|
|
82
92
|
Bucket: this.bucket,
|
|
83
93
|
Body: bytes,
|
|
84
94
|
Key: this.getTmpPath(key),
|
|
85
95
|
},
|
|
86
|
-
|
|
96
|
+
// @ts-ignore native implementation fine in node >=15
|
|
97
|
+
abortController,
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
await upload.done();
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
clearTimeout(timeout);
|
|
104
|
+
}
|
|
87
105
|
return key;
|
|
88
106
|
}
|
|
89
107
|
async makePermanent(key, cid) {
|
|
@@ -100,14 +118,25 @@ class S3BlobStore {
|
|
|
100
118
|
}
|
|
101
119
|
}
|
|
102
120
|
async putPermanent(cid, bytes) {
|
|
103
|
-
|
|
121
|
+
// @NOTE abort results in error from aws-sdk "Upload aborted." with name "AbortError"
|
|
122
|
+
const abortController = new AbortController();
|
|
123
|
+
const timeout = setTimeout(() => abortController.abort(), this.uploadTimeoutMs);
|
|
124
|
+
const upload = new lib_storage_1.Upload({
|
|
104
125
|
client: this.client,
|
|
105
126
|
params: {
|
|
106
127
|
Bucket: this.bucket,
|
|
107
128
|
Body: bytes,
|
|
108
129
|
Key: this.getStoredPath(cid),
|
|
109
130
|
},
|
|
110
|
-
|
|
131
|
+
// @ts-ignore native implementation fine in node >=15
|
|
132
|
+
abortController,
|
|
133
|
+
});
|
|
134
|
+
try {
|
|
135
|
+
await upload.done();
|
|
136
|
+
}
|
|
137
|
+
finally {
|
|
138
|
+
clearTimeout(timeout);
|
|
139
|
+
}
|
|
111
140
|
}
|
|
112
141
|
async quarantine(cid) {
|
|
113
142
|
await this.move({
|
package/dist/s3.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wDAAyC;AACzC,sDAA6C;AAC7C,wCAA4D;AAC5D,4CAA2C;AAS3C,kEAAkE;AAClE,mEAAmE;AAEnE,MAAa,WAAW;
|
|
1
|
+
{"version":3,"file":"s3.js","sourceRoot":"","sources":["../src/s3.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/aws",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Shared AWS cloud API helpers for atproto services",
|
|
6
6
|
"keywords": [
|
|
@@ -24,9 +24,9 @@
|
|
|
24
24
|
"key-encoder": "^2.0.3",
|
|
25
25
|
"multiformats": "^9.9.0",
|
|
26
26
|
"uint8arrays": "3.0.0",
|
|
27
|
-
"@atproto/common": "^0.4.
|
|
27
|
+
"@atproto/common": "^0.4.1",
|
|
28
28
|
"@atproto/crypto": "^0.4.0",
|
|
29
|
-
"@atproto/repo": "^0.4.
|
|
29
|
+
"@atproto/repo": "^0.4.1"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc --build tsconfig.build.json"
|
package/src/s3.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { randomStr } from '@atproto/crypto'
|
|
|
5
5
|
import { CID } from 'multiformats/cid'
|
|
6
6
|
import stream from 'stream'
|
|
7
7
|
|
|
8
|
-
export type S3Config = { bucket: string } & Omit<
|
|
8
|
+
export type S3Config = { bucket: string; uploadTimeoutMs?: number } & Omit<
|
|
9
9
|
aws.S3ClientConfig,
|
|
10
10
|
'apiVersion'
|
|
11
11
|
>
|
|
@@ -16,10 +16,15 @@ export type S3Config = { bucket: string } & Omit<
|
|
|
16
16
|
export class S3BlobStore implements BlobStore {
|
|
17
17
|
private client: aws.S3
|
|
18
18
|
private bucket: string
|
|
19
|
+
private uploadTimeoutMs: number
|
|
19
20
|
|
|
20
|
-
constructor(
|
|
21
|
-
|
|
21
|
+
constructor(
|
|
22
|
+
public did: string,
|
|
23
|
+
cfg: S3Config,
|
|
24
|
+
) {
|
|
25
|
+
const { bucket, uploadTimeoutMs, ...rest } = cfg
|
|
22
26
|
this.bucket = bucket
|
|
27
|
+
this.uploadTimeoutMs = uploadTimeoutMs ?? 10000
|
|
23
28
|
this.client = new aws.S3({
|
|
24
29
|
...rest,
|
|
25
30
|
apiVersion: '2006-03-01',
|
|
@@ -50,14 +55,27 @@ export class S3BlobStore implements BlobStore {
|
|
|
50
55
|
|
|
51
56
|
async putTemp(bytes: Uint8Array | stream.Readable): Promise<string> {
|
|
52
57
|
const key = this.genKey()
|
|
53
|
-
|
|
58
|
+
// @NOTE abort results in error from aws-sdk "Upload aborted." with name "AbortError"
|
|
59
|
+
const abortController = new AbortController()
|
|
60
|
+
const timeout = setTimeout(
|
|
61
|
+
() => abortController.abort(),
|
|
62
|
+
this.uploadTimeoutMs,
|
|
63
|
+
)
|
|
64
|
+
const upload = new Upload({
|
|
54
65
|
client: this.client,
|
|
55
66
|
params: {
|
|
56
67
|
Bucket: this.bucket,
|
|
57
68
|
Body: bytes,
|
|
58
69
|
Key: this.getTmpPath(key),
|
|
59
70
|
},
|
|
60
|
-
|
|
71
|
+
// @ts-ignore native implementation fine in node >=15
|
|
72
|
+
abortController,
|
|
73
|
+
})
|
|
74
|
+
try {
|
|
75
|
+
await upload.done()
|
|
76
|
+
} finally {
|
|
77
|
+
clearTimeout(timeout)
|
|
78
|
+
}
|
|
61
79
|
return key
|
|
62
80
|
}
|
|
63
81
|
|
|
@@ -78,14 +96,27 @@ export class S3BlobStore implements BlobStore {
|
|
|
78
96
|
cid: CID,
|
|
79
97
|
bytes: Uint8Array | stream.Readable,
|
|
80
98
|
): Promise<void> {
|
|
81
|
-
|
|
99
|
+
// @NOTE abort results in error from aws-sdk "Upload aborted." with name "AbortError"
|
|
100
|
+
const abortController = new AbortController()
|
|
101
|
+
const timeout = setTimeout(
|
|
102
|
+
() => abortController.abort(),
|
|
103
|
+
this.uploadTimeoutMs,
|
|
104
|
+
)
|
|
105
|
+
const upload = new Upload({
|
|
82
106
|
client: this.client,
|
|
83
107
|
params: {
|
|
84
108
|
Bucket: this.bucket,
|
|
85
109
|
Body: bytes,
|
|
86
110
|
Key: this.getStoredPath(cid),
|
|
87
111
|
},
|
|
88
|
-
|
|
112
|
+
// @ts-ignore native implementation fine in node >=15
|
|
113
|
+
abortController,
|
|
114
|
+
})
|
|
115
|
+
try {
|
|
116
|
+
await upload.done()
|
|
117
|
+
} finally {
|
|
118
|
+
clearTimeout(timeout)
|
|
119
|
+
}
|
|
89
120
|
}
|
|
90
121
|
|
|
91
122
|
async quarantine(cid: CID): Promise<void> {
|