@e280/mammoth 0.1.0-2 → 0.1.0-20

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 (114) hide show
  1. package/README.md +112 -5
  2. package/package.json +7 -8
  3. package/s/core/{iceberg-memory.ts → buckets/memory-bucket.ts} +3 -7
  4. package/s/{browser/iceberg-opfs.ts → core/buckets/opfs-bucket.ts} +5 -11
  5. package/s/core/consts.ts +8 -0
  6. package/s/core/index.ts +6 -2
  7. package/s/core/mammoth.ts +54 -46
  8. package/s/core/manifest/fns/commit.ts +27 -0
  9. package/s/core/manifest/fns/get-expired-writes.ts +11 -0
  10. package/s/core/manifest/fns/get-stats.ts +10 -0
  11. package/s/core/manifest/fns/move-write-to-trash.ts +11 -0
  12. package/s/core/manifest/fns/need-info.ts +10 -0
  13. package/s/core/manifest/fns/schedule-deletion.ts +19 -0
  14. package/s/core/manifest/manifest.ts +27 -0
  15. package/s/core/manifest/types.ts +5 -0
  16. package/s/core/parts/analyze.ts +26 -0
  17. package/s/core/parts/streamify.ts +18 -0
  18. package/s/core/types.ts +33 -9
  19. package/s/core/utils/cleanup.ts +16 -0
  20. package/s/core/utils/is-expired.ts +9 -0
  21. package/s/{browser → core}/utils/is-not-found.ts +1 -1
  22. package/s/core/utils/not-found.ts +7 -0
  23. package/s/core/utils/save.ts +28 -0
  24. package/s/node/disk-bucket.ts +55 -0
  25. package/s/{browser → node}/index.ts +1 -1
  26. package/s/node/utils/is-not-found.ts +9 -0
  27. package/s/test.ts +41 -16
  28. package/x/core/{iceberg-memory.d.ts → buckets/memory-bucket.d.ts} +2 -3
  29. package/x/core/{iceberg-memory.js → buckets/memory-bucket.js} +3 -6
  30. package/x/core/buckets/memory-bucket.js.map +1 -0
  31. package/x/{browser/iceberg-opfs.d.ts → core/buckets/opfs-bucket.d.ts} +2 -3
  32. package/x/{browser/iceberg-opfs.js → core/buckets/opfs-bucket.js} +5 -10
  33. package/x/core/buckets/opfs-bucket.js.map +1 -0
  34. package/x/core/consts.d.ts +4 -0
  35. package/x/core/consts.js +6 -0
  36. package/x/core/consts.js.map +1 -0
  37. package/x/core/index.d.ts +4 -2
  38. package/x/core/index.js +4 -2
  39. package/x/core/index.js.map +1 -1
  40. package/x/core/mammoth.d.ts +7 -5
  41. package/x/core/mammoth.js +51 -40
  42. package/x/core/mammoth.js.map +1 -1
  43. package/x/core/manifest/fns/commit.d.ts +3 -0
  44. package/x/core/manifest/fns/commit.js +22 -0
  45. package/x/core/manifest/fns/commit.js.map +1 -0
  46. package/x/core/manifest/fns/get-expired-writes.d.ts +2 -0
  47. package/x/core/manifest/fns/get-expired-writes.js +8 -0
  48. package/x/core/manifest/fns/get-expired-writes.js.map +1 -0
  49. package/x/core/manifest/fns/get-stats.d.ts +2 -0
  50. package/x/core/manifest/fns/get-stats.js +5 -0
  51. package/x/core/manifest/fns/get-stats.js.map +1 -0
  52. package/x/core/manifest/fns/move-write-to-trash.d.ts +3 -0
  53. package/x/core/manifest/fns/move-write-to-trash.js +7 -0
  54. package/x/core/manifest/fns/move-write-to-trash.js.map +1 -0
  55. package/x/core/manifest/fns/need-info.d.ts +3 -0
  56. package/x/core/manifest/fns/need-info.js +6 -0
  57. package/x/core/manifest/fns/need-info.js.map +1 -0
  58. package/x/core/manifest/fns/schedule-deletion.d.ts +3 -0
  59. package/x/core/manifest/fns/schedule-deletion.js +13 -0
  60. package/x/core/manifest/fns/schedule-deletion.js.map +1 -0
  61. package/x/core/manifest/manifest.d.ts +15 -0
  62. package/x/core/manifest/manifest.js +19 -0
  63. package/x/core/manifest/manifest.js.map +1 -0
  64. package/x/core/manifest/types.d.ts +3 -0
  65. package/x/core/manifest/types.js +2 -0
  66. package/x/core/manifest/types.js.map +1 -0
  67. package/x/core/parts/analyze.d.ts +2 -0
  68. package/x/core/parts/analyze.js +17 -0
  69. package/x/core/parts/analyze.js.map +1 -0
  70. package/x/core/parts/streamify.d.ts +1 -0
  71. package/x/core/parts/streamify.js +15 -0
  72. package/x/core/parts/streamify.js.map +1 -0
  73. package/x/core/types.d.ts +24 -9
  74. package/x/core/utils/cleanup.d.ts +3 -0
  75. package/x/core/utils/cleanup.js +11 -0
  76. package/x/core/utils/cleanup.js.map +1 -0
  77. package/x/core/utils/is-expired.d.ts +1 -0
  78. package/x/core/utils/is-expired.js +7 -0
  79. package/x/core/utils/is-expired.js.map +1 -0
  80. package/x/core/utils/is-not-found.d.ts +1 -0
  81. package/x/{browser → core}/utils/is-not-found.js +1 -1
  82. package/x/core/utils/is-not-found.js.map +1 -0
  83. package/x/core/utils/not-found.d.ts +2 -0
  84. package/x/core/utils/not-found.js +4 -0
  85. package/x/core/utils/not-found.js.map +1 -0
  86. package/x/core/utils/save.d.ts +2 -0
  87. package/x/core/utils/save.js +16 -0
  88. package/x/core/utils/save.js.map +1 -0
  89. package/x/node/disk-bucket.d.ts +9 -0
  90. package/x/node/disk-bucket.js +43 -0
  91. package/x/node/disk-bucket.js.map +1 -0
  92. package/x/node/index.d.ts +2 -0
  93. package/x/node/index.js +3 -0
  94. package/x/node/index.js.map +1 -0
  95. package/x/node/utils/is-not-found.d.ts +1 -0
  96. package/x/node/utils/is-not-found.js +6 -0
  97. package/x/node/utils/is-not-found.js.map +1 -0
  98. package/x/test.js +39 -16
  99. package/x/test.js.map +1 -1
  100. package/s/browser/example.ts +0 -26
  101. package/s/core/hash-stream.ts +0 -19
  102. package/x/browser/example.d.ts +0 -1
  103. package/x/browser/example.js +0 -20
  104. package/x/browser/example.js.map +0 -1
  105. package/x/browser/iceberg-opfs.js.map +0 -1
  106. package/x/browser/index.d.ts +0 -2
  107. package/x/browser/index.js +0 -3
  108. package/x/browser/index.js.map +0 -1
  109. package/x/browser/utils/is-not-found.d.ts +0 -1
  110. package/x/browser/utils/is-not-found.js.map +0 -1
  111. package/x/core/hash-stream.d.ts +0 -1
  112. package/x/core/hash-stream.js +0 -14
  113. package/x/core/hash-stream.js.map +0 -1
  114. package/x/core/iceberg-memory.js.map +0 -1
@@ -0,0 +1,28 @@
1
+
2
+ import {hex} from "@e280/stz"
3
+ import {blake3} from "@awasm/noble"
4
+ import {Analysis, Bucket, Id} from "../types.js"
5
+
6
+ export async function save(
7
+ bucket: Bucket,
8
+ id: Id,
9
+ readable: ReadableStream<Uint8Array>,
10
+ ): Promise<Analysis> {
11
+
12
+ let size = 0
13
+ const hasher = blake3.create()
14
+
15
+ await bucket.write(id, readable.pipeThrough(
16
+ new TransformStream({
17
+ transform(chunk, controller) {
18
+ hasher.update(chunk)
19
+ size += chunk.byteLength
20
+ controller.enqueue(chunk)
21
+ },
22
+ })
23
+ ))
24
+
25
+ const hash = hex.fromBytes(hasher.digest())
26
+ return {hash, size}
27
+ }
28
+
@@ -0,0 +1,55 @@
1
+
2
+ import {join} from "node:path"
3
+ import {Readable} from "node:stream"
4
+ import {pipeline} from "node:stream/promises"
5
+ import {mkdir, stat, unlink} from "node:fs/promises"
6
+ import {createWriteStream, openAsBlob} from "node:fs"
7
+
8
+ import {Bucket, Id} from "../core/types.js"
9
+ import {isNotFound} from "./utils/is-not-found.js"
10
+
11
+ export class DiskBucket implements Bucket {
12
+ #directory
13
+
14
+ constructor(directory: string) {
15
+ this.#directory = directory
16
+ }
17
+
18
+ async has(id: Id) {
19
+ try {
20
+ await stat(this.#path(id))
21
+ return true
22
+ }
23
+ catch (error) {
24
+ if (isNotFound(error)) return false
25
+ throw error
26
+ }
27
+ }
28
+
29
+ async delete(id: Id) {
30
+ try {
31
+ await unlink(this.#path(id))
32
+ }
33
+ catch (error) {
34
+ if (!isNotFound(error))
35
+ throw error
36
+ }
37
+ }
38
+
39
+ async read(id: Id) {
40
+ return openAsBlob(this.#path(id))
41
+ }
42
+
43
+ async write(id: Id, readable: ReadableStream<Uint8Array>) {
44
+ await mkdir(this.#directory, {recursive: true})
45
+ await pipeline(
46
+ Readable.fromWeb(readable as any),
47
+ createWriteStream(this.#path(id)),
48
+ )
49
+ }
50
+
51
+ #path(id: Id) {
52
+ return join(this.#directory, id)
53
+ }
54
+ }
55
+
@@ -1,4 +1,4 @@
1
1
 
2
2
  export * from "../core/index.js"
3
- export * from "./iceberg-opfs.js"
3
+ export * from "./disk-bucket.js"
4
4
 
@@ -0,0 +1,9 @@
1
+
2
+ export function isNotFound(error: unknown): error is NodeJS.ErrnoException {
3
+ return (
4
+ error instanceof Error
5
+ && "code" in error
6
+ && error.code === "ENOENT"
7
+ )
8
+ }
9
+
package/s/test.ts CHANGED
@@ -1,24 +1,35 @@
1
1
 
2
2
  import {Kv} from "@e280/kv"
3
+ import {rm} from "fs/promises"
3
4
  import {bytes, collect} from "@e280/stz"
4
5
  import {science, test, expect} from "@e280/science"
5
6
 
6
7
  import {Mammoth} from "./core/mammoth.js"
8
+ import {DiskBucket} from "./node/disk-bucket.js"
7
9
  import {randomId} from "./core/utils/random-id.js"
8
- import {IcebergMemory} from "./core/iceberg-memory.js"
10
+ import {MemoryBucket} from "./core/buckets/memory-bucket.js"
9
11
 
10
12
  const blob = () => new Blob([new Uint8Array([0xDE, 0xAD, 0xBE, 0xEF])])
11
13
  const quickstream = (b: number[]) => new Blob([new Uint8Array(b)]).stream()
12
14
 
13
15
  function setup() {
14
- const index = new Kv<string>()
15
- const iceberg = new IcebergMemory()
16
- const mammoth = new Mammoth(index, iceberg)
16
+ const kv = new Kv()
17
+ const bucket = new MemoryBucket()
18
+ const mammoth = new Mammoth(bucket, kv)
17
19
  return {mammoth}
18
20
  }
19
21
 
20
22
  await science.run({
21
- "mammoth": {
23
+ "mammoth node": test(async() => {
24
+ const dataDir = "data"
25
+ await rm(dataDir, {recursive: true, force: true})
26
+ const mammoth = new Mammoth(new DiskBucket(dataDir), new Kv())
27
+ const hash = await mammoth.write(blob().stream())
28
+ const second = await mammoth.read(hash)
29
+ expect(bytes.eq(await second.bytes(), await blob().bytes()))
30
+ }),
31
+
32
+ "mammoth memory": {
22
33
  ".write and .read": test(async() => {
23
34
  const {mammoth} = setup()
24
35
  const hash = await mammoth.write(blob().stream())
@@ -30,16 +41,16 @@ await science.run({
30
41
  const {mammoth} = setup()
31
42
  const hashA = await mammoth.write(blob().stream())
32
43
  const hashB = await mammoth.write(blob().stream())
33
- const keys = await collect(mammoth.keys())
44
+ const entries = await collect(mammoth.entries())
34
45
  expect(hashA).is(hashB)
35
- expect(keys.length).is(1)
36
- expect(keys[0]).is(hashA)
46
+ expect(entries.length).is(1)
47
+ expect(entries[0][0]).is(hashA)
37
48
  }),
38
49
 
39
50
  ".write empty file": test(async() => {
40
51
  const {mammoth} = setup()
41
52
  const hash = await mammoth.write(new Blob().stream())
42
- expect(await mammoth.size(hash)).is(0)
53
+ expect((await mammoth.info(hash)).size).is(0)
43
54
  expect((await mammoth.read(hash)).size).is(0)
44
55
  }),
45
56
 
@@ -48,7 +59,20 @@ await science.run({
48
59
  const hashA = await mammoth.write(quickstream([0xC0, 0xFF, 0xEE]))
49
60
  const hashB = await mammoth.write(quickstream([0xB0, 0x0B, 0x1E, 0x5]))
50
61
  expect(hashA).not.is(hashB)
51
- expect((await collect(mammoth.keys())).length).is(2)
62
+ expect((await collect(mammoth.entries())).length).is(2)
63
+ }),
64
+
65
+ ".stats": test(async() => {
66
+ const {mammoth} = setup()
67
+ expect(await mammoth.stats()).deep({count: 0, size: 0})
68
+ const hashA = await mammoth.write(quickstream([0xC0, 0xFF, 0xEE]))
69
+ expect(await mammoth.stats()).deep({count: 1, size: 3})
70
+ const hashB = await mammoth.write(quickstream([0xB0, 0x0B, 0x1E, 0x5]))
71
+ expect(await mammoth.stats()).deep({count: 2, size: 7})
72
+ await mammoth.delete(hashA)
73
+ expect(await mammoth.stats()).deep({count: 1, size: 4})
74
+ await mammoth.delete(hashB)
75
+ expect(await mammoth.stats()).deep({count: 0, size: 0})
52
76
  }),
53
77
 
54
78
  ".has": test(async() => {
@@ -60,8 +84,9 @@ await science.run({
60
84
 
61
85
  ".size": test(async() => {
62
86
  const {mammoth} = setup()
63
- const hash = await mammoth.write(blob().stream())
64
- expect(await mammoth.size(hash)).is(4)
87
+ const b = blob()
88
+ const hash = await mammoth.write(b.stream())
89
+ expect((await mammoth.info(hash)).size).is(b.size)
65
90
  }),
66
91
 
67
92
  ".delete": test(async() => {
@@ -69,7 +94,7 @@ await science.run({
69
94
  const hash = await mammoth.write(blob().stream())
70
95
  await mammoth.delete(hash)
71
96
  expect(await mammoth.has(hash)).is(false)
72
- expect(await collect(mammoth.keys())).deep([])
97
+ expect((await collect(mammoth.entries())).length).is(0)
73
98
  }),
74
99
 
75
100
  ".delete idempotent": test(async() => {
@@ -80,9 +105,9 @@ await science.run({
80
105
  ".keys": test(async() => {
81
106
  const {mammoth} = setup()
82
107
  const hash = await mammoth.write(blob().stream())
83
- const keys = await collect(mammoth.keys())
84
- expect(keys.length).is(1)
85
- expect(keys[0]).is(hash)
108
+ const entries = await collect(mammoth.entries())
109
+ expect(entries.length).is(1)
110
+ expect(entries[0][0]).is(hash)
86
111
  }),
87
112
  },
88
113
  })
@@ -1,8 +1,7 @@
1
- import { Iceberg, Id } from "./types.js";
2
- export declare class IcebergMemory implements Iceberg {
1
+ import { Bucket, Id } from "../types.js";
2
+ export declare class MemoryBucket implements Bucket {
3
3
  #private;
4
4
  has(id: Id): Promise<boolean>;
5
- size(id: Id): Promise<number>;
6
5
  delete(id: Id): Promise<void>;
7
6
  read(id: Id): Promise<Blob>;
8
7
  write(id: Id, readable: ReadableStream<Uint8Array>): Promise<void>;
@@ -1,13 +1,10 @@
1
1
  import { bytes, got, nap } from "@e280/stz";
2
- import { relaxer } from "./utils/relaxer.js";
3
- export class IcebergMemory {
2
+ import { relaxer } from "../utils/relaxer.js";
3
+ export class MemoryBucket {
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
- }
11
8
  async delete(id) {
12
9
  this.#map.delete(id);
13
10
  }
@@ -26,4 +23,4 @@ export class IcebergMemory {
26
23
  this.#map.set(id, payload);
27
24
  }
28
25
  }
29
- //# sourceMappingURL=iceberg-memory.js.map
26
+ //# sourceMappingURL=memory-bucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-bucket.js","sourceRoot":"","sources":["../../../s/core/buckets/memory-bucket.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAC,MAAM,WAAW,CAAA;AAEzC,OAAO,EAAC,OAAO,EAAC,MAAM,qBAAqB,CAAA;AAE3C,MAAM,OAAO,YAAY;IACxB,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,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"}
@@ -1,9 +1,8 @@
1
- import { Iceberg, Id } from "../core/types.js";
2
- export declare class IcebergOpfs implements Iceberg {
1
+ import { Bucket, Id } from "../types.js";
2
+ export declare class OpfsBucket implements Bucket {
3
3
  #private;
4
4
  constructor(directory: FileSystemDirectoryHandle);
5
5
  has(id: Id): Promise<boolean>;
6
- size(id: Id): Promise<number>;
7
6
  delete(id: Id): Promise<void>;
8
7
  read(id: Id): Promise<File>;
9
8
  write(id: Id, readable: ReadableStream<Uint8Array>): Promise<void>;
@@ -1,5 +1,5 @@
1
- import { isNotFound } from "./utils/is-not-found.js";
2
- export class IcebergOpfs {
1
+ import { isNotFoundErr } from "../utils/is-not-found.js";
2
+ export class OpfsBucket {
3
3
  #directory;
4
4
  constructor(directory) {
5
5
  this.#directory = directory;
@@ -10,22 +10,17 @@ export class IcebergOpfs {
10
10
  return true;
11
11
  }
12
12
  catch (error) {
13
- if (isNotFound(error))
13
+ if (isNotFoundErr(error))
14
14
  return false;
15
15
  throw error;
16
16
  }
17
17
  }
18
- async size(id) {
19
- const handle = await this.#directory.getFileHandle(id);
20
- const file = await handle.getFile();
21
- return file.size;
22
- }
23
18
  async delete(id) {
24
19
  try {
25
20
  await this.#directory.removeEntry(id);
26
21
  }
27
22
  catch (error) {
28
- if (!isNotFound(error))
23
+ if (!isNotFoundErr(error))
29
24
  throw error;
30
25
  }
31
26
  }
@@ -39,4 +34,4 @@ export class IcebergOpfs {
39
34
  await readable.pipeTo(writable);
40
35
  }
41
36
  }
42
- //# sourceMappingURL=iceberg-opfs.js.map
37
+ //# sourceMappingURL=opfs-bucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opfs-bucket.js","sourceRoot":"","sources":["../../../s/core/buckets/opfs-bucket.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,aAAa,EAAC,MAAM,0BAA0B,CAAA;AAEtD,MAAM,OAAO,UAAU;IACtB,UAAU,CAAA;IAEV,YAAY,SAAoC;QAC/C,IAAI,CAAC,UAAU,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAM;QACf,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;YACvC,OAAO,IAAI,CAAA;QACZ,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,IAAI,aAAa,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtC,MAAM,KAAK,CAAA;QACZ,CAAC;IACF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAM;QAClB,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;gBACxB,MAAM,KAAK,CAAA;QACb,CAAC;IACF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAM;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC,CAAA;QACtD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAM,EAAE,QAAoC;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,EAAE,EAAC,MAAM,EAAE,IAAI,EAAC,CAAC,CAAA;QACtE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAA;QAC9C,MAAM,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAChC,CAAC;CACD"}
@@ -0,0 +1,4 @@
1
+ export declare const consts: {
2
+ max_jobs: number;
3
+ expiry_time: number;
4
+ };
@@ -0,0 +1,6 @@
1
+ import { time } from "@e280/stz";
2
+ export const consts = {
3
+ max_jobs: 64,
4
+ expiry_time: time.days(7),
5
+ };
6
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../s/core/consts.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAE9B,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,QAAQ,EAAE,EAAE;IACZ,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;CACzB,CAAA"}
package/x/core/index.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- export * from "./hash-stream.js";
2
- export * from "./iceberg-memory.js";
1
+ export * from "./buckets/memory-bucket.js";
2
+ export * from "./buckets/opfs-bucket.js";
3
+ export * from "./parts/analyze.js";
4
+ export * from "./parts/streamify.js";
3
5
  export * from "./mammoth.js";
4
6
  export * from "./types.js";
package/x/core/index.js CHANGED
@@ -1,5 +1,7 @@
1
- export * from "./hash-stream.js";
2
- export * from "./iceberg-memory.js";
1
+ export * from "./buckets/memory-bucket.js";
2
+ export * from "./buckets/opfs-bucket.js";
3
+ export * from "./parts/analyze.js";
4
+ export * from "./parts/streamify.js";
3
5
  export * from "./mammoth.js";
4
6
  export * from "./types.js";
5
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/core/index.ts"],"names":[],"mappings":"AACA,cAAc,4BAA4B,CAAA;AAC1C,cAAc,0BAA0B,CAAA;AAExC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA"}
@@ -1,12 +1,14 @@
1
1
  import { Kv } from "@e280/kv";
2
- import { Glacier, Hash, Iceberg } from "./types.js";
3
- export declare class Mammoth implements Glacier {
2
+ import { Hash, Bucket } from "./types.js";
3
+ /** file storage datalake, content-addressed with blake3 hashes. */
4
+ export declare class Mammoth {
4
5
  #private;
5
- constructor(index: Kv<string>, iceberg: Iceberg);
6
+ constructor(bucket?: Bucket, kv?: Kv<unknown>);
7
+ entries(): AsyncGenerator<import("@e280/kv").Pair<import("./types.js").Info>, void, unknown>;
6
8
  has(hash: Hash): Promise<boolean>;
7
- size(hash: Hash): Promise<number>;
9
+ info(hash: Hash): Promise<import("./types.js").Info>;
10
+ stats(): Promise<import("./types.js").Stats>;
8
11
  read(hash: Hash): Promise<Blob>;
9
12
  delete(hash: Hash): Promise<void>;
10
13
  write(readable: ReadableStream<Uint8Array>): Promise<Hash>;
11
- keys(): AsyncGenerator<string, void, unknown>;
12
14
  }
package/x/core/mammoth.js CHANGED
@@ -1,56 +1,67 @@
1
- import { got, hex } from "@e280/stz";
2
- import { blake3 } from "@noble/hashes/blake3.js";
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";
3
6
  import { randomId } from "./utils/random-id.js";
7
+ import { Manifest } from "./manifest/manifest.js";
8
+ import { commit } from "./manifest/fns/commit.js";
9
+ import { needInfo } from "./manifest/fns/need-info.js";
10
+ import { getStats } from "./manifest/fns/get-stats.js";
11
+ import { MemoryBucket } from "./buckets/memory-bucket.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. */
4
15
  export class Mammoth {
5
- #index;
6
- #iceberg;
7
- constructor(index, iceberg) {
8
- this.#index = index;
9
- this.#iceberg = iceberg;
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();
10
25
  }
11
26
  async has(hash) {
12
- return this.#index.has(hash);
27
+ return this.#manifest.catalog.has(hash);
28
+ }
29
+ async info(hash) {
30
+ return needInfo(this.#manifest, hash);
13
31
  }
14
- async size(hash) {
15
- const id = await this.#needFileId(hash);
16
- return this.#iceberg.size(id);
32
+ async stats() {
33
+ return getStats(this.#manifest);
17
34
  }
18
35
  async read(hash) {
19
- const id = await this.#needFileId(hash);
20
- return this.#iceberg.read(id);
36
+ const { id } = await this.info(hash);
37
+ return this.#bucket.read(id);
21
38
  }
22
39
  async delete(hash) {
23
- const id = await this.#getFileId(hash);
24
- if (id) {
25
- await this.#index.del(hash);
26
- await this.#iceberg.delete(id);
27
- }
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();
28
46
  }
29
47
  async write(readable) {
30
48
  const id = randomId();
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);
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));
38
63
  }
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();
54
64
  }
65
+ #cleanup = queue(() => cleanup(this.#bucket, this.#manifest), consts.max_jobs);
55
66
  }
56
67
  //# sourceMappingURL=mammoth.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"mammoth.js","sourceRoot":"","sources":["../../s/core/mammoth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Manifest } from "../manifest.js";
2
+ import { Hash, Info } from "../../types.js";
3
+ export declare function commit(manifest: Manifest, hash: Hash, info: Info): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { getStats } from "./get-stats.js";
2
+ export async function commit(manifest, hash, info) {
3
+ const { kv, stats, catalog, writes, trash } = manifest;
4
+ const isNewFile = !await catalog.has(hash);
5
+ if (isNewFile) {
6
+ const s = await getStats(manifest);
7
+ s.count += 1;
8
+ s.size += info.size;
9
+ await kv.commit([
10
+ writes.op.delete(info.id),
11
+ catalog.op.set(hash, info),
12
+ stats.op.set(s),
13
+ ]);
14
+ }
15
+ else {
16
+ await kv.commit([
17
+ writes.op.delete(info.id),
18
+ trash.op.set(info.id, true),
19
+ ]);
20
+ }
21
+ }
22
+ //# sourceMappingURL=commit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/commit.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAkB,EAAE,IAAU,EAAE,IAAU;IACtE,MAAM,EAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAC,GAAG,QAAQ,CAAA;IACpD,MAAM,SAAS,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAE1C,IAAI,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAClC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;QACZ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAA;QACnB,MAAM,EAAE,CAAC,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SACf,CAAC,CAAA;IACH,CAAC;SACI,CAAC;QACL,MAAM,EAAE,CAAC,MAAM,CAAC;YACf,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;SAC3B,CAAC,CAAA;IACH,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Manifest } from "../manifest.js";
2
+ export declare function getExpiredWrites({ writes }: Manifest): AsyncGenerator<string, void, unknown>;
@@ -0,0 +1,8 @@
1
+ import { isExpired } from "../../utils/is-expired.js";
2
+ export async function* getExpiredWrites({ writes }) {
3
+ for await (const [id, w] of writes.entries()) {
4
+ if (isExpired(w.created))
5
+ yield id;
6
+ }
7
+ }
8
+ //# sourceMappingURL=get-expired-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-expired-writes.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/get-expired-writes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,SAAS,EAAC,MAAM,2BAA2B,CAAA;AAEnD,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,gBAAgB,CAAC,EAAC,MAAM,EAAW;IACzD,IAAI,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;YACvB,MAAM,EAAE,CAAA;IACV,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Manifest } from "../manifest.js";
2
+ export declare function getStats({ stats }: Manifest): Promise<import("../../types.js").Stats>;
@@ -0,0 +1,5 @@
1
+ export async function getStats({ stats }) {
2
+ return structuredClone((await stats.get())
3
+ ?? { count: 0, size: 0 });
4
+ }
5
+ //# sourceMappingURL=get-stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-stats.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/get-stats.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAC,KAAK,EAAW;IAC/C,OAAO,eAAe,CACrB,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;WACf,EAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAC,CACvB,CAAA;AACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Id } from "../../types.js";
2
+ import { Manifest } from "../manifest.js";
3
+ export declare function moveWriteToTrash({ kv, writes, trash }: Manifest, id: Id): Promise<void>;
@@ -0,0 +1,7 @@
1
+ export async function moveWriteToTrash({ kv, writes, trash }, id) {
2
+ await kv.commit([
3
+ writes.op.delete(id),
4
+ trash.op.set(id, true),
5
+ ]);
6
+ }
7
+ //# sourceMappingURL=move-write-to-trash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-write-to-trash.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/move-write-to-trash.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAW,EAAE,EAAM;IAC3E,MAAM,EAAE,CAAC,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;KACtB,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Hash } from "../../types.js";
2
+ import { Manifest } from "../manifest.js";
3
+ export declare function needInfo({ catalog }: Manifest, hash: Hash): Promise<import("../../types.js").Info>;
@@ -0,0 +1,6 @@
1
+ import { got } from "@e280/stz";
2
+ import { notFoundMessage } from "../../utils/not-found.js";
3
+ export async function needInfo({ catalog }, hash) {
4
+ return got(await catalog.get(hash), notFoundMessage(hash));
5
+ }
6
+ //# sourceMappingURL=need-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"need-info.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/need-info.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAG7B,OAAO,EAAC,eAAe,EAAC,MAAM,0BAA0B,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,EAAC,OAAO,EAAW,EAAE,IAAU;IAC7D,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Manifest } from "../manifest.js";
2
+ import { Hash, Info } from "../../types.js";
3
+ export declare function scheduleDeletion(manifest: Manifest, hash: Hash, info: Info): Promise<void>;
@@ -0,0 +1,13 @@
1
+ import { getStats } from "./get-stats.js";
2
+ export async function scheduleDeletion(manifest, hash, info) {
3
+ const { kv, stats, catalog, trash } = manifest;
4
+ const s = await getStats(manifest);
5
+ s.count -= 1;
6
+ s.size -= info.size;
7
+ await kv.commit([
8
+ catalog.op.delete(hash),
9
+ trash.op.set(info.id, true),
10
+ stats.op.set(s),
11
+ ]);
12
+ }
13
+ //# sourceMappingURL=schedule-deletion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule-deletion.js","sourceRoot":"","sources":["../../../../s/core/manifest/fns/schedule-deletion.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,gBAAgB,CAAA;AAIvC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAkB,EAAE,IAAU,EAAE,IAAU;IAChF,MAAM,EAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAC,GAAG,QAAQ,CAAA;IAE5C,MAAM,CAAC,GAAG,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAA;IAClC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAA;IACZ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAA;IAEnB,MAAM,EAAE,CAAC,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QACvB,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;QAC3B,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KACf,CAAC,CAAA;AACH,CAAC"}