@avalanche-io/c4-node 1.0.10
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/dist/packages/core/src/base58.d.ts +5 -0
- package/dist/packages/core/src/base58.d.ts.map +1 -0
- package/dist/packages/core/src/base58.js +42 -0
- package/dist/packages/core/src/base58.js.map +1 -0
- package/dist/packages/core/src/browser/filesystem.d.ts +34 -0
- package/dist/packages/core/src/browser/filesystem.d.ts.map +1 -0
- package/dist/packages/core/src/browser/filesystem.js +169 -0
- package/dist/packages/core/src/browser/filesystem.js.map +1 -0
- package/dist/packages/core/src/browser/index.d.ts +4 -0
- package/dist/packages/core/src/browser/index.d.ts.map +1 -0
- package/dist/packages/core/src/browser/index.js +6 -0
- package/dist/packages/core/src/browser/index.js.map +1 -0
- package/dist/packages/core/src/browser/store.d.ts +28 -0
- package/dist/packages/core/src/browser/store.d.ts.map +1 -0
- package/dist/packages/core/src/browser/store.js +142 -0
- package/dist/packages/core/src/browser/store.js.map +1 -0
- package/dist/packages/core/src/browser/worker.d.ts +34 -0
- package/dist/packages/core/src/browser/worker.d.ts.map +1 -0
- package/dist/packages/core/src/browser/worker.js +96 -0
- package/dist/packages/core/src/browser/worker.js.map +1 -0
- package/dist/packages/core/src/decoder.d.ts +23 -0
- package/dist/packages/core/src/decoder.d.ts.map +1 -0
- package/dist/packages/core/src/decoder.js +431 -0
- package/dist/packages/core/src/decoder.js.map +1 -0
- package/dist/packages/core/src/diff.d.ts +48 -0
- package/dist/packages/core/src/diff.d.ts.map +1 -0
- package/dist/packages/core/src/diff.js +169 -0
- package/dist/packages/core/src/diff.js.map +1 -0
- package/dist/packages/core/src/encoder.d.ts +13 -0
- package/dist/packages/core/src/encoder.d.ts.map +1 -0
- package/dist/packages/core/src/encoder.js +125 -0
- package/dist/packages/core/src/encoder.js.map +1 -0
- package/dist/packages/core/src/entry.d.ts +59 -0
- package/dist/packages/core/src/entry.d.ts.map +1 -0
- package/dist/packages/core/src/entry.js +266 -0
- package/dist/packages/core/src/entry.js.map +1 -0
- package/dist/packages/core/src/errors.d.ts +29 -0
- package/dist/packages/core/src/errors.d.ts.map +1 -0
- package/dist/packages/core/src/errors.js +56 -0
- package/dist/packages/core/src/errors.js.map +1 -0
- package/dist/packages/core/src/filesystem.d.ts +68 -0
- package/dist/packages/core/src/filesystem.d.ts.map +1 -0
- package/dist/packages/core/src/filesystem.js +62 -0
- package/dist/packages/core/src/filesystem.js.map +1 -0
- package/dist/packages/core/src/id.d.ts +33 -0
- package/dist/packages/core/src/id.d.ts.map +1 -0
- package/dist/packages/core/src/id.js +126 -0
- package/dist/packages/core/src/id.js.map +1 -0
- package/dist/packages/core/src/identify-content.d.ts +17 -0
- package/dist/packages/core/src/identify-content.d.ts.map +1 -0
- package/dist/packages/core/src/identify-content.js +70 -0
- package/dist/packages/core/src/identify-content.js.map +1 -0
- package/dist/packages/core/src/index.d.ts +23 -0
- package/dist/packages/core/src/index.d.ts.map +1 -0
- package/dist/packages/core/src/index.js +41 -0
- package/dist/packages/core/src/index.js.map +1 -0
- package/dist/packages/core/src/manifest.d.ts +68 -0
- package/dist/packages/core/src/manifest.d.ts.map +1 -0
- package/dist/packages/core/src/manifest.js +463 -0
- package/dist/packages/core/src/manifest.js.map +1 -0
- package/dist/packages/core/src/memory-fs.d.ts +33 -0
- package/dist/packages/core/src/memory-fs.d.ts.map +1 -0
- package/dist/packages/core/src/memory-fs.js +187 -0
- package/dist/packages/core/src/memory-fs.js.map +1 -0
- package/dist/packages/core/src/memory-store.d.ts +21 -0
- package/dist/packages/core/src/memory-store.d.ts.map +1 -0
- package/dist/packages/core/src/memory-store.js +57 -0
- package/dist/packages/core/src/memory-store.js.map +1 -0
- package/dist/packages/core/src/naturalsort.d.ts +2 -0
- package/dist/packages/core/src/naturalsort.d.ts.map +1 -0
- package/dist/packages/core/src/naturalsort.js +88 -0
- package/dist/packages/core/src/naturalsort.js.map +1 -0
- package/dist/packages/core/src/observable.d.ts +54 -0
- package/dist/packages/core/src/observable.d.ts.map +1 -0
- package/dist/packages/core/src/observable.js +150 -0
- package/dist/packages/core/src/observable.js.map +1 -0
- package/dist/packages/core/src/pool.d.ts +38 -0
- package/dist/packages/core/src/pool.d.ts.map +1 -0
- package/dist/packages/core/src/pool.js +113 -0
- package/dist/packages/core/src/pool.js.map +1 -0
- package/dist/packages/core/src/reconcile.d.ts +43 -0
- package/dist/packages/core/src/reconcile.d.ts.map +1 -0
- package/dist/packages/core/src/reconcile.js +172 -0
- package/dist/packages/core/src/reconcile.js.map +1 -0
- package/dist/packages/core/src/resolver.d.ts +67 -0
- package/dist/packages/core/src/resolver.d.ts.map +1 -0
- package/dist/packages/core/src/resolver.js +110 -0
- package/dist/packages/core/src/resolver.js.map +1 -0
- package/dist/packages/core/src/safename.d.ts +7 -0
- package/dist/packages/core/src/safename.d.ts.map +1 -0
- package/dist/packages/core/src/safename.js +354 -0
- package/dist/packages/core/src/safename.js.map +1 -0
- package/dist/packages/core/src/scanner.d.ts +25 -0
- package/dist/packages/core/src/scanner.d.ts.map +1 -0
- package/dist/packages/core/src/scanner.js +97 -0
- package/dist/packages/core/src/scanner.js.map +1 -0
- package/dist/packages/core/src/store.d.ts +39 -0
- package/dist/packages/core/src/store.d.ts.map +1 -0
- package/dist/packages/core/src/store.js +53 -0
- package/dist/packages/core/src/store.js.map +1 -0
- package/dist/packages/core/src/tree.d.ts +16 -0
- package/dist/packages/core/src/tree.d.ts.map +1 -0
- package/dist/packages/core/src/tree.js +45 -0
- package/dist/packages/core/src/tree.js.map +1 -0
- package/dist/packages/core/src/verify.d.ts +29 -0
- package/dist/packages/core/src/verify.d.ts.map +1 -0
- package/dist/packages/core/src/verify.js +85 -0
- package/dist/packages/core/src/verify.js.map +1 -0
- package/dist/packages/core/src/workspace.d.ts +72 -0
- package/dist/packages/core/src/workspace.d.ts.map +1 -0
- package/dist/packages/core/src/workspace.js +135 -0
- package/dist/packages/core/src/workspace.js.map +1 -0
- package/dist/packages/node/src/index.d.ts +4 -0
- package/dist/packages/node/src/index.d.ts.map +1 -0
- package/dist/packages/node/src/index.js +6 -0
- package/dist/packages/node/src/index.js.map +1 -0
- package/dist/packages/node/src/node-fs.d.ts +24 -0
- package/dist/packages/node/src/node-fs.d.ts.map +1 -0
- package/dist/packages/node/src/node-fs.js +84 -0
- package/dist/packages/node/src/node-fs.js.map +1 -0
- package/dist/packages/node/src/tree-store.d.ts +22 -0
- package/dist/packages/node/src/tree-store.d.ts.map +1 -0
- package/dist/packages/node/src/tree-store.js +77 -0
- package/dist/packages/node/src/tree-store.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Encode a 64-byte digest as an 88-character base58 string. */
|
|
2
|
+
export declare function encode(digest: Uint8Array): string;
|
|
3
|
+
/** Decode an 88-character base58 string to a 64-byte digest. */
|
|
4
|
+
export declare function decode(s: string): Uint8Array;
|
|
5
|
+
//# sourceMappingURL=base58.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base58.d.ts","sourceRoot":"","sources":["../../../../../core/src/base58.ts"],"names":[],"mappings":"AASA,gEAAgE;AAChE,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAcjD;AAED,gEAAgE;AAChE,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAsB5C"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const alphabet = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
2
|
+
const base = 58n;
|
|
3
|
+
// Reverse lookup: character -> index (0xFF = invalid)
|
|
4
|
+
const lut = new Uint8Array(256).fill(0xff);
|
|
5
|
+
for (let i = 0; i < alphabet.length; i++) {
|
|
6
|
+
lut[alphabet.charCodeAt(i)] = i;
|
|
7
|
+
}
|
|
8
|
+
/** Encode a 64-byte digest as an 88-character base58 string. */
|
|
9
|
+
export function encode(digest) {
|
|
10
|
+
let num = 0n;
|
|
11
|
+
for (let i = 0; i < digest.length; i++) {
|
|
12
|
+
num = (num << 8n) | BigInt(digest[i]);
|
|
13
|
+
}
|
|
14
|
+
const chars = new Array(88).fill(alphabet[0]);
|
|
15
|
+
for (let i = 87; i >= 0 && num > 0n; i--) {
|
|
16
|
+
const rem = num % base;
|
|
17
|
+
num = num / base;
|
|
18
|
+
chars[i] = alphabet[Number(rem)];
|
|
19
|
+
}
|
|
20
|
+
return chars.join("");
|
|
21
|
+
}
|
|
22
|
+
/** Decode an 88-character base58 string to a 64-byte digest. */
|
|
23
|
+
export function decode(s) {
|
|
24
|
+
if (s.length !== 88) {
|
|
25
|
+
throw new Error(`c4 base58 body must be 88 characters, got ${s.length}`);
|
|
26
|
+
}
|
|
27
|
+
let num = 0n;
|
|
28
|
+
for (let i = 0; i < s.length; i++) {
|
|
29
|
+
const v = lut[s.charCodeAt(i)];
|
|
30
|
+
if (v === 0xff) {
|
|
31
|
+
throw new Error(`non c4 id character at position ${i}`);
|
|
32
|
+
}
|
|
33
|
+
num = num * base + BigInt(v);
|
|
34
|
+
}
|
|
35
|
+
const out = new Uint8Array(64);
|
|
36
|
+
for (let i = 63; i >= 0 && num > 0n; i--) {
|
|
37
|
+
out[i] = Number(num & 0xffn);
|
|
38
|
+
num >>= 8n;
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=base58.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base58.js","sourceRoot":"","sources":["../../../../../core/src/base58.ts"],"names":[],"mappings":"AAAA,MAAM,QAAQ,GAAG,4DAA4D,CAAC;AAC9E,MAAM,IAAI,GAAG,GAAG,CAAC;AAEjB,sDAAsD;AACtD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;IACzC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,MAAM,CAAC,MAAkB;IACvC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,KAAK,CAAS,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;QACvB,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,6CAA6C,CAAC,CAAC,MAAM,EAAE,CACxD,CAAC;IACJ,CAAC;IAED,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;QAC7B,GAAG,KAAK,EAAE,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { FileSystem, DirEntry, FileStat } from '../filesystem.js';
|
|
2
|
+
/**
|
|
3
|
+
* FileSystem implementation backed by the File System Access API.
|
|
4
|
+
* Wraps a FileSystemDirectoryHandle to provide the standard FileSystem interface.
|
|
5
|
+
*
|
|
6
|
+
* This enables workspace, scanner, and reconciler operations in the browser
|
|
7
|
+
* using a real directory selected by the user via showDirectoryPicker().
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const dirHandle = await window.showDirectoryPicker()
|
|
11
|
+
* const fs = new FileSystemAccessFS(dirHandle)
|
|
12
|
+
* const manifest = await scan(fs, '', options)
|
|
13
|
+
*/
|
|
14
|
+
export declare class FileSystemAccessFS implements FileSystem {
|
|
15
|
+
private root;
|
|
16
|
+
constructor(root: FileSystemDirectoryHandle);
|
|
17
|
+
readDir(path: string): AsyncIterable<DirEntry>;
|
|
18
|
+
stat(path: string): Promise<FileStat>;
|
|
19
|
+
readFile(path: string): Promise<ReadableStream<Uint8Array>>;
|
|
20
|
+
readFileBytes(path: string): Promise<Uint8Array>;
|
|
21
|
+
writeFile(path: string, data: ReadableStream<Uint8Array> | Uint8Array): Promise<void>;
|
|
22
|
+
mkdir(path: string, options?: {
|
|
23
|
+
recursive?: boolean;
|
|
24
|
+
}): Promise<void>;
|
|
25
|
+
remove(path: string, options?: {
|
|
26
|
+
recursive?: boolean;
|
|
27
|
+
}): Promise<void>;
|
|
28
|
+
rename(oldPath: string, newPath: string): Promise<void>;
|
|
29
|
+
private resolveHandle;
|
|
30
|
+
private resolveDir;
|
|
31
|
+
private resolveDirParts;
|
|
32
|
+
private resolveFile;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../../../../../core/src/browser/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGtE;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,IAAI,CAA2B;gBAE3B,IAAI,EAAE,yBAAyB;IAIpC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAW/C,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAM3D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAOhD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBrF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAe/C,aAAa;YA0Bb,UAAU;YAKV,eAAe;YAYf,WAAW;CAU1B"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { FileNotFoundError, streamToBytes } from '../filesystem.js';
|
|
2
|
+
/**
|
|
3
|
+
* FileSystem implementation backed by the File System Access API.
|
|
4
|
+
* Wraps a FileSystemDirectoryHandle to provide the standard FileSystem interface.
|
|
5
|
+
*
|
|
6
|
+
* This enables workspace, scanner, and reconciler operations in the browser
|
|
7
|
+
* using a real directory selected by the user via showDirectoryPicker().
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const dirHandle = await window.showDirectoryPicker()
|
|
11
|
+
* const fs = new FileSystemAccessFS(dirHandle)
|
|
12
|
+
* const manifest = await scan(fs, '', options)
|
|
13
|
+
*/
|
|
14
|
+
export class FileSystemAccessFS {
|
|
15
|
+
constructor(root) {
|
|
16
|
+
this.root = root;
|
|
17
|
+
}
|
|
18
|
+
async *readDir(path) {
|
|
19
|
+
const dir = await this.resolveDir(path);
|
|
20
|
+
for await (const [name, handle] of dir) {
|
|
21
|
+
yield {
|
|
22
|
+
name,
|
|
23
|
+
isDirectory: handle.kind === 'directory',
|
|
24
|
+
isSymlink: false, // FSAA doesn't expose symlink info
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async stat(path) {
|
|
29
|
+
const handle = await this.resolveHandle(path);
|
|
30
|
+
if (handle.kind === 'directory') {
|
|
31
|
+
return {
|
|
32
|
+
size: 0,
|
|
33
|
+
mode: 0o755,
|
|
34
|
+
mtime: new Date(), // FSAA doesn't expose mtime on dirs
|
|
35
|
+
isDirectory: true,
|
|
36
|
+
isSymlink: false,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
const file = await handle.getFile();
|
|
40
|
+
return {
|
|
41
|
+
size: file.size,
|
|
42
|
+
mode: 0o644,
|
|
43
|
+
mtime: new Date(file.lastModified),
|
|
44
|
+
isDirectory: false,
|
|
45
|
+
isSymlink: false,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async readFile(path) {
|
|
49
|
+
const handle = await this.resolveFile(path);
|
|
50
|
+
const file = await handle.getFile();
|
|
51
|
+
return file.stream();
|
|
52
|
+
}
|
|
53
|
+
async readFileBytes(path) {
|
|
54
|
+
const handle = await this.resolveFile(path);
|
|
55
|
+
const file = await handle.getFile();
|
|
56
|
+
const buffer = await file.arrayBuffer();
|
|
57
|
+
return new Uint8Array(buffer);
|
|
58
|
+
}
|
|
59
|
+
async writeFile(path, data) {
|
|
60
|
+
const parts = splitPath(path);
|
|
61
|
+
const fileName = parts.pop();
|
|
62
|
+
const dir = await this.resolveDirParts(parts);
|
|
63
|
+
const fileHandle = await dir.getFileHandle(fileName, { create: true });
|
|
64
|
+
const writable = await fileHandle.createWritable();
|
|
65
|
+
if (data instanceof Uint8Array) {
|
|
66
|
+
await writable.write(data);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const bytes = await streamToBytes(data);
|
|
70
|
+
await writable.write(bytes);
|
|
71
|
+
}
|
|
72
|
+
await writable.close();
|
|
73
|
+
}
|
|
74
|
+
async mkdir(path, options) {
|
|
75
|
+
if (!path || path === '' || path === '.')
|
|
76
|
+
return;
|
|
77
|
+
const parts = splitPath(path);
|
|
78
|
+
if (options?.recursive) {
|
|
79
|
+
let dir = this.root;
|
|
80
|
+
for (const part of parts) {
|
|
81
|
+
dir = await dir.getDirectoryHandle(part, { create: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const dirName = parts.pop();
|
|
86
|
+
const parent = await this.resolveDirParts(parts);
|
|
87
|
+
await parent.getDirectoryHandle(dirName, { create: true });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async remove(path, options) {
|
|
91
|
+
const parts = splitPath(path);
|
|
92
|
+
const name = parts.pop();
|
|
93
|
+
const parent = await this.resolveDirParts(parts);
|
|
94
|
+
await parent.removeEntry(name, { recursive: options?.recursive });
|
|
95
|
+
}
|
|
96
|
+
async rename(oldPath, newPath) {
|
|
97
|
+
// FSAA doesn't have a native rename — copy + delete
|
|
98
|
+
const oldHandle = await this.resolveHandle(oldPath);
|
|
99
|
+
if (oldHandle.kind === 'file') {
|
|
100
|
+
const file = await oldHandle.getFile();
|
|
101
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
102
|
+
await this.writeFile(newPath, bytes);
|
|
103
|
+
await this.remove(oldPath);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
throw new Error('directory rename not supported in File System Access API');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// No setMeta support — FSAA doesn't expose permission/timestamp setting
|
|
110
|
+
async resolveHandle(path) {
|
|
111
|
+
if (!path || path === '' || path === '.')
|
|
112
|
+
return this.root;
|
|
113
|
+
const parts = splitPath(path);
|
|
114
|
+
const name = parts.pop();
|
|
115
|
+
let dir = this.root;
|
|
116
|
+
for (const part of parts) {
|
|
117
|
+
try {
|
|
118
|
+
dir = await dir.getDirectoryHandle(part);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
throw new FileNotFoundError(path);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Try as file first, then directory
|
|
125
|
+
try {
|
|
126
|
+
return await dir.getFileHandle(name);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
try {
|
|
130
|
+
return await dir.getDirectoryHandle(name);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
throw new FileNotFoundError(path);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async resolveDir(path) {
|
|
138
|
+
if (!path || path === '' || path === '.')
|
|
139
|
+
return this.root;
|
|
140
|
+
return this.resolveDirParts(splitPath(path));
|
|
141
|
+
}
|
|
142
|
+
async resolveDirParts(parts) {
|
|
143
|
+
let dir = this.root;
|
|
144
|
+
for (const part of parts) {
|
|
145
|
+
try {
|
|
146
|
+
dir = await dir.getDirectoryHandle(part);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
throw new FileNotFoundError(parts.join('/'));
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return dir;
|
|
153
|
+
}
|
|
154
|
+
async resolveFile(path) {
|
|
155
|
+
const parts = splitPath(path);
|
|
156
|
+
const name = parts.pop();
|
|
157
|
+
const dir = await this.resolveDirParts(parts);
|
|
158
|
+
try {
|
|
159
|
+
return await dir.getFileHandle(name);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
throw new FileNotFoundError(path);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function splitPath(path) {
|
|
167
|
+
return path.split('/').filter(p => p !== '' && p !== '.');
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../../../../core/src/browser/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../core/src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Browser-specific implementations using standard Web APIs.
|
|
2
|
+
// These require a browser environment (or compatible runtime like Deno).
|
|
3
|
+
export { IndexedDBStore } from './store.js';
|
|
4
|
+
export { FileSystemAccessFS } from './filesystem.js';
|
|
5
|
+
export { createHashPool } from './worker.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../core/src/browser/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,yEAAyE;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { C4ID } from '../id.js';
|
|
2
|
+
import type { Store } from '../store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Browser-persistent content store backed by IndexedDB.
|
|
5
|
+
* Content survives tab close, page reload, and browser restart.
|
|
6
|
+
*
|
|
7
|
+
* Each store is identified by a database name (e.g., project name).
|
|
8
|
+
* Blobs are stored directly in IndexedDB (no base64 overhead).
|
|
9
|
+
*/
|
|
10
|
+
export declare class IndexedDBStore implements Store {
|
|
11
|
+
private dbName;
|
|
12
|
+
private db;
|
|
13
|
+
constructor(dbName: string);
|
|
14
|
+
private open;
|
|
15
|
+
has(id: C4ID): Promise<boolean>;
|
|
16
|
+
get(id: C4ID): Promise<ReadableStream<Uint8Array>>;
|
|
17
|
+
put(data: ReadableStream<Uint8Array> | Uint8Array): Promise<C4ID>;
|
|
18
|
+
remove(id: C4ID): Promise<void>;
|
|
19
|
+
/** Count stored objects. */
|
|
20
|
+
count(): Promise<number>;
|
|
21
|
+
/** Iterate all stored C4 ID keys. */
|
|
22
|
+
keys(): AsyncIterable<string>;
|
|
23
|
+
/** Delete the entire database. */
|
|
24
|
+
destroy(): Promise<void>;
|
|
25
|
+
/** Close the database connection. */
|
|
26
|
+
close(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../../../core/src/browser/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAEpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAQxC;;;;;;GAMG;AACH,qBAAa,cAAe,YAAW,KAAK;IAC1C,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,EAAE,CAA2B;gBAEzB,MAAM,EAAE,MAAM;YAIZ,IAAI;IAsBZ,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAW/B,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAsBlD,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBjE,MAAM,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrC,4BAA4B;IACtB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAW9B,qCAAqC;IAC9B,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC;IAiBpC,kCAAkC;IAC5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,qCAAqC;IACrC,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { identifyBytes } from '../id.js';
|
|
2
|
+
import { ContentNotFoundError } from '../store.js';
|
|
3
|
+
import { streamToBytes, bytesToStream } from '../filesystem.js';
|
|
4
|
+
import { tryCanonicalizeC4m } from '../identify-content.js';
|
|
5
|
+
const DB_VERSION = 1;
|
|
6
|
+
const OBJECTS_STORE = 'objects';
|
|
7
|
+
/**
|
|
8
|
+
* Browser-persistent content store backed by IndexedDB.
|
|
9
|
+
* Content survives tab close, page reload, and browser restart.
|
|
10
|
+
*
|
|
11
|
+
* Each store is identified by a database name (e.g., project name).
|
|
12
|
+
* Blobs are stored directly in IndexedDB (no base64 overhead).
|
|
13
|
+
*/
|
|
14
|
+
export class IndexedDBStore {
|
|
15
|
+
constructor(dbName) {
|
|
16
|
+
this.db = null;
|
|
17
|
+
this.dbName = `c4-store-${dbName}`;
|
|
18
|
+
}
|
|
19
|
+
async open() {
|
|
20
|
+
if (this.db)
|
|
21
|
+
return this.db;
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const request = indexedDB.open(this.dbName, DB_VERSION);
|
|
24
|
+
request.onupgradeneeded = () => {
|
|
25
|
+
const db = request.result;
|
|
26
|
+
if (!db.objectStoreNames.contains(OBJECTS_STORE)) {
|
|
27
|
+
db.createObjectStore(OBJECTS_STORE);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
request.onsuccess = () => {
|
|
31
|
+
this.db = request.result;
|
|
32
|
+
resolve(this.db);
|
|
33
|
+
};
|
|
34
|
+
request.onerror = () => reject(request.error);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
async has(id) {
|
|
38
|
+
const db = await this.open();
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const tx = db.transaction(OBJECTS_STORE, 'readonly');
|
|
41
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
42
|
+
const request = store.getKey(id.toString());
|
|
43
|
+
request.onsuccess = () => resolve(request.result !== undefined);
|
|
44
|
+
request.onerror = () => reject(request.error);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
async get(id) {
|
|
48
|
+
const db = await this.open();
|
|
49
|
+
const key = id.toString();
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
const tx = db.transaction(OBJECTS_STORE, 'readonly');
|
|
52
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
53
|
+
const request = store.get(key);
|
|
54
|
+
request.onsuccess = () => {
|
|
55
|
+
if (request.result === undefined) {
|
|
56
|
+
reject(new ContentNotFoundError(id));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const bytes = new Uint8Array(request.result);
|
|
60
|
+
resolve(bytesToStream(bytes));
|
|
61
|
+
};
|
|
62
|
+
request.onerror = () => reject(request.error);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
async put(data) {
|
|
66
|
+
let bytes = data instanceof Uint8Array ? data : await streamToBytes(data);
|
|
67
|
+
// If content parses as c4m, store the canonical form
|
|
68
|
+
const canonical = await tryCanonicalizeC4m(bytes);
|
|
69
|
+
if (canonical) {
|
|
70
|
+
bytes = canonical;
|
|
71
|
+
}
|
|
72
|
+
const id = await identifyBytes(bytes);
|
|
73
|
+
const key = id.toString();
|
|
74
|
+
const db = await this.open();
|
|
75
|
+
return new Promise((resolve, reject) => {
|
|
76
|
+
const tx = db.transaction(OBJECTS_STORE, 'readwrite');
|
|
77
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
78
|
+
// Store as ArrayBuffer for efficiency
|
|
79
|
+
const request = store.put(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength), key);
|
|
80
|
+
request.onsuccess = () => resolve(id);
|
|
81
|
+
request.onerror = () => reject(request.error);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async remove(id) {
|
|
85
|
+
const db = await this.open();
|
|
86
|
+
return new Promise((resolve, reject) => {
|
|
87
|
+
const tx = db.transaction(OBJECTS_STORE, 'readwrite');
|
|
88
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
89
|
+
const request = store.delete(id.toString());
|
|
90
|
+
request.onsuccess = () => resolve();
|
|
91
|
+
request.onerror = () => reject(request.error);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Count stored objects. */
|
|
95
|
+
async count() {
|
|
96
|
+
const db = await this.open();
|
|
97
|
+
return new Promise((resolve, reject) => {
|
|
98
|
+
const tx = db.transaction(OBJECTS_STORE, 'readonly');
|
|
99
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
100
|
+
const request = store.count();
|
|
101
|
+
request.onsuccess = () => resolve(request.result);
|
|
102
|
+
request.onerror = () => reject(request.error);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Iterate all stored C4 ID keys. */
|
|
106
|
+
async *keys() {
|
|
107
|
+
const db = await this.open();
|
|
108
|
+
const tx = db.transaction(OBJECTS_STORE, 'readonly');
|
|
109
|
+
const store = tx.objectStore(OBJECTS_STORE);
|
|
110
|
+
const request = store.openKeyCursor();
|
|
111
|
+
while (true) {
|
|
112
|
+
const cursor = await new Promise((resolve, reject) => {
|
|
113
|
+
request.onsuccess = () => resolve(request.result);
|
|
114
|
+
request.onerror = () => reject(request.error);
|
|
115
|
+
});
|
|
116
|
+
if (!cursor)
|
|
117
|
+
break;
|
|
118
|
+
yield cursor.key;
|
|
119
|
+
cursor.continue();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Delete the entire database. */
|
|
123
|
+
async destroy() {
|
|
124
|
+
if (this.db) {
|
|
125
|
+
this.db.close();
|
|
126
|
+
this.db = null;
|
|
127
|
+
}
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
const request = indexedDB.deleteDatabase(this.dbName);
|
|
130
|
+
request.onsuccess = () => resolve();
|
|
131
|
+
request.onerror = () => reject(request.error);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Close the database connection. */
|
|
135
|
+
close() {
|
|
136
|
+
if (this.db) {
|
|
137
|
+
this.db.close();
|
|
138
|
+
this.db = null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../../core/src/browser/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AAE3D,MAAM,UAAU,GAAG,CAAC,CAAA;AACpB,MAAM,aAAa,GAAG,SAAS,CAAA;AAE/B;;;;;;GAMG;AACH,MAAM,OAAO,cAAc;IAIzB,YAAY,MAAc;QAFlB,OAAE,GAAuB,IAAI,CAAA;QAGnC,IAAI,CAAC,MAAM,GAAG,YAAY,MAAM,EAAE,CAAA;IACpC,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC,EAAE,CAAA;QAE3B,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;YAEvD,OAAO,CAAC,eAAe,GAAG,GAAG,EAAE;gBAC7B,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;gBACzB,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;oBACjD,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAA;gBACrC,CAAC;YACH,CAAC,CAAA;YAED,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAA;gBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAClB,CAAC,CAAA;YAED,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAQ;QAChB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;YAC/D,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,EAAQ;QAChB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAEzB,OAAO,IAAI,OAAO,CAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACjE,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE9B,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE;gBACvB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBACjC,MAAM,CAAC,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAA;oBACpC,OAAM;gBACR,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAqB,CAAC,CAAA;gBAC3D,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;YAC/B,CAAC,CAAA;YAED,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAA6C;QACrD,IAAI,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,aAAa,CAAC,IAAI,CAAC,CAAA;QAEzE,qDAAqD;QACrD,MAAM,SAAS,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAA;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,GAAG,SAAS,CAAA;QACnB,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAA;QAEzB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;YACrD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;YAC3C,sCAAsC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAA;YACzG,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACrC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAQ;QACnB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;YACrD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;YAC3C,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACnC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,4BAA4B;IAC5B,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC7C,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;YACpD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAA;YAC7B,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;YACjD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,CAAC,IAAI;QACT,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,UAAU,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;QAErC,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrE,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBACjD,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC/C,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,MAAM;gBAAE,MAAK;YAClB,MAAM,MAAM,CAAC,GAAa,CAAA;YAC1B,MAAM,CAAC,QAAQ,EAAE,CAAA;QACnB,CAAC;IACH,CAAC;IAED,kCAAkC;IAClC,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QAChB,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,OAAO,GAAG,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrD,OAAO,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAA;YACnC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,qCAAqC;IACrC,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YACf,IAAI,CAAC,EAAE,GAAG,IAAI,CAAA;QAChB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { C4ID } from '../id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Web Worker-based hash pool for parallel SHA-512 computation.
|
|
4
|
+
* Distributes hashing across multiple workers to prevent UI blocking.
|
|
5
|
+
*
|
|
6
|
+
* Each worker uses WebCrypto (hardware-accelerated in all modern browsers).
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const pool = createHashPool(4)
|
|
10
|
+
* const id = await pool.identify(largeFileBytes)
|
|
11
|
+
* const ids = await pool.identifyAll(fileList, { progress })
|
|
12
|
+
* pool.terminate()
|
|
13
|
+
*/
|
|
14
|
+
export interface HashPool {
|
|
15
|
+
/** Hash a single byte array. */
|
|
16
|
+
identify(data: Uint8Array): Promise<C4ID>;
|
|
17
|
+
/** Hash a File object (browser File API). */
|
|
18
|
+
identifyFile(file: File): Promise<C4ID>;
|
|
19
|
+
/** Hash multiple items in parallel with progress reporting. */
|
|
20
|
+
identifyAll(items: Array<Uint8Array | File>, options?: {
|
|
21
|
+
progress?: (index: number, total: number) => void;
|
|
22
|
+
}): Promise<C4ID[]>;
|
|
23
|
+
/** Terminate all workers. */
|
|
24
|
+
terminate(): void;
|
|
25
|
+
/** Number of workers in the pool. */
|
|
26
|
+
readonly size: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a hash worker pool.
|
|
30
|
+
*
|
|
31
|
+
* @param workerCount Number of Web Workers (default: navigator.hardwareConcurrency or 4)
|
|
32
|
+
*/
|
|
33
|
+
export declare function createHashPool(workerCount?: number): HashPool;
|
|
34
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../../../../core/src/browser/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAiB,MAAM,UAAU,CAAA;AAE9C;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,QAAQ;IACvB,gCAAgC;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEzC,6CAA6C;IAC7C,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvC,+DAA+D;IAC/D,WAAW,CACT,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GAC9D,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IAElB,6BAA6B;IAC7B,SAAS,IAAI,IAAI,CAAA;IAEjB,qCAAqC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAaD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,CAwG7D"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { C4ID } from '../id.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a hash worker pool.
|
|
4
|
+
*
|
|
5
|
+
* @param workerCount Number of Web Workers (default: navigator.hardwareConcurrency or 4)
|
|
6
|
+
*/
|
|
7
|
+
export function createHashPool(workerCount) {
|
|
8
|
+
const count = workerCount ?? (typeof navigator !== 'undefined' ? navigator.hardwareConcurrency : 4) ?? 4;
|
|
9
|
+
// Worker script as a blob URL (no separate file needed)
|
|
10
|
+
const workerScript = `
|
|
11
|
+
self.onmessage = async function(e) {
|
|
12
|
+
const { id, data } = e.data;
|
|
13
|
+
const digest = await crypto.subtle.digest('SHA-512', data);
|
|
14
|
+
self.postMessage({ id, digest: digest }, [digest]);
|
|
15
|
+
};
|
|
16
|
+
`;
|
|
17
|
+
const blob = new Blob([workerScript], { type: 'application/javascript' });
|
|
18
|
+
const workerUrl = URL.createObjectURL(blob);
|
|
19
|
+
const workers = [];
|
|
20
|
+
const pending = new Map();
|
|
21
|
+
let nextId = 0;
|
|
22
|
+
let nextWorker = 0;
|
|
23
|
+
// Create workers
|
|
24
|
+
for (let i = 0; i < count; i++) {
|
|
25
|
+
const worker = new Worker(workerUrl);
|
|
26
|
+
worker.onmessage = (e) => {
|
|
27
|
+
const { id, digest } = e.data;
|
|
28
|
+
const cb = pending.get(id);
|
|
29
|
+
if (cb) {
|
|
30
|
+
pending.delete(id);
|
|
31
|
+
cb.resolve(digest);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
worker.onerror = (e) => {
|
|
35
|
+
// Reject all pending requests for this worker
|
|
36
|
+
// In practice this shouldn't happen with simple SHA-512
|
|
37
|
+
console.error('Hash worker error:', e);
|
|
38
|
+
};
|
|
39
|
+
workers.push(worker);
|
|
40
|
+
}
|
|
41
|
+
function dispatch(data) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const id = nextId++;
|
|
44
|
+
pending.set(id, { resolve, reject });
|
|
45
|
+
const worker = workers[nextWorker % workers.length];
|
|
46
|
+
nextWorker++;
|
|
47
|
+
// Transfer the buffer to avoid copying
|
|
48
|
+
worker.postMessage({ id, data }, [data]);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
get size() { return count; },
|
|
53
|
+
async identify(data) {
|
|
54
|
+
// Copy to transferable ArrayBuffer
|
|
55
|
+
const buffer = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength);
|
|
56
|
+
const digest = await dispatch(buffer);
|
|
57
|
+
return new C4ID(new Uint8Array(digest));
|
|
58
|
+
},
|
|
59
|
+
async identifyFile(file) {
|
|
60
|
+
const buffer = await file.arrayBuffer();
|
|
61
|
+
const digest = await dispatch(buffer);
|
|
62
|
+
return new C4ID(new Uint8Array(digest));
|
|
63
|
+
},
|
|
64
|
+
async identifyAll(items, options) {
|
|
65
|
+
const total = items.length;
|
|
66
|
+
let completed = 0;
|
|
67
|
+
const promises = items.map(async (item, _index) => {
|
|
68
|
+
let buffer;
|
|
69
|
+
if (item instanceof Uint8Array) {
|
|
70
|
+
buffer = item.buffer.slice(item.byteOffset, item.byteOffset + item.byteLength);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
buffer = await item.arrayBuffer();
|
|
74
|
+
}
|
|
75
|
+
const digest = await dispatch(buffer);
|
|
76
|
+
completed++;
|
|
77
|
+
options?.progress?.(completed, total);
|
|
78
|
+
return new C4ID(new Uint8Array(digest));
|
|
79
|
+
});
|
|
80
|
+
return Promise.all(promises);
|
|
81
|
+
},
|
|
82
|
+
terminate() {
|
|
83
|
+
for (const worker of workers) {
|
|
84
|
+
worker.terminate();
|
|
85
|
+
}
|
|
86
|
+
workers.length = 0;
|
|
87
|
+
URL.revokeObjectURL(workerUrl);
|
|
88
|
+
// Reject any pending requests
|
|
89
|
+
for (const [, cb] of pending) {
|
|
90
|
+
cb.reject(new Error('worker pool terminated'));
|
|
91
|
+
}
|
|
92
|
+
pending.clear();
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../../../../core/src/browser/worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { C4ID } from './id.js';
|
|
2
|
+
import { type Entry } from './entry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decode a c4m text string into entries and metadata.
|
|
5
|
+
* Returns the raw components; the Manifest class assembles them.
|
|
6
|
+
*
|
|
7
|
+
* When patch boundaries (bare C4 IDs between entry sections) are present,
|
|
8
|
+
* sections and patchBoundaries are populated so that Manifest.parse() can
|
|
9
|
+
* verify each boundary and apply patch semantics.
|
|
10
|
+
*/
|
|
11
|
+
export interface DecodeResult {
|
|
12
|
+
version: string;
|
|
13
|
+
base: C4ID | null;
|
|
14
|
+
entries: Entry[];
|
|
15
|
+
sections: Entry[][];
|
|
16
|
+
patchBoundaries: C4ID[];
|
|
17
|
+
rangeData: Map<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/** Decode c4m text into a DecodeResult. */
|
|
20
|
+
export declare function decode(text: string): Promise<DecodeResult>;
|
|
21
|
+
/** Parse c4m text into entries (convenience). */
|
|
22
|
+
export declare function loads(text: string): Promise<DecodeResult>;
|
|
23
|
+
//# sourceMappingURL=decoder.d.ts.map
|