@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.
@@ -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;AAIjC,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;AAqDD,qBAAa,UAAW,SAAQ,SAAS;;IAChC,WAAW,EAAE,eAAe,CAAC,IAAI,CAAC,WAAW,CAAA;gBAExC,OAAO,EAAE,OAAO;IA4FtB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4CvC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAarD;;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;IAgIZ,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBtC,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5E"}
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 metadataStream = new stream.Readable({
79
- read() {
80
- this.push(Buffer.from(metadataJson));
81
- this.push(null);
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
- await BunnyStorageSDK.file.upload(this.storageZone, this.#infoKey(upload.id), nodeStreamToWebStream(metadataStream));
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 infoFile = await BunnyStorageSDK.file.get(this.storageZone, this.#infoKey(id));
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: upload.id,
163
+ path: filePath,
137
164
  bucket: BunnyStorageSDK.zone.name(this.storageZone),
138
165
  };
139
166
  upload.creation_date = new Date().toISOString();
140
- // Create an empty file to initialize the upload
141
- const emptyStream = new stream.Readable({
142
- read() {
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('[BunnyStore] create error', error);
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
- const { stream: webStream } = await BunnyStorageSDK.file.download(this.storageZone, file_id);
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('[BunnyStore] read error', error);
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
- const existingFile = await BunnyStorageSDK.file.get(this.storageZone, id);
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
- await BunnyStorageSDK.file.upload(this.storageZone, id, nodeStreamToWebStream(combinedStream), uploadOptions);
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 fileInfo = await BunnyStorageSDK.file.get(this.storageZone, id);
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.1",
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 metadataStream = new stream.Readable({
103
- read() {
104
- this.push(Buffer.from(metadataJson))
105
- this.push(null)
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
- this.#infoKey(upload.id),
112
- nodeStreamToWebStream(metadataStream)
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 infoFile = await BunnyStorageSDK.file.get(this.storageZone, this.#infoKey(id))
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: upload.id,
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
- // Create an empty file to initialize the upload
179
- const emptyStream = new stream.Readable({
180
- read() {
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('[BunnyStore] create error', error)
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
- file_id
235
+ filePath
213
236
  )
214
237
  return webStreamToNodeStream(webStream)
215
238
  } catch (error) {
216
- log('[BunnyStore] read error', error)
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
- const existingFile = await BunnyStorageSDK.file.get(this.storageZone, id)
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
- id,
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 fileInfo = await BunnyStorageSDK.file.get(this.storageZone, id)
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