@nxtedition/lib 19.0.40 → 19.0.42

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 (2) hide show
  1. package/package.json +1 -1
  2. package/s3.js +29 -20
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nxtedition/lib",
3
- "version": "19.0.40",
3
+ "version": "19.0.42",
4
4
  "license": "MIT",
5
5
  "author": "Robert Nagy <robert.nagy@boffins.se>",
6
6
  "type": "module",
package/s3.js CHANGED
@@ -46,19 +46,19 @@ export async function upload({
46
46
 
47
47
  assert(queue.concurrency > 0 && queue.concurrency <= 32)
48
48
 
49
+ const ac = new AbortController()
50
+ const onAbort = () => {
51
+ ac.abort()
52
+ }
53
+ signal?.addEventListener('abort', onAbort)
54
+
49
55
  let uploadId
50
56
  try {
51
- const multipartUploadOutput = await s3.send(
52
- new AWS.CreateMultipartUploadCommand({ Bucket, Key }),
53
- { abortSignal: signal },
54
- )
55
- uploadId = multipartUploadOutput.UploadId
56
- logger = logger?.child({ uploadId })
57
- logger?.debug('multipart upload created')
58
-
59
57
  const uploader = {
60
58
  size: 0,
61
59
  hasher: crypto.createHash('md5'),
60
+ ac,
61
+ signal: ac.signal,
62
62
  part: {
63
63
  /** @type {Array<Buffer>} **/ chunks: [],
64
64
  hasher: crypto.createHash('md5'),
@@ -67,6 +67,16 @@ export async function upload({
67
67
  },
68
68
  }
69
69
 
70
+ const multipartUploadOutput = await s3.send(
71
+ new AWS.CreateMultipartUploadCommand({ Bucket, Key }),
72
+ { abortSignal: uploader.signal },
73
+ )
74
+ uploader.signal.throwIfAborted()
75
+
76
+ uploadId = multipartUploadOutput.UploadId
77
+ logger = logger?.child({ uploadId })
78
+ logger?.debug('multipart upload created')
79
+
70
80
  const maybeFlush = (minSize) => {
71
81
  const { part } = uploader
72
82
 
@@ -91,7 +101,7 @@ export async function upload({
91
101
  promises.push(
92
102
  queue
93
103
  .add(
94
- async ({ signal }) => {
104
+ async () => {
95
105
  logger?.debug({ number, size }, 'part upload started')
96
106
  try {
97
107
  const { ETag } = await s3.send(
@@ -111,20 +121,16 @@ export async function upload({
111
121
  },
112
122
  }),
113
123
  }),
114
- { abortSignal: signal },
115
124
  )
116
125
  logger?.debug({ number, size, etag: ETag }, 'part upload completed')
117
126
  return { part: { ETag, PartNumber: number } }
118
127
  } catch (err) {
119
- if (err.name === 'AbortError') {
120
- logger?.debug({ err }, 'part upload aborted')
121
- } else {
122
- logger?.warn({ err }, 'part upload failed')
123
- }
128
+ uploader.ac.abort(err)
129
+ logger?.warn({ err }, 'part upload failed')
124
130
  return { error: err }
125
131
  }
126
132
  },
127
- { signal },
133
+ { signal: uploader.signal },
128
134
  )
129
135
  .catch((err) => ({ error: err })),
130
136
  )
@@ -133,7 +139,7 @@ export async function upload({
133
139
  }
134
140
 
135
141
  for await (const chunk of Body) {
136
- signal?.throwIfAborted()
142
+ uploader.signal.throwIfAborted()
137
143
 
138
144
  uploader.hasher.update(chunk)
139
145
  uploader.size += chunk.byteLength
@@ -145,9 +151,11 @@ export async function upload({
145
151
  const thenable = maybeFlush(partSize)
146
152
  if (thenable) {
147
153
  await thenable
154
+ uploader.signal.throwIfAborted()
148
155
  }
149
156
  }
150
157
  await maybeFlush()
158
+ uploader.signal.throwIfAborted()
151
159
 
152
160
  const parts = []
153
161
  const errors = []
@@ -158,7 +166,7 @@ export async function upload({
158
166
  parts.push(part)
159
167
  }
160
168
  }
161
- signal?.throwIfAborted()
169
+ uploader.signal.throwIfAborted()
162
170
 
163
171
  if (errors.length > 0) {
164
172
  throw new AggregateError(errors, 'multipart upload failed')
@@ -175,9 +183,8 @@ export async function upload({
175
183
  UploadId: uploadId,
176
184
  MultipartUpload: { Parts: parts },
177
185
  }),
178
- { abortSignal: signal },
179
186
  )
180
- signal?.throwIfAborted()
187
+ uploader.signal.throwIfAborted()
181
188
 
182
189
  const result = {
183
190
  size: uploader.size,
@@ -212,5 +219,7 @@ export async function upload({
212
219
  }
213
220
 
214
221
  throw err
222
+ } finally {
223
+ signal?.removeEventListener('abort', onAbort)
215
224
  }
216
225
  }