@hashtree/core 0.1.0

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 (138) hide show
  1. package/LICENSE +21 -0
  2. package/dist/bep52.d.ts +179 -0
  3. package/dist/bep52.d.ts.map +1 -0
  4. package/dist/bep52.js +384 -0
  5. package/dist/bep52.js.map +1 -0
  6. package/dist/builder.d.ts +137 -0
  7. package/dist/builder.d.ts.map +1 -0
  8. package/dist/builder.js +281 -0
  9. package/dist/builder.js.map +1 -0
  10. package/dist/codec.d.ts +37 -0
  11. package/dist/codec.d.ts.map +1 -0
  12. package/dist/codec.js +109 -0
  13. package/dist/codec.js.map +1 -0
  14. package/dist/crypto.d.ts +92 -0
  15. package/dist/crypto.d.ts.map +1 -0
  16. package/dist/crypto.js +212 -0
  17. package/dist/crypto.js.map +1 -0
  18. package/dist/encrypted.d.ts +114 -0
  19. package/dist/encrypted.d.ts.map +1 -0
  20. package/dist/encrypted.js +446 -0
  21. package/dist/encrypted.js.map +1 -0
  22. package/dist/hash.d.ts +14 -0
  23. package/dist/hash.d.ts.map +1 -0
  24. package/dist/hash.js +27 -0
  25. package/dist/hash.js.map +1 -0
  26. package/dist/hashtree.d.ts +237 -0
  27. package/dist/hashtree.d.ts.map +1 -0
  28. package/dist/hashtree.js +557 -0
  29. package/dist/hashtree.js.map +1 -0
  30. package/dist/index.d.ts +27 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +44 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/nhash.d.ts +94 -0
  35. package/dist/nhash.d.ts.map +1 -0
  36. package/dist/nhash.js +293 -0
  37. package/dist/nhash.js.map +1 -0
  38. package/dist/resolver/index.d.ts +5 -0
  39. package/dist/resolver/index.d.ts.map +1 -0
  40. package/dist/resolver/index.js +5 -0
  41. package/dist/resolver/index.js.map +1 -0
  42. package/dist/resolver/nostr.d.ts +82 -0
  43. package/dist/resolver/nostr.d.ts.map +1 -0
  44. package/dist/resolver/nostr.js +868 -0
  45. package/dist/resolver/nostr.js.map +1 -0
  46. package/dist/store/blossom.d.ts +100 -0
  47. package/dist/store/blossom.d.ts.map +1 -0
  48. package/dist/store/blossom.js +355 -0
  49. package/dist/store/blossom.js.map +1 -0
  50. package/dist/store/dexie.d.ts +44 -0
  51. package/dist/store/dexie.d.ts.map +1 -0
  52. package/dist/store/dexie.js +196 -0
  53. package/dist/store/dexie.js.map +1 -0
  54. package/dist/store/fallback.d.ts +40 -0
  55. package/dist/store/fallback.d.ts.map +1 -0
  56. package/dist/store/fallback.js +71 -0
  57. package/dist/store/fallback.js.map +1 -0
  58. package/dist/store/index.d.ts +6 -0
  59. package/dist/store/index.d.ts.map +1 -0
  60. package/dist/store/index.js +6 -0
  61. package/dist/store/index.js.map +1 -0
  62. package/dist/store/memory.d.ts +29 -0
  63. package/dist/store/memory.d.ts.map +1 -0
  64. package/dist/store/memory.js +66 -0
  65. package/dist/store/memory.js.map +1 -0
  66. package/dist/store/opfs.d.ts +56 -0
  67. package/dist/store/opfs.d.ts.map +1 -0
  68. package/dist/store/opfs.js +200 -0
  69. package/dist/store/opfs.js.map +1 -0
  70. package/dist/streaming.d.ts +74 -0
  71. package/dist/streaming.d.ts.map +1 -0
  72. package/dist/streaming.js +199 -0
  73. package/dist/streaming.js.map +1 -0
  74. package/dist/tree/create.d.ts +35 -0
  75. package/dist/tree/create.d.ts.map +1 -0
  76. package/dist/tree/create.js +90 -0
  77. package/dist/tree/create.js.map +1 -0
  78. package/dist/tree/edit.d.ts +28 -0
  79. package/dist/tree/edit.d.ts.map +1 -0
  80. package/dist/tree/edit.js +115 -0
  81. package/dist/tree/edit.js.map +1 -0
  82. package/dist/tree/editEncrypted.d.ts +46 -0
  83. package/dist/tree/editEncrypted.d.ts.map +1 -0
  84. package/dist/tree/editEncrypted.js +225 -0
  85. package/dist/tree/editEncrypted.js.map +1 -0
  86. package/dist/tree/index.d.ts +7 -0
  87. package/dist/tree/index.d.ts.map +1 -0
  88. package/dist/tree/index.js +7 -0
  89. package/dist/tree/index.js.map +1 -0
  90. package/dist/tree/read.d.ts +75 -0
  91. package/dist/tree/read.d.ts.map +1 -0
  92. package/dist/tree/read.js +389 -0
  93. package/dist/tree/read.js.map +1 -0
  94. package/dist/tree/writeAt.d.ts +44 -0
  95. package/dist/tree/writeAt.d.ts.map +1 -0
  96. package/dist/tree/writeAt.js +282 -0
  97. package/dist/tree/writeAt.js.map +1 -0
  98. package/dist/types.d.ts +274 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +47 -0
  101. package/dist/types.js.map +1 -0
  102. package/dist/verify.d.ts +12 -0
  103. package/dist/verify.d.ts.map +1 -0
  104. package/dist/verify.js +32 -0
  105. package/dist/verify.js.map +1 -0
  106. package/dist/visibility.d.ts +50 -0
  107. package/dist/visibility.d.ts.map +1 -0
  108. package/dist/visibility.js +111 -0
  109. package/dist/visibility.js.map +1 -0
  110. package/dist/webrtc/index.d.ts +4 -0
  111. package/dist/webrtc/index.d.ts.map +1 -0
  112. package/dist/webrtc/index.js +4 -0
  113. package/dist/webrtc/index.js.map +1 -0
  114. package/dist/webrtc/lruCache.d.ts +20 -0
  115. package/dist/webrtc/lruCache.d.ts.map +1 -0
  116. package/dist/webrtc/lruCache.js +59 -0
  117. package/dist/webrtc/lruCache.js.map +1 -0
  118. package/dist/webrtc/peer.d.ts +122 -0
  119. package/dist/webrtc/peer.d.ts.map +1 -0
  120. package/dist/webrtc/peer.js +583 -0
  121. package/dist/webrtc/peer.js.map +1 -0
  122. package/dist/webrtc/protocol.d.ts +76 -0
  123. package/dist/webrtc/protocol.d.ts.map +1 -0
  124. package/dist/webrtc/protocol.js +167 -0
  125. package/dist/webrtc/protocol.js.map +1 -0
  126. package/dist/webrtc/store.d.ts +190 -0
  127. package/dist/webrtc/store.d.ts.map +1 -0
  128. package/dist/webrtc/store.js +1043 -0
  129. package/dist/webrtc/store.js.map +1 -0
  130. package/dist/webrtc/types.d.ts +196 -0
  131. package/dist/webrtc/types.d.ts.map +1 -0
  132. package/dist/webrtc/types.js +46 -0
  133. package/dist/webrtc/types.js.map +1 -0
  134. package/dist/worker/protocol.d.ts +493 -0
  135. package/dist/worker/protocol.d.ts.map +1 -0
  136. package/dist/worker/protocol.js +15 -0
  137. package/dist/worker/protocol.js.map +1 -0
  138. package/package.json +59 -0
@@ -0,0 +1,237 @@
1
+ /**
2
+ * HashTree - Unified merkle tree operations
3
+ *
4
+ * Single class for creating, reading, and editing content-addressed merkle trees.
5
+ *
6
+ * All files are encrypted by default using CHK (Content Hash Key) encryption.
7
+ * Use the "Public" variants (putFilePublic, readFilePublic) for unencrypted storage.
8
+ */
9
+ import { Store, Hash, CID, TreeNode, LinkType } from './types.js';
10
+ import { StreamWriter } from './streaming.js';
11
+ import * as streaming from './streaming.js';
12
+ export { StreamWriter } from './streaming.js';
13
+ export { verifyTree } from './verify.js';
14
+ /** Default chunk size: 2MB (optimized for blossom uploads) */
15
+ export declare const DEFAULT_CHUNK_SIZE: number;
16
+ export interface HashTreeConfig {
17
+ store: Store;
18
+ chunkSize?: number;
19
+ }
20
+ export interface TreeEntry {
21
+ name: string;
22
+ cid: CID;
23
+ size: number;
24
+ type: LinkType;
25
+ meta?: Record<string, unknown>;
26
+ }
27
+ export interface DirEntry {
28
+ name: string;
29
+ cid: CID;
30
+ size: number;
31
+ type: LinkType;
32
+ meta?: Record<string, unknown>;
33
+ }
34
+ /**
35
+ * HashTree - create, read, and edit merkle trees
36
+ */
37
+ export declare class HashTree {
38
+ private store;
39
+ private chunkSize;
40
+ constructor(config: HashTreeConfig);
41
+ private get config();
42
+ putBlob(data: Uint8Array): Promise<Hash>;
43
+ /**
44
+ * Store a file
45
+ * @param data - File data to store
46
+ * @param options - { unencrypted?: boolean } - if true, store without encryption
47
+ * @returns { cid, size }
48
+ */
49
+ putFile(data: Uint8Array, options?: {
50
+ unencrypted?: boolean;
51
+ }): Promise<{
52
+ cid: CID;
53
+ size: number;
54
+ }>;
55
+ /**
56
+ * Store a directory
57
+ * @param entries - Directory entries
58
+ * @param options - { unencrypted?: boolean } - if true, store without encryption
59
+ * @returns { cid, size }
60
+ */
61
+ putDirectory(entries: DirEntry[], options?: {
62
+ unencrypted?: boolean;
63
+ }): Promise<{
64
+ cid: CID;
65
+ size: number;
66
+ }>;
67
+ getBlob(hash: Hash): Promise<Uint8Array | null>;
68
+ /**
69
+ * Get a tree node
70
+ */
71
+ getTreeNode(id: CID): Promise<TreeNode | null>;
72
+ getType(id: CID): Promise<LinkType>;
73
+ isDirectory(id: CID): Promise<boolean>;
74
+ /**
75
+ * Read a file
76
+ */
77
+ readFile(id: CID): Promise<Uint8Array | null>;
78
+ /**
79
+ * Stream a file
80
+ * @param id - CID of the file
81
+ * @param options - { offset?: number, prefetch?: number }
82
+ */
83
+ readFileStream(id: CID, options?: {
84
+ offset?: number;
85
+ prefetch?: number;
86
+ }): AsyncGenerator<Uint8Array>;
87
+ /**
88
+ * Read a range of bytes from a file
89
+ */
90
+ readFileRange(id: CID, start: number, end?: number): Promise<Uint8Array | null>;
91
+ /**
92
+ * List directory entries
93
+ */
94
+ listDirectory(id: CID): Promise<TreeEntry[]>;
95
+ /**
96
+ * Resolve a path to get the entry's CID
97
+ *
98
+ * @param root - Root CID of the tree
99
+ * @param path - Path to resolve (string like 'a/b/file.txt' or array like ['a', 'b', 'file.txt'])
100
+ * @returns { cid, type } or null if not found
101
+ */
102
+ resolvePath(root: CID, path: string | string[]): Promise<{
103
+ cid: CID;
104
+ type: LinkType;
105
+ } | null>;
106
+ getSize(hash: Hash): Promise<number>;
107
+ walk(hash: Hash, path?: string): AsyncGenerator<{
108
+ path: string;
109
+ hash: Hash;
110
+ type: LinkType;
111
+ size?: number;
112
+ }>;
113
+ /**
114
+ * Walk entire tree and return all entries as an array
115
+ * More convenient than the async generator for most use cases
116
+ * @param id - Root CID of the tree
117
+ * @param options.includeData - If true, include file data in results
118
+ * @param options.filesOnly - If true, only return files (not directories)
119
+ */
120
+ walkTree(id: CID, options?: {
121
+ includeData?: boolean;
122
+ filesOnly?: boolean;
123
+ }): Promise<Array<{
124
+ path: string;
125
+ cid: CID;
126
+ type: LinkType;
127
+ size: number;
128
+ data?: Uint8Array;
129
+ }>>;
130
+ /**
131
+ * Iterate over all raw blocks in a merkle tree
132
+ * Yields each block's hash and data, traversing encrypted nodes correctly
133
+ * Useful for syncing to remote stores (e.g., Blossom push)
134
+ */
135
+ walkBlocks(id: CID): AsyncGenerator<{
136
+ hash: Hash;
137
+ data: Uint8Array;
138
+ }>;
139
+ /**
140
+ * Pull (fetch) all chunks for a tree recursively
141
+ * Triggers WebRTC fetches for any missing chunks
142
+ * Uses parallel fetching within each tree level for better performance
143
+ * @returns { cid, chunks, bytes } - The CID and stats about what was pulled
144
+ */
145
+ pull(id: CID): Promise<{
146
+ cid: CID;
147
+ chunks: number;
148
+ bytes: number;
149
+ }>;
150
+ /**
151
+ * Push all chunks for a tree to a target store
152
+ * Useful for syncing to remote stores (e.g., Blossom servers)
153
+ * @param id - CID of the tree to push
154
+ * @param targetStore - Store to push blocks to (must support put())
155
+ * @param options - callbacks for progress and per-block status
156
+ * @returns { cid, pushed, skipped, failed, bytes, errors } - The CID and detailed stats
157
+ */
158
+ push(id: CID, targetStore: Store, options?: {
159
+ onProgress?: (current: number, total: number) => void;
160
+ onBlock?: (hash: Hash, status: 'success' | 'skipped' | 'error', error?: Error) => void;
161
+ /** Number of parallel uploads (default: 4) */
162
+ concurrency?: number;
163
+ /** AbortSignal to cancel the push */
164
+ signal?: AbortSignal;
165
+ }): Promise<{
166
+ cid: CID;
167
+ pushed: number;
168
+ skipped: number;
169
+ failed: number;
170
+ bytes: number;
171
+ errors: Array<{
172
+ hash: Hash;
173
+ error: Error;
174
+ }>;
175
+ cancelled: boolean;
176
+ }>;
177
+ /**
178
+ * Add or update an entry in a directory
179
+ * @param root - Root CID of the tree
180
+ * @param path - Path to the directory containing the entry
181
+ * @param name - Name of the entry
182
+ * @param entry - CID of the entry content
183
+ * @param size - Size of the content
184
+ * @param type - Type of the entry (LinkType.Blob, LinkType.File, or LinkType.Dir)
185
+ * @returns New root CID
186
+ */
187
+ setEntry(root: CID, path: string[], name: string, entry: CID, size: number, type?: LinkType, meta?: Record<string, unknown>): Promise<CID>;
188
+ /**
189
+ * Remove an entry from a directory
190
+ * @param root - Root CID of the tree
191
+ * @param path - Path to the directory containing the entry
192
+ * @param name - Name of the entry to remove
193
+ * @returns New root CID
194
+ */
195
+ removeEntry(root: CID, path: string[], name: string): Promise<CID>;
196
+ /**
197
+ * Rename an entry in a directory
198
+ * @param root - Root CID of the tree
199
+ * @param path - Path to the directory containing the entry
200
+ * @param oldName - Current name
201
+ * @param newName - New name
202
+ * @returns New root CID
203
+ */
204
+ renameEntry(root: CID, path: string[], oldName: string, newName: string): Promise<CID>;
205
+ /**
206
+ * Move an entry to a different directory
207
+ * @param root - Root CID of the tree
208
+ * @param sourcePath - Path to the source directory
209
+ * @param name - Name of the entry to move
210
+ * @param targetPath - Path to the target directory
211
+ * @returns New root CID
212
+ */
213
+ moveEntry(root: CID, sourcePath: string[], name: string, targetPath: string[]): Promise<CID>;
214
+ /**
215
+ * Write data at a specific offset in a file
216
+ * Only affected chunks are rewritten - efficient for small patches to large files.
217
+ * Useful for updating file headers (e.g., WebM duration) without rewriting entire file.
218
+ *
219
+ * @param fileCid - CID of the file to modify
220
+ * @param offset - Byte offset to write at
221
+ * @param data - Data to write
222
+ * @returns New file CID
223
+ */
224
+ writeAt(fileCid: CID, offset: number, data: Uint8Array): Promise<CID>;
225
+ getStore(): Store;
226
+ /**
227
+ * Create a streaming file writer for incremental appends
228
+ * Useful for writing large files chunk by chunk (e.g., video recording)
229
+ * @param options.unencrypted - if true, create without encryption
230
+ * @param options.chunker - custom chunker for variable chunk sizes (e.g., videoChunker for faster start)
231
+ */
232
+ createStream(options?: {
233
+ unencrypted?: boolean;
234
+ chunker?: streaming.Chunker;
235
+ }): StreamWriter;
236
+ }
237
+ //# sourceMappingURL=hashtree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hashtree.d.ts","sourceRoot":"","sources":["../src/hashtree.ts"],"names":[],"mappings":"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"}