@peerbit/any-store-opfs 1.1.4 → 1.1.6

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/src/worker.ts CHANGED
@@ -9,6 +9,12 @@ import { type AnyStore } from "@peerbit/any-store-interface";
9
9
  import * as memory from "@peerbit/any-store-interface/messages";
10
10
  import { fromBase64URL, ready, toBase64URL } from "@peerbit/crypto";
11
11
  import { waitForResolved } from "@peerbit/time";
12
+ import {
13
+ getTransferables,
14
+ type OPFSRequest,
15
+ type OPFSResponse,
16
+ isOPFSRequest,
17
+ } from "./protocol.js";
12
18
 
13
19
  const directory = location.hash.split("#")?.[1];
14
20
 
@@ -162,7 +168,8 @@ export class OPFSStoreWorker {
162
168
  create: true,
163
169
  });
164
170
  const writeFileHandle = await createWriteHandle(fileHandle);
165
- writeFileHandle.write(value);
171
+ writeFileHandle.write(value, { at: 0 });
172
+ writeFileHandle.truncate(value.byteLength);
166
173
  writeFileHandle.flush();
167
174
  writeFileHandle.close();
168
175
 
@@ -214,7 +221,7 @@ export class OPFSStoreWorker {
214
221
  this._rootStore = createMemory();
215
222
 
216
223
  self.addEventListener("message", async (ev) => {
217
- const message = deserialize(ev["data"], memory.MemoryRequest);
224
+ const message = this.parseMessage(ev.data);
218
225
  try {
219
226
  if (message instanceof memory.MemoryMessage) {
220
227
  if (message instanceof memory.REQ_Open) {
@@ -329,27 +336,156 @@ export class OPFSStoreWorker {
329
336
  );
330
337
  }
331
338
  }
339
+ if (isOPFSRequest(message)) {
340
+ if (message.type === "open") {
341
+ if ((await this._rootStore.status()) === "closed") {
342
+ await this._rootStore.open();
343
+ }
344
+ await this.respond(message, {
345
+ type: "ack",
346
+ level: message.level,
347
+ messageId: message.messageId,
348
+ });
349
+ return;
350
+ }
351
+
352
+ const m =
353
+ message.level.length === 0
354
+ ? this._rootStore
355
+ : this._levels.get(memory.levelKey(message.level));
356
+ if (!m) {
357
+ throw new Error("Recieved memory message for an undefined level");
358
+ }
359
+ if (message.type === "clear") {
360
+ await m.clear();
361
+ await this.respond(message, {
362
+ type: "ack",
363
+ level: message.level,
364
+ messageId: message.messageId,
365
+ });
366
+ } else if (message.type === "close") {
367
+ await m.close();
368
+ await this.respond(message, {
369
+ type: "ack",
370
+ level: message.level,
371
+ messageId: message.messageId,
372
+ });
373
+ } else if (message.type === "del") {
374
+ await m.del(message.key);
375
+ await this.respond(message, {
376
+ type: "ack",
377
+ level: message.level,
378
+ messageId: message.messageId,
379
+ });
380
+ } else if (message.type === "iterator-next") {
381
+ let iterator = this._memoryIterator.get(message.id);
382
+ if (!iterator) {
383
+ iterator = m.iterator()[Symbol.asyncIterator]();
384
+ this._memoryIterator.set(message.id, iterator);
385
+ }
386
+ const next = await iterator.next();
387
+ const nextValue = next.done ? undefined : next.value;
388
+ const response: OPFSResponse = {
389
+ type: "iterator-next",
390
+ keys: nextValue ? [nextValue[0]] : [],
391
+ values: nextValue ? [nextValue[1]] : [],
392
+ level: message.level,
393
+ messageId: message.messageId,
394
+ };
395
+ await this.respond(message, response);
396
+ if (next.done) {
397
+ this._memoryIterator.delete(message.id);
398
+ }
399
+ } else if (message.type === "iterator-stop") {
400
+ this._memoryIterator.delete(message.id);
401
+ await this.respond(message, {
402
+ type: "ack",
403
+ level: message.level,
404
+ messageId: message.messageId,
405
+ });
406
+ } else if (message.type === "get") {
407
+ await this.respond(message, {
408
+ type: "get",
409
+ bytes: await m.get(message.key),
410
+ level: message.level,
411
+ messageId: message.messageId,
412
+ });
413
+ } else if (message.type === "put") {
414
+ await m.put(message.key, message.bytes);
415
+ await this.respond(message, {
416
+ type: "ack",
417
+ level: message.level,
418
+ messageId: message.messageId,
419
+ });
420
+ } else if (message.type === "size") {
421
+ await this.respond(message, {
422
+ type: "size",
423
+ size: await m.size(),
424
+ level: message.level,
425
+ messageId: message.messageId,
426
+ });
427
+ } else if (message.type === "status") {
428
+ await this.respond(message, {
429
+ type: "status",
430
+ status: await m.status(),
431
+ level: message.level,
432
+ messageId: message.messageId,
433
+ });
434
+ } else if (message.type === "sublevel") {
435
+ await m.sublevel(message.name);
436
+ await this.respond(message, {
437
+ type: "ack",
438
+ level: message.level,
439
+ messageId: message.messageId,
440
+ });
441
+ }
442
+ }
332
443
  } catch (error) {
333
- await this.respond(
334
- message,
335
- new memory.RESP_Error({
336
- error: (error as any)?.["message"] || error?.constructor.name,
337
- level: (message as any)["level"] || [],
338
- }),
339
- postMessageFn,
340
- );
444
+ if (message instanceof memory.MemoryRequest) {
445
+ await this.respond(
446
+ message,
447
+ new memory.RESP_Error({
448
+ error: (error as any)?.["message"] || error?.constructor.name,
449
+ level: (message as any)["level"] || [],
450
+ }),
451
+ postMessageFn,
452
+ );
453
+ return;
454
+ }
455
+ await this.respond(message, {
456
+ type: "error",
457
+ error: (error as any)?.["message"] || error?.constructor.name,
458
+ level: message?.level || [],
459
+ messageId: message?.messageId || "",
460
+ });
341
461
  }
342
462
  });
343
463
  }
344
464
 
465
+ private parseMessage(data: unknown): OPFSRequest | memory.MemoryRequest {
466
+ if (isOPFSRequest(data)) {
467
+ return data;
468
+ }
469
+ const bytes =
470
+ data instanceof Uint8Array ? data : new Uint8Array(data as ArrayBuffer);
471
+ return deserialize(bytes, memory.MemoryRequest);
472
+ }
473
+
345
474
  async respond(
346
- request: memory.MemoryRequest,
347
- response: memory.MemoryRequest,
475
+ request: OPFSRequest | memory.MemoryRequest,
476
+ response: OPFSResponse | memory.MemoryRequest,
348
477
  postMessageFn = postMessage,
349
478
  ) {
350
- response.messageId = request.messageId;
351
- const bytes = serialize(response);
352
- postMessageFn(bytes, { transfer: [bytes.buffer] });
479
+ if (request instanceof memory.MemoryRequest) {
480
+ const legacyResponse = response as memory.MemoryRequest;
481
+ legacyResponse.messageId = request.messageId;
482
+ const bytes = serialize(legacyResponse);
483
+ postMessageFn(bytes, { transfer: [bytes.buffer] });
484
+ return;
485
+ }
486
+ const cloneResponse = response as OPFSResponse;
487
+ cloneResponse.messageId = request.messageId;
488
+ postMessageFn(cloneResponse, { transfer: getTransferables(cloneResponse) });
353
489
  }
354
490
  }
355
491