@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.
- package/README.md +112 -5
- package/package.json +7 -8
- package/s/core/{iceberg-memory.ts → buckets/memory-bucket.ts} +3 -7
- package/s/{browser/iceberg-opfs.ts → core/buckets/opfs-bucket.ts} +5 -11
- package/s/core/consts.ts +8 -0
- package/s/core/index.ts +6 -2
- package/s/core/mammoth.ts +54 -46
- package/s/core/manifest/fns/commit.ts +27 -0
- package/s/core/manifest/fns/get-expired-writes.ts +11 -0
- package/s/core/manifest/fns/get-stats.ts +10 -0
- package/s/core/manifest/fns/move-write-to-trash.ts +11 -0
- package/s/core/manifest/fns/need-info.ts +10 -0
- package/s/core/manifest/fns/schedule-deletion.ts +19 -0
- package/s/core/manifest/manifest.ts +27 -0
- package/s/core/manifest/types.ts +5 -0
- package/s/core/parts/analyze.ts +26 -0
- package/s/core/parts/streamify.ts +18 -0
- package/s/core/types.ts +33 -9
- package/s/core/utils/cleanup.ts +16 -0
- package/s/core/utils/is-expired.ts +9 -0
- package/s/{browser → core}/utils/is-not-found.ts +1 -1
- package/s/core/utils/not-found.ts +7 -0
- package/s/core/utils/save.ts +28 -0
- package/s/node/disk-bucket.ts +55 -0
- package/s/{browser → node}/index.ts +1 -1
- package/s/node/utils/is-not-found.ts +9 -0
- package/s/test.ts +41 -16
- package/x/core/{iceberg-memory.d.ts → buckets/memory-bucket.d.ts} +2 -3
- package/x/core/{iceberg-memory.js → buckets/memory-bucket.js} +3 -6
- package/x/core/buckets/memory-bucket.js.map +1 -0
- package/x/{browser/iceberg-opfs.d.ts → core/buckets/opfs-bucket.d.ts} +2 -3
- package/x/{browser/iceberg-opfs.js → core/buckets/opfs-bucket.js} +5 -10
- package/x/core/buckets/opfs-bucket.js.map +1 -0
- package/x/core/consts.d.ts +4 -0
- package/x/core/consts.js +6 -0
- package/x/core/consts.js.map +1 -0
- package/x/core/index.d.ts +4 -2
- package/x/core/index.js +4 -2
- package/x/core/index.js.map +1 -1
- package/x/core/mammoth.d.ts +7 -5
- package/x/core/mammoth.js +51 -40
- package/x/core/mammoth.js.map +1 -1
- package/x/core/manifest/fns/commit.d.ts +3 -0
- package/x/core/manifest/fns/commit.js +22 -0
- package/x/core/manifest/fns/commit.js.map +1 -0
- package/x/core/manifest/fns/get-expired-writes.d.ts +2 -0
- package/x/core/manifest/fns/get-expired-writes.js +8 -0
- package/x/core/manifest/fns/get-expired-writes.js.map +1 -0
- package/x/core/manifest/fns/get-stats.d.ts +2 -0
- package/x/core/manifest/fns/get-stats.js +5 -0
- package/x/core/manifest/fns/get-stats.js.map +1 -0
- package/x/core/manifest/fns/move-write-to-trash.d.ts +3 -0
- package/x/core/manifest/fns/move-write-to-trash.js +7 -0
- package/x/core/manifest/fns/move-write-to-trash.js.map +1 -0
- package/x/core/manifest/fns/need-info.d.ts +3 -0
- package/x/core/manifest/fns/need-info.js +6 -0
- package/x/core/manifest/fns/need-info.js.map +1 -0
- package/x/core/manifest/fns/schedule-deletion.d.ts +3 -0
- package/x/core/manifest/fns/schedule-deletion.js +13 -0
- package/x/core/manifest/fns/schedule-deletion.js.map +1 -0
- package/x/core/manifest/manifest.d.ts +15 -0
- package/x/core/manifest/manifest.js +19 -0
- package/x/core/manifest/manifest.js.map +1 -0
- package/x/core/manifest/types.d.ts +3 -0
- package/x/core/manifest/types.js +2 -0
- package/x/core/manifest/types.js.map +1 -0
- package/x/core/parts/analyze.d.ts +2 -0
- package/x/core/parts/analyze.js +17 -0
- package/x/core/parts/analyze.js.map +1 -0
- package/x/core/parts/streamify.d.ts +1 -0
- package/x/core/parts/streamify.js +15 -0
- package/x/core/parts/streamify.js.map +1 -0
- package/x/core/types.d.ts +24 -9
- package/x/core/utils/cleanup.d.ts +3 -0
- package/x/core/utils/cleanup.js +11 -0
- package/x/core/utils/cleanup.js.map +1 -0
- package/x/core/utils/is-expired.d.ts +1 -0
- package/x/core/utils/is-expired.js +7 -0
- package/x/core/utils/is-expired.js.map +1 -0
- package/x/core/utils/is-not-found.d.ts +1 -0
- package/x/{browser → core}/utils/is-not-found.js +1 -1
- package/x/core/utils/is-not-found.js.map +1 -0
- package/x/core/utils/not-found.d.ts +2 -0
- package/x/core/utils/not-found.js +4 -0
- package/x/core/utils/not-found.js.map +1 -0
- package/x/core/utils/save.d.ts +2 -0
- package/x/core/utils/save.js +16 -0
- package/x/core/utils/save.js.map +1 -0
- package/x/node/disk-bucket.d.ts +9 -0
- package/x/node/disk-bucket.js +43 -0
- package/x/node/disk-bucket.js.map +1 -0
- package/x/node/index.d.ts +2 -0
- package/x/node/index.js +3 -0
- package/x/node/index.js.map +1 -0
- package/x/node/utils/is-not-found.d.ts +1 -0
- package/x/node/utils/is-not-found.js +6 -0
- package/x/node/utils/is-not-found.js.map +1 -0
- package/x/test.js +39 -16
- package/x/test.js.map +1 -1
- package/s/browser/example.ts +0 -26
- package/s/core/hash-stream.ts +0 -19
- package/x/browser/example.d.ts +0 -1
- package/x/browser/example.js +0 -20
- package/x/browser/example.js.map +0 -1
- package/x/browser/iceberg-opfs.js.map +0 -1
- package/x/browser/index.d.ts +0 -2
- package/x/browser/index.js +0 -3
- package/x/browser/index.js.map +0 -1
- package/x/browser/utils/is-not-found.d.ts +0 -1
- package/x/browser/utils/is-not-found.js.map +0 -1
- package/x/core/hash-stream.d.ts +0 -1
- package/x/core/hash-stream.js +0 -14
- package/x/core/hash-stream.js.map +0 -1
- 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
|
+
|
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 {
|
|
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
|
|
15
|
-
const
|
|
16
|
-
const mammoth = new Mammoth(
|
|
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
|
|
44
|
+
const entries = await collect(mammoth.entries())
|
|
34
45
|
expect(hashA).is(hashB)
|
|
35
|
-
expect(
|
|
36
|
-
expect(
|
|
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.
|
|
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.
|
|
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
|
|
64
|
-
|
|
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.
|
|
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
|
|
84
|
-
expect(
|
|
85
|
-
expect(
|
|
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 {
|
|
2
|
-
export declare class
|
|
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 "
|
|
3
|
-
export class
|
|
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=
|
|
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 {
|
|
2
|
-
export declare class
|
|
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 {
|
|
2
|
-
export class
|
|
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 (
|
|
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 (!
|
|
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=
|
|
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"}
|
package/x/core/consts.js
ADDED
|
@@ -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 "./
|
|
2
|
-
export * from "./
|
|
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 "./
|
|
2
|
-
export * from "./
|
|
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
|
package/x/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/core/index.ts"],"names":[],"mappings":"AACA,cAAc,
|
|
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"}
|
package/x/core/mammoth.d.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Kv } from "@e280/kv";
|
|
2
|
-
import {
|
|
3
|
-
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
#
|
|
6
|
-
#
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.#
|
|
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.#
|
|
27
|
+
return this.#manifest.catalog.has(hash);
|
|
28
|
+
}
|
|
29
|
+
async info(hash) {
|
|
30
|
+
return needInfo(this.#manifest, hash);
|
|
13
31
|
}
|
|
14
|
-
async
|
|
15
|
-
|
|
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
|
|
20
|
-
return this.#
|
|
36
|
+
const { id } = await this.info(hash);
|
|
37
|
+
return this.#bucket.read(id);
|
|
21
38
|
}
|
|
22
39
|
async delete(hash) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
await
|
|
37
|
-
|
|
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
|
package/x/core/mammoth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mammoth.js","sourceRoot":"","sources":["../../s/core/mammoth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mammoth.js","sourceRoot":"","sources":["../../s/core/mammoth.ts"],"names":[],"mappings":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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,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"}
|