@beyonk/tus-bunny-store 0.1.0-beta.1 → 0.1.0-beta.3
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.map +1 -1
- package/dist/index.js +55 -26
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +63 -36
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAKjC,OAAO,EAAwB,MAAM,EAAE,SAAS,EAAC,MAAM,YAAY,CAAA;AACnE,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAIzD,MAAM,MAAM,OAAO,GAAG;IACpB;;OAEG;IACH,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAA;CAC9C,CAAA;AAmED,qBAAa,UAAW,SAAQ,SAAS;;IAChC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAA;gBAExC,OAAO,EAAE,OAAO;IA4GtB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkCvC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAerD;;OAEG;IACG,KAAK,CACT,QAAQ,EAAE,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,QAAQ,EAChD,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;IAmIZ,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BtC,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5E"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import stream from 'node:stream';
|
|
2
|
+
import { Buffer } from 'node:buffer';
|
|
2
3
|
import debug from 'debug';
|
|
3
4
|
import { ReadableStream } from 'node:stream/web';
|
|
4
5
|
import { ERRORS, TUS_RESUMABLE, Upload, DataStore } from '@tus/utils';
|
|
@@ -6,8 +7,14 @@ import * as BunnyStorageSDK from '@bunny.net/storage-sdk';
|
|
|
6
7
|
const log = debug('tus-node-server:stores:bunnystore');
|
|
7
8
|
/**
|
|
8
9
|
* Convert a Node.js Readable stream to a Web ReadableStream
|
|
10
|
+
* Uses the built-in toWeb() method if available, otherwise falls back to manual conversion
|
|
9
11
|
*/
|
|
10
12
|
function nodeStreamToWebStream(nodeStream) {
|
|
13
|
+
// Use built-in toWeb() method if available (Node.js 17+)
|
|
14
|
+
if (typeof stream.Readable.toWeb === 'function') {
|
|
15
|
+
return stream.Readable.toWeb(nodeStream);
|
|
16
|
+
}
|
|
17
|
+
// Fallback for older Node.js versions or edge environments
|
|
11
18
|
return new ReadableStream({
|
|
12
19
|
start(controller) {
|
|
13
20
|
nodeStream.on('data', (chunk) => {
|
|
@@ -28,8 +35,14 @@ function nodeStreamToWebStream(nodeStream) {
|
|
|
28
35
|
}
|
|
29
36
|
/**
|
|
30
37
|
* Convert a Web ReadableStream to a Node.js Readable stream
|
|
38
|
+
* Uses the built-in fromWeb() method if available, otherwise falls back to manual conversion
|
|
31
39
|
*/
|
|
32
40
|
function webStreamToNodeStream(webStream) {
|
|
41
|
+
// Use built-in fromWeb() method if available (Node.js 17+)
|
|
42
|
+
if (typeof stream.Readable.fromWeb === 'function') {
|
|
43
|
+
return stream.Readable.fromWeb(webStream);
|
|
44
|
+
}
|
|
45
|
+
// Fallback for older Node.js versions or edge environments
|
|
33
46
|
const reader = webStream.getReader();
|
|
34
47
|
const nodeStream = new stream.Readable({
|
|
35
48
|
async read() {
|
|
@@ -59,6 +72,12 @@ export class BunnyStore extends DataStore {
|
|
|
59
72
|
this.storageZone = options.storageZone;
|
|
60
73
|
this.extensions = ['creation', 'creation-with-upload', 'creation-defer-length'];
|
|
61
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Normalize path for Bunny Storage - ensure it starts with /
|
|
77
|
+
*/
|
|
78
|
+
#normalizePath(path) {
|
|
79
|
+
return path.startsWith('/') ? path : `/${path}`;
|
|
80
|
+
}
|
|
62
81
|
/**
|
|
63
82
|
* Get the path for the metadata info file
|
|
64
83
|
*/
|
|
@@ -75,13 +94,18 @@ export class BunnyStore extends DataStore {
|
|
|
75
94
|
'tus-version': TUS_RESUMABLE,
|
|
76
95
|
};
|
|
77
96
|
const metadataJson = JSON.stringify(metadata);
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
const metadataBytes = new TextEncoder().encode(metadataJson);
|
|
98
|
+
// Create a Web ReadableStream directly instead of converting from Node.js stream
|
|
99
|
+
// This is more compatible with edge environments
|
|
100
|
+
const metadataStream = new ReadableStream({
|
|
101
|
+
start(controller) {
|
|
102
|
+
controller.enqueue(metadataBytes);
|
|
103
|
+
controller.close();
|
|
82
104
|
},
|
|
83
105
|
});
|
|
84
|
-
|
|
106
|
+
const metadataPath = this.#normalizePath(this.#infoKey(upload.id));
|
|
107
|
+
log(`[${upload.id}] uploading metadata to path: ${metadataPath}`);
|
|
108
|
+
await BunnyStorageSDK.file.upload(this.storageZone, metadataPath, metadataStream);
|
|
85
109
|
log(`[${upload.id}] metadata file saved`);
|
|
86
110
|
}
|
|
87
111
|
/**
|
|
@@ -89,7 +113,8 @@ export class BunnyStore extends DataStore {
|
|
|
89
113
|
*/
|
|
90
114
|
async #getMetadata(id) {
|
|
91
115
|
try {
|
|
92
|
-
const
|
|
116
|
+
const infoPath = this.#normalizePath(this.#infoKey(id));
|
|
117
|
+
const infoFile = await BunnyStorageSDK.file.get(this.storageZone, infoPath);
|
|
93
118
|
const { stream: webStream } = await infoFile.data();
|
|
94
119
|
const nodeStream = webStreamToNodeStream(webStream);
|
|
95
120
|
const chunks = [];
|
|
@@ -131,40 +156,40 @@ export class BunnyStore extends DataStore {
|
|
|
131
156
|
if (!upload.id) {
|
|
132
157
|
throw ERRORS.FILE_NOT_FOUND;
|
|
133
158
|
}
|
|
159
|
+
const filePath = this.#normalizePath(upload.id);
|
|
160
|
+
log(`[${upload.id}] normalized file path: ${filePath}`);
|
|
134
161
|
upload.storage = {
|
|
135
162
|
type: 'bunny',
|
|
136
|
-
path:
|
|
163
|
+
path: filePath,
|
|
137
164
|
bucket: BunnyStorageSDK.zone.name(this.storageZone),
|
|
138
165
|
};
|
|
139
166
|
upload.creation_date = new Date().toISOString();
|
|
140
|
-
//
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
this.push(null);
|
|
144
|
-
},
|
|
145
|
-
});
|
|
146
|
-
const uploadOptions = {};
|
|
147
|
-
if (upload.metadata?.contentType) {
|
|
148
|
-
uploadOptions.contentType = upload.metadata.contentType;
|
|
149
|
-
}
|
|
167
|
+
// Don't create the actual file yet - Bunny Storage may not accept empty files
|
|
168
|
+
// The file will be created on the first write operation
|
|
169
|
+
// Only save the metadata to track the upload
|
|
150
170
|
try {
|
|
151
|
-
await BunnyStorageSDK.file.upload(this.storageZone, upload.id, nodeStreamToWebStream(emptyStream), uploadOptions);
|
|
152
171
|
await this.#saveMetadata(upload);
|
|
153
|
-
log(`[${upload.id}] upload created`);
|
|
172
|
+
log(`[${upload.id}] upload created (metadata only, file will be created on first write)`);
|
|
154
173
|
return upload;
|
|
155
174
|
}
|
|
156
175
|
catch (error) {
|
|
157
|
-
log(
|
|
176
|
+
log(`[BunnyStore] create error for path "${filePath}":`, error);
|
|
177
|
+
if (error instanceof Error) {
|
|
178
|
+
log(`[BunnyStore] error message: ${error.message}`);
|
|
179
|
+
log(`[BunnyStore] error stack: ${error.stack}`);
|
|
180
|
+
}
|
|
158
181
|
throw ERRORS.FILE_WRITE_ERROR;
|
|
159
182
|
}
|
|
160
183
|
}
|
|
161
184
|
async read(file_id) {
|
|
185
|
+
const filePath = this.#normalizePath(file_id);
|
|
162
186
|
try {
|
|
163
|
-
|
|
187
|
+
log(`[${file_id}] reading from path: ${filePath}`);
|
|
188
|
+
const { stream: webStream } = await BunnyStorageSDK.file.download(this.storageZone, filePath);
|
|
164
189
|
return webStreamToNodeStream(webStream);
|
|
165
190
|
}
|
|
166
191
|
catch (error) {
|
|
167
|
-
log(
|
|
192
|
+
log(`[BunnyStore] read error for path "${filePath}":`, error);
|
|
168
193
|
throw ERRORS.FILE_NOT_FOUND;
|
|
169
194
|
}
|
|
170
195
|
}
|
|
@@ -192,8 +217,10 @@ export class BunnyStore extends DataStore {
|
|
|
192
217
|
const chunks = [];
|
|
193
218
|
// If there's existing data, download it first
|
|
194
219
|
if (upload.offset > 0) {
|
|
220
|
+
const existingFilePath = this.#normalizePath(id);
|
|
195
221
|
try {
|
|
196
|
-
|
|
222
|
+
log(`[${id}] downloading existing file from path: ${existingFilePath}`);
|
|
223
|
+
const existingFile = await BunnyStorageSDK.file.get(this.storageZone, existingFilePath);
|
|
197
224
|
const { stream: existingWebStream } = await existingFile.data();
|
|
198
225
|
const existingNodeStream = webStreamToNodeStream(existingWebStream);
|
|
199
226
|
for await (const chunk of existingNodeStream) {
|
|
@@ -201,7 +228,7 @@ export class BunnyStore extends DataStore {
|
|
|
201
228
|
}
|
|
202
229
|
}
|
|
203
230
|
catch (error) {
|
|
204
|
-
log(`[${id}] error downloading existing file:`, error);
|
|
231
|
+
log(`[${id}] error downloading existing file from path "${existingFilePath}":`, error);
|
|
205
232
|
// If file doesn't exist yet, that's okay for offset 0
|
|
206
233
|
if (upload.offset > 0) {
|
|
207
234
|
isResolved = true;
|
|
@@ -241,7 +268,8 @@ export class BunnyStore extends DataStore {
|
|
|
241
268
|
if (upload.metadata?.contentType) {
|
|
242
269
|
uploadOptions.contentType = upload.metadata.contentType;
|
|
243
270
|
}
|
|
244
|
-
|
|
271
|
+
const uploadFilePath = this.#normalizePath(id);
|
|
272
|
+
await BunnyStorageSDK.file.upload(this.storageZone, uploadFilePath, nodeStreamToWebStream(combinedStream), uploadOptions);
|
|
245
273
|
// Update metadata
|
|
246
274
|
await this.#saveMetadata(upload);
|
|
247
275
|
log(`[${id}] ${newOffset} bytes written`);
|
|
@@ -293,7 +321,8 @@ export class BunnyStore extends DataStore {
|
|
|
293
321
|
const upload = metadata.file;
|
|
294
322
|
// Get the actual file size from storage
|
|
295
323
|
try {
|
|
296
|
-
const
|
|
324
|
+
const filePath = this.#normalizePath(id);
|
|
325
|
+
const fileInfo = await BunnyStorageSDK.file.get(this.storageZone, filePath);
|
|
297
326
|
upload.offset = fileInfo.length;
|
|
298
327
|
}
|
|
299
328
|
catch (error) {
|
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@beyonk/tus-bunny-store",
|
|
4
|
-
"version": "0.1.0-beta.
|
|
4
|
+
"version": "0.1.0-beta.3",
|
|
5
5
|
"description": "Bunny.net store for @tus/server",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"exports": "./dist/index.js",
|
package/src/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import stream from 'node:stream'
|
|
2
2
|
import type http from 'node:http'
|
|
3
|
+
import {Buffer} from 'node:buffer'
|
|
3
4
|
import debug from 'debug'
|
|
4
5
|
import {ReadableStream} from 'node:stream/web'
|
|
5
6
|
|
|
@@ -22,8 +23,15 @@ type MetadataValue = {
|
|
|
22
23
|
|
|
23
24
|
/**
|
|
24
25
|
* Convert a Node.js Readable stream to a Web ReadableStream
|
|
26
|
+
* Uses the built-in toWeb() method if available, otherwise falls back to manual conversion
|
|
25
27
|
*/
|
|
26
28
|
function nodeStreamToWebStream(nodeStream: stream.Readable): ReadableStream<Uint8Array> {
|
|
29
|
+
// Use built-in toWeb() method if available (Node.js 17+)
|
|
30
|
+
if (typeof stream.Readable.toWeb === 'function') {
|
|
31
|
+
return stream.Readable.toWeb(nodeStream) as ReadableStream<Uint8Array>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Fallback for older Node.js versions or edge environments
|
|
27
35
|
return new ReadableStream({
|
|
28
36
|
start(controller) {
|
|
29
37
|
nodeStream.on('data', (chunk: Buffer | Uint8Array) => {
|
|
@@ -45,8 +53,15 @@ function nodeStreamToWebStream(nodeStream: stream.Readable): ReadableStream<Uint
|
|
|
45
53
|
|
|
46
54
|
/**
|
|
47
55
|
* Convert a Web ReadableStream to a Node.js Readable stream
|
|
56
|
+
* Uses the built-in fromWeb() method if available, otherwise falls back to manual conversion
|
|
48
57
|
*/
|
|
49
58
|
function webStreamToNodeStream(webStream: ReadableStream<Uint8Array>): stream.Readable {
|
|
59
|
+
// Use built-in fromWeb() method if available (Node.js 17+)
|
|
60
|
+
if (typeof stream.Readable.fromWeb === 'function') {
|
|
61
|
+
return stream.Readable.fromWeb(webStream)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Fallback for older Node.js versions or edge environments
|
|
50
65
|
const reader = webStream.getReader()
|
|
51
66
|
const nodeStream = new stream.Readable({
|
|
52
67
|
async read() {
|
|
@@ -81,6 +96,13 @@ export class BunnyStore extends DataStore {
|
|
|
81
96
|
this.extensions = ['creation', 'creation-with-upload', 'creation-defer-length']
|
|
82
97
|
}
|
|
83
98
|
|
|
99
|
+
/**
|
|
100
|
+
* Normalize path for Bunny Storage - ensure it starts with /
|
|
101
|
+
*/
|
|
102
|
+
#normalizePath(path: string): string {
|
|
103
|
+
return path.startsWith('/') ? path : `/${path}`
|
|
104
|
+
}
|
|
105
|
+
|
|
84
106
|
/**
|
|
85
107
|
* Get the path for the metadata info file
|
|
86
108
|
*/
|
|
@@ -99,17 +121,25 @@ export class BunnyStore extends DataStore {
|
|
|
99
121
|
}
|
|
100
122
|
|
|
101
123
|
const metadataJson = JSON.stringify(metadata)
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
124
|
+
const metadataBytes = new TextEncoder().encode(metadataJson)
|
|
125
|
+
|
|
126
|
+
// Create a Web ReadableStream directly instead of converting from Node.js stream
|
|
127
|
+
// This is more compatible with edge environments
|
|
128
|
+
const metadataStream = new ReadableStream({
|
|
129
|
+
start(controller) {
|
|
130
|
+
controller.enqueue(metadataBytes)
|
|
131
|
+
controller.close()
|
|
106
132
|
},
|
|
107
133
|
})
|
|
108
134
|
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
const metadataPath = this.#normalizePath(this.#infoKey(upload.id))
|
|
138
|
+
log(`[${upload.id}] uploading metadata to path: ${metadataPath}`)
|
|
109
139
|
await BunnyStorageSDK.file.upload(
|
|
110
140
|
this.storageZone,
|
|
111
|
-
|
|
112
|
-
|
|
141
|
+
metadataPath,
|
|
142
|
+
metadataStream
|
|
113
143
|
)
|
|
114
144
|
log(`[${upload.id}] metadata file saved`)
|
|
115
145
|
}
|
|
@@ -119,7 +149,8 @@ export class BunnyStore extends DataStore {
|
|
|
119
149
|
*/
|
|
120
150
|
async #getMetadata(id: string): Promise<MetadataValue> {
|
|
121
151
|
try {
|
|
122
|
-
const
|
|
152
|
+
const infoPath = this.#normalizePath(this.#infoKey(id))
|
|
153
|
+
const infoFile = await BunnyStorageSDK.file.get(this.storageZone, infoPath)
|
|
123
154
|
const {stream: webStream} = await infoFile.data()
|
|
124
155
|
const nodeStream = webStreamToNodeStream(webStream)
|
|
125
156
|
|
|
@@ -167,53 +198,45 @@ export class BunnyStore extends DataStore {
|
|
|
167
198
|
throw ERRORS.FILE_NOT_FOUND
|
|
168
199
|
}
|
|
169
200
|
|
|
201
|
+
const filePath = this.#normalizePath(upload.id)
|
|
202
|
+
log(`[${upload.id}] normalized file path: ${filePath}`)
|
|
203
|
+
|
|
170
204
|
upload.storage = {
|
|
171
205
|
type: 'bunny',
|
|
172
|
-
path:
|
|
206
|
+
path: filePath,
|
|
173
207
|
bucket: BunnyStorageSDK.zone.name(this.storageZone),
|
|
174
208
|
}
|
|
175
209
|
|
|
176
210
|
upload.creation_date = new Date().toISOString()
|
|
177
211
|
|
|
178
|
-
//
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
this.push(null)
|
|
182
|
-
},
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
const uploadOptions: BunnyStorageSDK.file.UploadOptions = {}
|
|
186
|
-
if (upload.metadata?.contentType) {
|
|
187
|
-
uploadOptions.contentType = upload.metadata.contentType
|
|
188
|
-
}
|
|
189
|
-
|
|
212
|
+
// Don't create the actual file yet - Bunny Storage may not accept empty files
|
|
213
|
+
// The file will be created on the first write operation
|
|
214
|
+
// Only save the metadata to track the upload
|
|
190
215
|
try {
|
|
191
|
-
await BunnyStorageSDK.file.upload(
|
|
192
|
-
this.storageZone,
|
|
193
|
-
upload.id,
|
|
194
|
-
nodeStreamToWebStream(emptyStream),
|
|
195
|
-
uploadOptions
|
|
196
|
-
)
|
|
197
|
-
|
|
198
216
|
await this.#saveMetadata(upload)
|
|
199
|
-
|
|
200
|
-
log(`[${upload.id}] upload created`)
|
|
217
|
+
log(`[${upload.id}] upload created (metadata only, file will be created on first write)`)
|
|
201
218
|
return upload
|
|
202
219
|
} catch (error) {
|
|
203
|
-
log(
|
|
220
|
+
log(`[BunnyStore] create error for path "${filePath}":`, error)
|
|
221
|
+
if (error instanceof Error) {
|
|
222
|
+
log(`[BunnyStore] error message: ${error.message}`)
|
|
223
|
+
log(`[BunnyStore] error stack: ${error.stack}`)
|
|
224
|
+
}
|
|
204
225
|
throw ERRORS.FILE_WRITE_ERROR
|
|
205
226
|
}
|
|
206
227
|
}
|
|
207
228
|
|
|
208
229
|
async read(file_id: string): Promise<stream.Readable> {
|
|
230
|
+
const filePath = this.#normalizePath(file_id)
|
|
209
231
|
try {
|
|
232
|
+
log(`[${file_id}] reading from path: ${filePath}`)
|
|
210
233
|
const {stream: webStream} = await BunnyStorageSDK.file.download(
|
|
211
234
|
this.storageZone,
|
|
212
|
-
|
|
235
|
+
filePath
|
|
213
236
|
)
|
|
214
237
|
return webStreamToNodeStream(webStream)
|
|
215
238
|
} catch (error) {
|
|
216
|
-
log(
|
|
239
|
+
log(`[BunnyStore] read error for path "${filePath}":`, error)
|
|
217
240
|
throw ERRORS.FILE_NOT_FOUND
|
|
218
241
|
}
|
|
219
242
|
}
|
|
@@ -252,8 +275,10 @@ export class BunnyStore extends DataStore {
|
|
|
252
275
|
|
|
253
276
|
// If there's existing data, download it first
|
|
254
277
|
if (upload.offset > 0) {
|
|
278
|
+
const existingFilePath = this.#normalizePath(id)
|
|
255
279
|
try {
|
|
256
|
-
|
|
280
|
+
log(`[${id}] downloading existing file from path: ${existingFilePath}`)
|
|
281
|
+
const existingFile = await BunnyStorageSDK.file.get(this.storageZone, existingFilePath)
|
|
257
282
|
const {stream: existingWebStream} = await existingFile.data()
|
|
258
283
|
const existingNodeStream = webStreamToNodeStream(existingWebStream)
|
|
259
284
|
|
|
@@ -261,7 +286,7 @@ export class BunnyStore extends DataStore {
|
|
|
261
286
|
chunks.push(chunk)
|
|
262
287
|
}
|
|
263
288
|
} catch (error) {
|
|
264
|
-
log(`[${id}] error downloading existing file:`, error)
|
|
289
|
+
log(`[${id}] error downloading existing file from path "${existingFilePath}":`, error)
|
|
265
290
|
// If file doesn't exist yet, that's okay for offset 0
|
|
266
291
|
if (upload.offset > 0) {
|
|
267
292
|
isResolved = true
|
|
@@ -306,9 +331,10 @@ export class BunnyStore extends DataStore {
|
|
|
306
331
|
uploadOptions.contentType = upload.metadata.contentType
|
|
307
332
|
}
|
|
308
333
|
|
|
334
|
+
const uploadFilePath = this.#normalizePath(id)
|
|
309
335
|
await BunnyStorageSDK.file.upload(
|
|
310
336
|
this.storageZone,
|
|
311
|
-
|
|
337
|
+
uploadFilePath,
|
|
312
338
|
nodeStreamToWebStream(combinedStream),
|
|
313
339
|
uploadOptions
|
|
314
340
|
)
|
|
@@ -364,7 +390,8 @@ export class BunnyStore extends DataStore {
|
|
|
364
390
|
|
|
365
391
|
// Get the actual file size from storage
|
|
366
392
|
try {
|
|
367
|
-
const
|
|
393
|
+
const filePath = this.#normalizePath(id)
|
|
394
|
+
const fileInfo = await BunnyStorageSDK.file.get(this.storageZone, filePath)
|
|
368
395
|
upload.offset = fileInfo.length
|
|
369
396
|
} catch (error) {
|
|
370
397
|
// If file doesn't exist yet, offset is 0
|