@e280/mammoth 0.1.0-14 → 0.1.0-2

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 (103) hide show
  1. package/README.md +5 -114
  2. package/package.json +5 -8
  3. package/s/browser/example.ts +11 -10
  4. package/s/browser/{opfs-bucket.ts → iceberg-opfs.ts} +8 -2
  5. package/s/browser/index.ts +1 -1
  6. package/s/core/hash-stream.ts +19 -0
  7. package/s/core/{memory-bucket.ts → iceberg-memory.ts} +6 -2
  8. package/s/core/index.ts +2 -3
  9. package/s/core/mammoth.ts +46 -54
  10. package/s/core/types.ts +9 -37
  11. package/s/test.ts +16 -41
  12. package/x/browser/example.js +11 -10
  13. package/x/browser/example.js.map +1 -1
  14. package/x/browser/{opfs-bucket.d.ts → iceberg-opfs.d.ts} +3 -2
  15. package/x/browser/{opfs-bucket.js → iceberg-opfs.js} +7 -2
  16. package/x/browser/iceberg-opfs.js.map +1 -0
  17. package/x/browser/index.d.ts +1 -1
  18. package/x/browser/index.js +1 -1
  19. package/x/browser/index.js.map +1 -1
  20. package/x/core/hash-stream.d.ts +1 -0
  21. package/x/core/{analyze.js → hash-stream.js} +4 -7
  22. package/x/core/hash-stream.js.map +1 -0
  23. package/x/core/{memory-bucket.d.ts → iceberg-memory.d.ts} +3 -2
  24. package/x/core/{memory-bucket.js → iceberg-memory.js} +5 -2
  25. package/x/core/iceberg-memory.js.map +1 -0
  26. package/x/core/index.d.ts +2 -3
  27. package/x/core/index.js +2 -3
  28. package/x/core/index.js.map +1 -1
  29. package/x/core/mammoth.d.ts +5 -7
  30. package/x/core/mammoth.js +40 -51
  31. package/x/core/mammoth.js.map +1 -1
  32. package/x/core/types.d.ts +9 -27
  33. package/x/test.js +16 -39
  34. package/x/test.js.map +1 -1
  35. package/s/core/analyze.ts +0 -23
  36. package/s/core/consts.ts +0 -8
  37. package/s/core/manifest/fns/commit.ts +0 -27
  38. package/s/core/manifest/fns/get-expired-writes.ts +0 -11
  39. package/s/core/manifest/fns/get-stats.ts +0 -10
  40. package/s/core/manifest/fns/move-write-to-trash.ts +0 -11
  41. package/s/core/manifest/fns/need-info.ts +0 -10
  42. package/s/core/manifest/fns/schedule-deletion.ts +0 -19
  43. package/s/core/manifest/manifest.ts +0 -26
  44. package/s/core/streamify.ts +0 -18
  45. package/s/core/utils/cleanup.ts +0 -16
  46. package/s/core/utils/is-expired.ts +0 -10
  47. package/s/core/utils/not-found.ts +0 -7
  48. package/s/core/utils/save.ts +0 -28
  49. package/s/node/disk-bucket.ts +0 -55
  50. package/s/node/index.ts +0 -4
  51. package/s/node/utils/is-not-found.ts +0 -9
  52. package/x/browser/opfs-bucket.js.map +0 -1
  53. package/x/core/analyze.d.ts +0 -2
  54. package/x/core/analyze.js.map +0 -1
  55. package/x/core/consts.d.ts +0 -4
  56. package/x/core/consts.js +0 -6
  57. package/x/core/consts.js.map +0 -1
  58. package/x/core/manifest/fns/commit.d.ts +0 -3
  59. package/x/core/manifest/fns/commit.js +0 -22
  60. package/x/core/manifest/fns/commit.js.map +0 -1
  61. package/x/core/manifest/fns/get-expired-writes.d.ts +0 -2
  62. package/x/core/manifest/fns/get-expired-writes.js +0 -8
  63. package/x/core/manifest/fns/get-expired-writes.js.map +0 -1
  64. package/x/core/manifest/fns/get-stats.d.ts +0 -2
  65. package/x/core/manifest/fns/get-stats.js +0 -5
  66. package/x/core/manifest/fns/get-stats.js.map +0 -1
  67. package/x/core/manifest/fns/move-write-to-trash.d.ts +0 -3
  68. package/x/core/manifest/fns/move-write-to-trash.js +0 -7
  69. package/x/core/manifest/fns/move-write-to-trash.js.map +0 -1
  70. package/x/core/manifest/fns/need-info.d.ts +0 -3
  71. package/x/core/manifest/fns/need-info.js +0 -6
  72. package/x/core/manifest/fns/need-info.js.map +0 -1
  73. package/x/core/manifest/fns/schedule-deletion.d.ts +0 -3
  74. package/x/core/manifest/fns/schedule-deletion.js +0 -13
  75. package/x/core/manifest/fns/schedule-deletion.js.map +0 -1
  76. package/x/core/manifest/manifest.d.ts +0 -14
  77. package/x/core/manifest/manifest.js +0 -19
  78. package/x/core/manifest/manifest.js.map +0 -1
  79. package/x/core/memory-bucket.js.map +0 -1
  80. package/x/core/streamify.d.ts +0 -1
  81. package/x/core/streamify.js +0 -15
  82. package/x/core/streamify.js.map +0 -1
  83. package/x/core/utils/cleanup.d.ts +0 -3
  84. package/x/core/utils/cleanup.js +0 -11
  85. package/x/core/utils/cleanup.js.map +0 -1
  86. package/x/core/utils/is-expired.d.ts +0 -2
  87. package/x/core/utils/is-expired.js +0 -7
  88. package/x/core/utils/is-expired.js.map +0 -1
  89. package/x/core/utils/not-found.d.ts +0 -2
  90. package/x/core/utils/not-found.js +0 -4
  91. package/x/core/utils/not-found.js.map +0 -1
  92. package/x/core/utils/save.d.ts +0 -2
  93. package/x/core/utils/save.js +0 -16
  94. package/x/core/utils/save.js.map +0 -1
  95. package/x/node/disk-bucket.d.ts +0 -9
  96. package/x/node/disk-bucket.js +0 -43
  97. package/x/node/disk-bucket.js.map +0 -1
  98. package/x/node/index.d.ts +0 -2
  99. package/x/node/index.js +0 -3
  100. package/x/node/index.js.map +0 -1
  101. package/x/node/utils/is-not-found.d.ts +0 -1
  102. package/x/node/utils/is-not-found.js +0 -6
  103. package/x/node/utils/is-not-found.js.map +0 -1
@@ -1,2 +1,2 @@
1
1
  export * from "../core/index.js";
2
- export * from "./opfs-bucket.js";
2
+ export * from "./iceberg-opfs.js";
@@ -1,3 +1,3 @@
1
1
  export * from "../core/index.js";
2
- export * from "./opfs-bucket.js";
2
+ export * from "./iceberg-opfs.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/browser/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/browser/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1 @@
1
+ export declare function hashStream(readable: ReadableStream<Uint8Array>): Promise<string>;
@@ -1,17 +1,14 @@
1
1
  import { hex, nap } from "@e280/stz";
2
- import { blake3 } from "@awasm/noble";
2
+ import { blake3 } from "@noble/hashes/blake3.js";
3
3
  import { relaxer } from "./utils/relaxer.js";
4
- export async function analyze(readable) {
5
- let size = 0;
4
+ export async function hashStream(readable) {
6
5
  const hasher = blake3.create();
7
6
  const relax = relaxer();
8
7
  for await (const chunk of readable) {
9
8
  hasher.update(chunk);
10
- size += chunk.byteLength;
11
9
  if (relax())
12
10
  await nap();
13
11
  }
14
- const hash = hex.fromBytes(hasher.digest());
15
- return { hash, size };
12
+ return hex.fromBytes(hasher.digest());
16
13
  }
17
- //# sourceMappingURL=analyze.js.map
14
+ //# sourceMappingURL=hash-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash-stream.js","sourceRoot":"","sources":["../../s/core/hash-stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAE,GAAG,EAAC,MAAM,WAAW,CAAA;AAClC,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAA;AAC9C,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAoC;IACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;IAC9B,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;IAEvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEpB,IAAI,KAAK,EAAE;YACV,MAAM,GAAG,EAAE,CAAA;IACb,CAAC;IAED,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;AACtC,CAAC"}
@@ -1,7 +1,8 @@
1
- import { Bucket, Id } from "./types.js";
2
- export declare class MemoryBucket implements Bucket {
1
+ import { Iceberg, Id } from "./types.js";
2
+ export declare class IcebergMemory implements Iceberg {
3
3
  #private;
4
4
  has(id: Id): Promise<boolean>;
5
+ size(id: Id): Promise<number>;
5
6
  delete(id: Id): Promise<void>;
6
7
  read(id: Id): Promise<Blob>;
7
8
  write(id: Id, readable: ReadableStream<Uint8Array>): Promise<void>;
@@ -1,10 +1,13 @@
1
1
  import { bytes, got, nap } from "@e280/stz";
2
2
  import { relaxer } from "./utils/relaxer.js";
3
- export class MemoryBucket {
3
+ export class IcebergMemory {
4
4
  #map = new Map();
5
5
  async has(id) {
6
6
  return this.#map.has(id);
7
7
  }
8
+ async size(id) {
9
+ return got(this.#map.get(id)).byteLength;
10
+ }
8
11
  async delete(id) {
9
12
  this.#map.delete(id);
10
13
  }
@@ -23,4 +26,4 @@ export class MemoryBucket {
23
26
  this.#map.set(id, payload);
24
27
  }
25
28
  }
26
- //# sourceMappingURL=memory-bucket.js.map
29
+ //# sourceMappingURL=iceberg-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iceberg-memory.js","sourceRoot":"","sources":["../../s/core/iceberg-memory.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAC,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAE1C,MAAM,OAAO,aAAa;IACzB,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAA;IAEpC,KAAK,CAAC,GAAG,CAAC,EAAM;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAM;QAChB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAA;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAM;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAM;QAChB,OAAO,IAAI,IAAI,CACd,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAA4B,CAAC,EACnD,EAAC,IAAI,EAAE,0BAA0B,EAAC,CAClC,CAAA;IACF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAM,EAAE,QAAoC;QACvD,MAAM,KAAK,GAAG,OAAO,EAAE,CAAA;QACvB,MAAM,KAAK,GAAiB,EAAE,CAAA;QAE9B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACjB,IAAI,KAAK,EAAE;gBAAE,MAAM,GAAG,EAAE,CAAA;QACzB,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC3B,CAAC;CACD"}
package/x/core/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
- export * from "./analyze.js";
1
+ export * from "./hash-stream.js";
2
+ export * from "./iceberg-memory.js";
2
3
  export * from "./mammoth.js";
3
- export * from "./memory-bucket.js";
4
- export * from "./streamify.js";
5
4
  export * from "./types.js";
package/x/core/index.js CHANGED
@@ -1,6 +1,5 @@
1
- export * from "./analyze.js";
1
+ export * from "./hash-stream.js";
2
+ export * from "./iceberg-memory.js";
2
3
  export * from "./mammoth.js";
3
- export * from "./memory-bucket.js";
4
- export * from "./streamify.js";
5
4
  export * from "./types.js";
6
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/core/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/core/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAA;AAChC,cAAc,qBAAqB,CAAA;AACnC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
@@ -1,14 +1,12 @@
1
1
  import { Kv } from "@e280/kv";
2
- import { Hash, Bucket } from "./types.js";
3
- /** file storage datalake, content-addressed with blake3 hashes. */
4
- export declare class Mammoth {
2
+ import { Glacier, Hash, Iceberg } from "./types.js";
3
+ export declare class Mammoth implements Glacier {
5
4
  #private;
6
- constructor(bucket?: Bucket, kv?: Kv<any>);
7
- entries(): AsyncGenerator<[string, import("./types.js").Info], void, unknown>;
5
+ constructor(index: Kv<string>, iceberg: Iceberg);
8
6
  has(hash: Hash): Promise<boolean>;
9
- info(hash: Hash): Promise<import("./types.js").Info>;
10
- stats(): Promise<import("./types.js").Stats>;
7
+ size(hash: Hash): Promise<number>;
11
8
  read(hash: Hash): Promise<Blob>;
12
9
  delete(hash: Hash): Promise<void>;
13
10
  write(readable: ReadableStream<Uint8Array>): Promise<Hash>;
11
+ keys(): AsyncGenerator<string, void, unknown>;
14
12
  }
package/x/core/mammoth.js CHANGED
@@ -1,67 +1,56 @@
1
- import { Kv } from "@e280/kv";
2
- import { lane, queue } from "@e280/stz";
3
- import { consts } from "./consts.js";
4
- import { save } from "./utils/save.js";
5
- import { cleanup } from "./utils/cleanup.js";
1
+ import { got, hex } from "@e280/stz";
2
+ import { blake3 } from "@noble/hashes/blake3.js";
6
3
  import { randomId } from "./utils/random-id.js";
7
- import { MemoryBucket } from "./memory-bucket.js";
8
- import { Manifest } from "./manifest/manifest.js";
9
- import { commit } from "./manifest/fns/commit.js";
10
- import { needInfo } from "./manifest/fns/need-info.js";
11
- import { getStats } from "./manifest/fns/get-stats.js";
12
- import { scheduleDeletion } from "./manifest/fns/schedule-deletion.js";
13
- import { moveWriteToTrash } from "./manifest/fns/move-write-to-trash.js";
14
- /** file storage datalake, content-addressed with blake3 hashes. */
15
4
  export class Mammoth {
16
- #bucket;
17
- #manifest;
18
- #wholesome = lane(consts.max_jobs);
19
- constructor(bucket = new MemoryBucket(), kv = new Kv()) {
20
- this.#bucket = bucket;
21
- this.#manifest = new Manifest(kv);
22
- }
23
- async *entries() {
24
- yield* this.#manifest.catalog.entries();
5
+ #index;
6
+ #iceberg;
7
+ constructor(index, iceberg) {
8
+ this.#index = index;
9
+ this.#iceberg = iceberg;
25
10
  }
26
11
  async has(hash) {
27
- return this.#manifest.catalog.has(hash);
28
- }
29
- async info(hash) {
30
- return needInfo(this.#manifest, hash);
12
+ return this.#index.has(hash);
31
13
  }
32
- async stats() {
33
- return getStats(this.#manifest);
14
+ async size(hash) {
15
+ const id = await this.#needFileId(hash);
16
+ return this.#iceberg.size(id);
34
17
  }
35
18
  async read(hash) {
36
- const { id } = await this.info(hash);
37
- return this.#bucket.read(id);
19
+ const id = await this.#needFileId(hash);
20
+ return this.#iceberg.read(id);
38
21
  }
39
22
  async delete(hash) {
40
- await this.#wholesome(async () => {
41
- const info = await this.#manifest.catalog.get(hash);
42
- if (info)
43
- await scheduleDeletion(this.#manifest, hash, info);
44
- });
45
- await this.#cleanup();
23
+ const id = await this.#getFileId(hash);
24
+ if (id) {
25
+ await this.#index.del(hash);
26
+ await this.#iceberg.delete(id);
27
+ }
46
28
  }
47
29
  async write(readable) {
48
30
  const id = randomId();
49
- await this.#manifest.writes.set(id, { created: Date.now() });
50
- try {
51
- const analysis = await save(this.#bucket, id, readable);
52
- const { hash, size } = analysis;
53
- const info = { id, size, added: Date.now() };
54
- await this.#wholesome(() => commit(this.#manifest, hash, info));
55
- return analysis.hash;
56
- }
57
- catch (error) {
58
- await moveWriteToTrash(this.#manifest, id);
59
- throw error;
60
- }
61
- finally {
62
- void this.#cleanup().catch(e => console.error("cleanup failed", e));
31
+ const pipe = new TransformStream();
32
+ const done = this.#iceberg.write(id, pipe.readable);
33
+ const writer = pipe.writable.getWriter();
34
+ const hasher = blake3.create();
35
+ for await (const chunk of readable) {
36
+ await writer.write(chunk);
37
+ hasher.update(chunk);
63
38
  }
39
+ await writer.close();
40
+ await done;
41
+ const hash = hex.fromBytes(hasher.digest());
42
+ await this.delete(hash);
43
+ await this.#index.set(hash, id);
44
+ return hash;
45
+ }
46
+ async #getFileId(hash) {
47
+ return this.#index.get(hash);
48
+ }
49
+ async #needFileId(hash) {
50
+ return got(await this.#getFileId(hash), `file not found by hash "${hash}"`);
51
+ }
52
+ async *keys() {
53
+ yield* this.#index.keys();
64
54
  }
65
- #cleanup = queue(() => cleanup(this.#bucket, this.#manifest), consts.max_jobs);
66
55
  }
67
56
  //# sourceMappingURL=mammoth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mammoth.js","sourceRoot":"","sources":["../../s/core/mammoth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mammoth.js","sourceRoot":"","sources":["../../s/core/mammoth.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,GAAG,EAAE,GAAG,EAAC,MAAM,WAAW,CAAA;AAClC,OAAO,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAA;AAE9C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAG7C,MAAM,OAAO,OAAO;IACnB,MAAM,CAAA;IACN,QAAQ,CAAA;IAER,YAAY,KAAiB,EAAE,OAAgB;QAC9C,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAU;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAU;QACpB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAU;QACpB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAU;QACtB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YAC3B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC/B,CAAC;IACF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAAoC;QAC/C,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAA;QACrB,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAA;QAE9B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YACpC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAgC,CAAC,CAAA;YACpD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;QAED,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,MAAM,IAAI,CAAA;QACV,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAA;IACZ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAU;QAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAS,IAAI,CAAC,CAAA;IACrC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAU;QAC3B,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,2BAA2B,IAAI,GAAG,CAAC,CAAA;IAC5E,CAAC;IAED,KAAK,CAAA,CAAE,IAAI;QACV,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;CACD"}
package/x/core/types.d.ts CHANGED
@@ -1,35 +1,17 @@
1
1
  export type Hash = string;
2
2
  export type Id = string;
3
- /** file blob store. */
4
- export type Bucket = {
3
+ export type Iceberg = {
5
4
  has(id: Id): Promise<boolean>;
5
+ size(id: Id): Promise<number>;
6
6
  delete(id: Id): Promise<void>;
7
7
  read(id: Id): Promise<Blob>;
8
8
  write(id: Id, readable: ReadableStream<Uint8Array>): Promise<void>;
9
9
  };
10
- /** report about a file */
11
- export type Analysis = {
12
- /** blake3 hash of the file's contents */
13
- hash: Hash;
14
- /** filesize in bytes */
15
- size: number;
16
- };
17
- /** metadata for a single file. */
18
- export type Info = {
19
- /** bucket id for this file's data. */
20
- id: Id;
21
- /** filesize in bytes. */
22
- size: number;
23
- /** when this file was added to the datalake. */
24
- added: number;
25
- };
26
- /** statistics for the whole datalake. */
27
- export type Stats = {
28
- /** total number of bytes in the whole datalake. */
29
- size: number;
30
- /** total number of files in the datalake. */
31
- count: number;
32
- };
33
- export type WriteRecord = {
34
- created: number;
10
+ export type Glacier = {
11
+ has(hash: Hash): Promise<boolean>;
12
+ size(hash: Hash): Promise<number>;
13
+ read(hash: Hash): Promise<Blob>;
14
+ delete(hash: Hash): Promise<void>;
15
+ write(readable: ReadableStream<Uint8Array>): Promise<Hash>;
16
+ keys(): AsyncIterable<Hash>;
35
17
  };
package/x/test.js CHANGED
@@ -1,29 +1,19 @@
1
1
  import { Kv } from "@e280/kv";
2
- import { rm } from "fs/promises";
3
2
  import { bytes, collect } from "@e280/stz";
4
3
  import { science, test, expect } from "@e280/science";
5
4
  import { Mammoth } from "./core/mammoth.js";
6
- import { DiskBucket } from "./node/disk-bucket.js";
7
5
  import { randomId } from "./core/utils/random-id.js";
8
- import { MemoryBucket } from "./core/memory-bucket.js";
6
+ import { IcebergMemory } from "./core/iceberg-memory.js";
9
7
  const blob = () => new Blob([new Uint8Array([0xDE, 0xAD, 0xBE, 0xEF])]);
10
8
  const quickstream = (b) => new Blob([new Uint8Array(b)]).stream();
11
9
  function setup() {
12
- const kv = new Kv();
13
- const bucket = new MemoryBucket();
14
- const mammoth = new Mammoth(bucket, kv);
10
+ const index = new Kv();
11
+ const iceberg = new IcebergMemory();
12
+ const mammoth = new Mammoth(index, iceberg);
15
13
  return { mammoth };
16
14
  }
17
15
  await science.run({
18
- "mammoth node": test(async () => {
19
- const dataDir = "data";
20
- await rm(dataDir, { recursive: true, force: true });
21
- const mammoth = new Mammoth(new DiskBucket(dataDir), new Kv());
22
- const hash = await mammoth.write(blob().stream());
23
- const second = await mammoth.read(hash);
24
- expect(bytes.eq(await second.bytes(), await blob().bytes()));
25
- }),
26
- "mammoth memory": {
16
+ "mammoth": {
27
17
  ".write and .read": test(async () => {
28
18
  const { mammoth } = setup();
29
19
  const hash = await mammoth.write(blob().stream());
@@ -34,15 +24,15 @@ await science.run({
34
24
  const { mammoth } = setup();
35
25
  const hashA = await mammoth.write(blob().stream());
36
26
  const hashB = await mammoth.write(blob().stream());
37
- const entries = await collect(mammoth.entries());
27
+ const keys = await collect(mammoth.keys());
38
28
  expect(hashA).is(hashB);
39
- expect(entries.length).is(1);
40
- expect(entries[0][0]).is(hashA);
29
+ expect(keys.length).is(1);
30
+ expect(keys[0]).is(hashA);
41
31
  }),
42
32
  ".write empty file": test(async () => {
43
33
  const { mammoth } = setup();
44
34
  const hash = await mammoth.write(new Blob().stream());
45
- expect((await mammoth.info(hash)).size).is(0);
35
+ expect(await mammoth.size(hash)).is(0);
46
36
  expect((await mammoth.read(hash)).size).is(0);
47
37
  }),
48
38
  ".write distinct files": test(async () => {
@@ -50,19 +40,7 @@ await science.run({
50
40
  const hashA = await mammoth.write(quickstream([0xC0, 0xFF, 0xEE]));
51
41
  const hashB = await mammoth.write(quickstream([0xB0, 0x0B, 0x1E, 0x5]));
52
42
  expect(hashA).not.is(hashB);
53
- expect((await collect(mammoth.entries())).length).is(2);
54
- }),
55
- ".stats": test(async () => {
56
- const { mammoth } = setup();
57
- expect(await mammoth.stats()).deep({ count: 0, size: 0 });
58
- const hashA = await mammoth.write(quickstream([0xC0, 0xFF, 0xEE]));
59
- expect(await mammoth.stats()).deep({ count: 1, size: 3 });
60
- const hashB = await mammoth.write(quickstream([0xB0, 0x0B, 0x1E, 0x5]));
61
- expect(await mammoth.stats()).deep({ count: 2, size: 7 });
62
- await mammoth.delete(hashA);
63
- expect(await mammoth.stats()).deep({ count: 1, size: 4 });
64
- await mammoth.delete(hashB);
65
- expect(await mammoth.stats()).deep({ count: 0, size: 0 });
43
+ expect((await collect(mammoth.keys())).length).is(2);
66
44
  }),
67
45
  ".has": test(async () => {
68
46
  const { mammoth } = setup();
@@ -72,16 +50,15 @@ await science.run({
72
50
  }),
73
51
  ".size": test(async () => {
74
52
  const { mammoth } = setup();
75
- const b = blob();
76
- const hash = await mammoth.write(b.stream());
77
- expect((await mammoth.info(hash)).size).is(b.size);
53
+ const hash = await mammoth.write(blob().stream());
54
+ expect(await mammoth.size(hash)).is(4);
78
55
  }),
79
56
  ".delete": test(async () => {
80
57
  const { mammoth } = setup();
81
58
  const hash = await mammoth.write(blob().stream());
82
59
  await mammoth.delete(hash);
83
60
  expect(await mammoth.has(hash)).is(false);
84
- expect((await collect(mammoth.entries())).length).is(0);
61
+ expect(await collect(mammoth.keys())).deep([]);
85
62
  }),
86
63
  ".delete idempotent": test(async () => {
87
64
  const { mammoth } = setup();
@@ -90,9 +67,9 @@ await science.run({
90
67
  ".keys": test(async () => {
91
68
  const { mammoth } = setup();
92
69
  const hash = await mammoth.write(blob().stream());
93
- const entries = await collect(mammoth.entries());
94
- expect(entries.length).is(1);
95
- expect(entries[0][0]).is(hash);
70
+ const keys = await collect(mammoth.keys());
71
+ expect(keys.length).is(1);
72
+ expect(keys[0]).is(hash);
96
73
  }),
97
74
  },
98
75
  });
package/x/test.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"test.js","sourceRoot":"","sources":["../s/test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../s/test.ts"],"names":[],"mappings":"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"}
package/s/core/analyze.ts DELETED
@@ -1,23 +0,0 @@
1
-
2
- import {hex, nap} from "@e280/stz"
3
- import {blake3} from "@awasm/noble"
4
- import {Analysis} from "./types.js"
5
- import {relaxer} from "./utils/relaxer.js"
6
-
7
- export async function analyze(readable: ReadableStream<Uint8Array>): Promise<Analysis> {
8
- let size = 0
9
- const hasher = blake3.create()
10
- const relax = relaxer()
11
-
12
- for await (const chunk of readable) {
13
- hasher.update(chunk)
14
- size += chunk.byteLength
15
-
16
- if (relax())
17
- await nap()
18
- }
19
-
20
- const hash = hex.fromBytes(hasher.digest())
21
- return {hash, size}
22
- }
23
-
package/s/core/consts.ts DELETED
@@ -1,8 +0,0 @@
1
-
2
- import {time} from "@e280/stz"
3
-
4
- export const consts = {
5
- max_jobs: 64,
6
- expiry_time: time.days(7),
7
- }
8
-
@@ -1,27 +0,0 @@
1
-
2
- import {getStats} from "./get-stats.js"
3
- import {Manifest} from "../manifest.js"
4
- import {Hash, Info} from "../../types.js"
5
-
6
- export async function commit(manifest: Manifest, hash: Hash, info: Info) {
7
- const {kv, stats, catalog, writes, trash} = manifest
8
- const isNewFile = !await catalog.has(hash)
9
-
10
- if (isNewFile) {
11
- const s = await getStats(manifest)
12
- s.count += 1
13
- s.size += info.size
14
- await kv.transaction(() => [
15
- writes.write.del(info.id),
16
- catalog.write.set(hash, info),
17
- stats.write.set(s)
18
- ])
19
- }
20
- else {
21
- await kv.transaction(() => [
22
- writes.write.del(info.id),
23
- trash.write.set(info.id, true),
24
- ])
25
- }
26
- }
27
-
@@ -1,11 +0,0 @@
1
-
2
- import {Manifest} from "../manifest.js"
3
- import {isExpired} from "../../utils/is-expired.js"
4
-
5
- export async function* getExpiredWrites({writes}: Manifest) {
6
- for await (const [id, w] of writes.entries()) {
7
- if (isExpired(w))
8
- yield id
9
- }
10
- }
11
-
@@ -1,10 +0,0 @@
1
-
2
- import {Manifest} from "../manifest.js"
3
-
4
- export async function getStats({stats}: Manifest) {
5
- return structuredClone(
6
- (await stats.get())
7
- ?? {count: 0, size: 0}
8
- )
9
- }
10
-
@@ -1,11 +0,0 @@
1
-
2
- import {Id} from "../../types.js"
3
- import {Manifest} from "../manifest.js"
4
-
5
- export async function moveWriteToTrash({kv, writes, trash}: Manifest, id: Id) {
6
- await kv.transaction(() => [
7
- writes.write.del(id),
8
- trash.write.set(id, true),
9
- ])
10
- }
11
-
@@ -1,10 +0,0 @@
1
-
2
- import {got} from "@e280/stz"
3
- import {Hash} from "../../types.js"
4
- import {Manifest} from "../manifest.js"
5
- import {notFound} from "../../utils/not-found.js"
6
-
7
- export async function needInfo({catalog}: Manifest, hash: Hash) {
8
- return got(await catalog.get(hash), notFound(hash))
9
- }
10
-
@@ -1,19 +0,0 @@
1
-
2
- import {getStats} from "./get-stats.js"
3
- import {Manifest} from "../manifest.js"
4
- import {Hash, Info} from "../../types.js"
5
-
6
- export async function scheduleDeletion(manifest: Manifest, hash: Hash, info: Info) {
7
- const {kv, stats, catalog, trash} = manifest
8
-
9
- const s = await getStats(manifest)
10
- s.count -= 1
11
- s.size -= info.size
12
-
13
- await kv.transaction(() => [
14
- catalog.write.del(hash),
15
- trash.write.set(info.id, true),
16
- stats.write.set(s),
17
- ])
18
- }
19
-
@@ -1,26 +0,0 @@
1
-
2
- import {Kv} from "@e280/kv"
3
- import {Info, Stats, WriteRecord} from "../types.js"
4
-
5
- export class Manifest {
6
-
7
- /** statistics about the whole datalake */
8
- stats
9
-
10
- /** associates file hashes with bucket ids */
11
- catalog
12
-
13
- /** temporary record of writes in-progress */
14
- writes
15
-
16
- /** bucket ids that are pending deletion */
17
- trash
18
-
19
- constructor(public kv: Kv) {
20
- this.stats = kv.store<Stats>("stats")
21
- this.catalog = kv.scope<Info>("catalog")
22
- this.writes = kv.scope<WriteRecord>("writes")
23
- this.trash = kv.scope<true>("trash")
24
- }
25
- }
26
-
@@ -1,18 +0,0 @@
1
-
2
- export function streamify(bytes: Uint8Array, chunkSize = 64 * 1024) {
3
- let offset = 0
4
-
5
- return new ReadableStream<Uint8Array>({
6
- pull(controller) {
7
- if (offset >= bytes.length) {
8
- controller.close()
9
- return
10
- }
11
-
12
- const end = Math.min(offset + chunkSize, bytes.length)
13
- controller.enqueue(bytes.subarray(offset, end))
14
- offset = end
15
- },
16
- })
17
- }
18
-
@@ -1,16 +0,0 @@
1
-
2
- import {Bucket} from "../types.js"
3
- import {Manifest} from "../manifest/manifest.js"
4
- import {getExpiredWrites} from "../manifest/fns/get-expired-writes.js"
5
- import {moveWriteToTrash} from "../manifest/fns/move-write-to-trash.js"
6
-
7
- export async function cleanup(bucket: Bucket, manifest: Manifest) {
8
- for await (const id of getExpiredWrites(manifest))
9
- await moveWriteToTrash(manifest, id)
10
-
11
- for await (const id of manifest.trash.keys()) {
12
- await bucket.delete(id)
13
- await manifest.trash.del(id)
14
- }
15
- }
16
-