@yydb/light-db 0.0.0 → 0.0.11

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 (230) hide show
  1. package/dist/api/database.d.ts +48 -0
  2. package/dist/api/database.d.ts.map +1 -0
  3. package/dist/api/database.js +120 -0
  4. package/dist/api/database.js.map +1 -0
  5. package/dist/api/index.d.ts +7 -22
  6. package/dist/api/index.d.ts.map +1 -1
  7. package/dist/api/index.js +5 -52
  8. package/dist/api/index.js.map +1 -1
  9. package/dist/api/schema.d.ts +33 -0
  10. package/dist/api/schema.d.ts.map +1 -0
  11. package/dist/api/schema.js +80 -0
  12. package/dist/api/schema.js.map +1 -0
  13. package/dist/api/transaction.d.ts +26 -0
  14. package/dist/api/transaction.d.ts.map +1 -0
  15. package/dist/api/transaction.js +52 -0
  16. package/dist/api/transaction.js.map +1 -0
  17. package/dist/api/types.d.ts +55 -148
  18. package/dist/api/types.d.ts.map +1 -1
  19. package/dist/api/types.js +6 -5
  20. package/dist/api/types.js.map +1 -1
  21. package/dist/codec/binary.d.ts +196 -0
  22. package/dist/codec/binary.d.ts.map +1 -0
  23. package/dist/codec/binary.js +342 -0
  24. package/dist/codec/binary.js.map +1 -0
  25. package/dist/codec/checksum.d.ts +21 -0
  26. package/dist/codec/checksum.d.ts.map +1 -0
  27. package/dist/codec/checksum.js +46 -0
  28. package/dist/codec/checksum.js.map +1 -0
  29. package/dist/codec/index.d.ts +12 -0
  30. package/dist/codec/index.d.ts.map +1 -0
  31. package/dist/codec/index.js +10 -0
  32. package/dist/codec/index.js.map +1 -0
  33. package/dist/codec/page.d.ts +114 -0
  34. package/dist/codec/page.d.ts.map +1 -0
  35. package/dist/codec/page.js +225 -0
  36. package/dist/codec/page.js.map +1 -0
  37. package/dist/codec/record.d.ts +62 -0
  38. package/dist/codec/record.d.ts.map +1 -0
  39. package/dist/codec/record.js +82 -0
  40. package/dist/codec/record.js.map +1 -0
  41. package/dist/core/broadcast.d.ts +39 -0
  42. package/dist/core/broadcast.d.ts.map +1 -0
  43. package/dist/core/broadcast.js +54 -0
  44. package/dist/core/broadcast.js.map +1 -0
  45. package/dist/core/checkpoint.d.ts +23 -0
  46. package/dist/core/checkpoint.d.ts.map +1 -0
  47. package/dist/core/checkpoint.js +49 -0
  48. package/dist/core/checkpoint.js.map +1 -0
  49. package/dist/core/engine.d.ts +142 -0
  50. package/dist/core/engine.d.ts.map +1 -0
  51. package/dist/core/engine.js +304 -0
  52. package/dist/core/engine.js.map +1 -0
  53. package/dist/core/index.d.ts +17 -0
  54. package/dist/core/index.d.ts.map +1 -0
  55. package/dist/core/index.js +13 -0
  56. package/dist/core/index.js.map +1 -0
  57. package/dist/core/lease.d.ts +32 -0
  58. package/dist/core/lease.d.ts.map +1 -0
  59. package/dist/core/lease.js +81 -0
  60. package/dist/core/lease.js.map +1 -0
  61. package/dist/core/records.d.ts +49 -0
  62. package/dist/core/records.d.ts.map +1 -0
  63. package/dist/core/records.js +70 -0
  64. package/dist/core/records.js.map +1 -0
  65. package/dist/core/recovery.d.ts +43 -0
  66. package/dist/core/recovery.d.ts.map +1 -0
  67. package/dist/core/recovery.js +99 -0
  68. package/dist/core/recovery.js.map +1 -0
  69. package/dist/core/wal.d.ts +50 -0
  70. package/dist/core/wal.d.ts.map +1 -0
  71. package/dist/core/wal.js +114 -0
  72. package/dist/core/wal.js.map +1 -0
  73. package/dist/errors/index.d.ts +44 -66
  74. package/dist/errors/index.d.ts.map +1 -1
  75. package/dist/errors/index.js +43 -128
  76. package/dist/errors/index.js.map +1 -1
  77. package/dist/index.d.ts +14 -215
  78. package/dist/index.d.ts.map +1 -1
  79. package/dist/index.js +14 -724
  80. package/dist/index.js.map +1 -1
  81. package/dist/storage/StorageAdapter.d.ts +97 -0
  82. package/dist/storage/StorageAdapter.d.ts.map +1 -0
  83. package/dist/storage/StorageAdapter.js +9 -0
  84. package/dist/storage/StorageAdapter.js.map +1 -0
  85. package/dist/storage/index.d.ts +9 -8
  86. package/dist/storage/index.d.ts.map +1 -1
  87. package/dist/storage/index.js +8 -151
  88. package/dist/storage/index.js.map +1 -1
  89. package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts +140 -0
  90. package/dist/storage/indexeddb/IndexedDbStorageAdapter.d.ts.map +1 -0
  91. package/dist/storage/indexeddb/IndexedDbStorageAdapter.js +403 -0
  92. package/dist/storage/indexeddb/IndexedDbStorageAdapter.js.map +1 -0
  93. package/dist/storage/memory/MemoryStorageAdapter.d.ts +76 -0
  94. package/dist/storage/memory/MemoryStorageAdapter.d.ts.map +1 -0
  95. package/dist/storage/memory/MemoryStorageAdapter.js +212 -0
  96. package/dist/storage/memory/MemoryStorageAdapter.js.map +1 -0
  97. package/dist/storage/opfs/OpfsStorageAdapter.d.ts +141 -0
  98. package/dist/storage/opfs/OpfsStorageAdapter.d.ts.map +1 -0
  99. package/dist/storage/opfs/OpfsStorageAdapter.js +400 -0
  100. package/dist/storage/opfs/OpfsStorageAdapter.js.map +1 -0
  101. package/package.json +48 -36
  102. package/readme.md +80 -94
  103. package/dist/api/LightDB.d.ts +0 -194
  104. package/dist/api/LightDB.d.ts.map +0 -1
  105. package/dist/api/LightDB.js +0 -299
  106. package/dist/api/LightDB.js.map +0 -1
  107. package/dist/api/Transaction.d.ts +0 -100
  108. package/dist/api/Transaction.d.ts.map +0 -1
  109. package/dist/api/Transaction.js +0 -263
  110. package/dist/api/Transaction.js.map +0 -1
  111. package/dist/collection/Collection.d.ts +0 -235
  112. package/dist/collection/Collection.d.ts.map +0 -1
  113. package/dist/collection/Collection.js +0 -671
  114. package/dist/collection/Collection.js.map +0 -1
  115. package/dist/collection/QueryBuilder.d.ts +0 -225
  116. package/dist/collection/QueryBuilder.d.ts.map +0 -1
  117. package/dist/collection/QueryBuilder.js +0 -475
  118. package/dist/collection/QueryBuilder.js.map +0 -1
  119. package/dist/collection/QueryParser.d.ts +0 -117
  120. package/dist/collection/QueryParser.d.ts.map +0 -1
  121. package/dist/collection/QueryParser.js +0 -438
  122. package/dist/collection/QueryParser.js.map +0 -1
  123. package/dist/collection/index.d.ts +0 -42
  124. package/dist/collection/index.d.ts.map +0 -1
  125. package/dist/collection/index.js +0 -41
  126. package/dist/collection/index.js.map +0 -1
  127. package/dist/collection/types.d.ts +0 -365
  128. package/dist/collection/types.d.ts.map +0 -1
  129. package/dist/collection/types.js +0 -7
  130. package/dist/collection/types.js.map +0 -1
  131. package/dist/constants/index.d.ts +0 -51
  132. package/dist/constants/index.d.ts.map +0 -1
  133. package/dist/constants/index.js +0 -68
  134. package/dist/constants/index.js.map +0 -1
  135. package/dist/indexes/BPlusTree.d.ts +0 -181
  136. package/dist/indexes/BPlusTree.d.ts.map +0 -1
  137. package/dist/indexes/BPlusTree.js +0 -528
  138. package/dist/indexes/BPlusTree.js.map +0 -1
  139. package/dist/indexes/IndexManager.d.ts +0 -236
  140. package/dist/indexes/IndexManager.d.ts.map +0 -1
  141. package/dist/indexes/IndexManager.js +0 -502
  142. package/dist/indexes/IndexManager.js.map +0 -1
  143. package/dist/indexes/PrimaryIndex.d.ts +0 -240
  144. package/dist/indexes/PrimaryIndex.d.ts.map +0 -1
  145. package/dist/indexes/PrimaryIndex.js +0 -354
  146. package/dist/indexes/PrimaryIndex.js.map +0 -1
  147. package/dist/indexes/SecondaryIndex.d.ts +0 -204
  148. package/dist/indexes/SecondaryIndex.d.ts.map +0 -1
  149. package/dist/indexes/SecondaryIndex.js +0 -480
  150. package/dist/indexes/SecondaryIndex.js.map +0 -1
  151. package/dist/indexes/errors.d.ts +0 -66
  152. package/dist/indexes/errors.d.ts.map +0 -1
  153. package/dist/indexes/errors.js +0 -117
  154. package/dist/indexes/errors.js.map +0 -1
  155. package/dist/indexes/index.d.ts +0 -52
  156. package/dist/indexes/index.d.ts.map +0 -1
  157. package/dist/indexes/index.js +0 -131
  158. package/dist/indexes/index.js.map +0 -1
  159. package/dist/indexes/types.d.ts +0 -246
  160. package/dist/indexes/types.d.ts.map +0 -1
  161. package/dist/indexes/types.js +0 -30
  162. package/dist/indexes/types.js.map +0 -1
  163. package/dist/performance/BatchWALWriter.d.ts +0 -185
  164. package/dist/performance/BatchWALWriter.d.ts.map +0 -1
  165. package/dist/performance/BatchWALWriter.js +0 -490
  166. package/dist/performance/BatchWALWriter.js.map +0 -1
  167. package/dist/performance/ColumnarStorage.d.ts +0 -138
  168. package/dist/performance/ColumnarStorage.d.ts.map +0 -1
  169. package/dist/performance/ColumnarStorage.js +0 -875
  170. package/dist/performance/ColumnarStorage.js.map +0 -1
  171. package/dist/performance/LazyQuery.d.ts +0 -307
  172. package/dist/performance/LazyQuery.d.ts.map +0 -1
  173. package/dist/performance/LazyQuery.js +0 -588
  174. package/dist/performance/LazyQuery.js.map +0 -1
  175. package/dist/performance/OptimizedBuffer.d.ts +0 -375
  176. package/dist/performance/OptimizedBuffer.d.ts.map +0 -1
  177. package/dist/performance/OptimizedBuffer.js +0 -730
  178. package/dist/performance/OptimizedBuffer.js.map +0 -1
  179. package/dist/performance/RWLock.d.ts +0 -260
  180. package/dist/performance/RWLock.d.ts.map +0 -1
  181. package/dist/performance/RWLock.js +0 -570
  182. package/dist/performance/RWLock.js.map +0 -1
  183. package/dist/performance/index.d.ts +0 -41
  184. package/dist/performance/index.d.ts.map +0 -1
  185. package/dist/performance/index.js +0 -162
  186. package/dist/performance/index.js.map +0 -1
  187. package/dist/performance/types.d.ts +0 -247
  188. package/dist/performance/types.d.ts.map +0 -1
  189. package/dist/performance/types.js +0 -26
  190. package/dist/performance/types.js.map +0 -1
  191. package/dist/storage/Checkpoint.d.ts +0 -128
  192. package/dist/storage/Checkpoint.d.ts.map +0 -1
  193. package/dist/storage/Checkpoint.js +0 -251
  194. package/dist/storage/Checkpoint.js.map +0 -1
  195. package/dist/storage/LightFile.d.ts +0 -227
  196. package/dist/storage/LightFile.d.ts.map +0 -1
  197. package/dist/storage/LightFile.js +0 -526
  198. package/dist/storage/LightFile.js.map +0 -1
  199. package/dist/storage/Recovery.d.ts +0 -172
  200. package/dist/storage/Recovery.d.ts.map +0 -1
  201. package/dist/storage/Recovery.js +0 -399
  202. package/dist/storage/Recovery.js.map +0 -1
  203. package/dist/storage/SHMFile.d.ts +0 -243
  204. package/dist/storage/SHMFile.d.ts.map +0 -1
  205. package/dist/storage/SHMFile.js +0 -436
  206. package/dist/storage/SHMFile.js.map +0 -1
  207. package/dist/storage/StorageEngine.d.ts +0 -146
  208. package/dist/storage/StorageEngine.d.ts.map +0 -1
  209. package/dist/storage/StorageEngine.js +0 -353
  210. package/dist/storage/StorageEngine.js.map +0 -1
  211. package/dist/storage/WALFile.d.ts +0 -248
  212. package/dist/storage/WALFile.d.ts.map +0 -1
  213. package/dist/storage/WALFile.js +0 -597
  214. package/dist/storage/WALFile.js.map +0 -1
  215. package/dist/types/index.d.ts +0 -220
  216. package/dist/types/index.d.ts.map +0 -1
  217. package/dist/types/index.js +0 -7
  218. package/dist/types/index.js.map +0 -1
  219. package/dist/utils/binary.d.ts +0 -271
  220. package/dist/utils/binary.d.ts.map +0 -1
  221. package/dist/utils/binary.js +0 -454
  222. package/dist/utils/binary.js.map +0 -1
  223. package/dist/utils/file.d.ts +0 -166
  224. package/dist/utils/file.d.ts.map +0 -1
  225. package/dist/utils/file.js +0 -346
  226. package/dist/utils/file.js.map +0 -1
  227. package/dist/utils/index.d.ts +0 -6
  228. package/dist/utils/index.d.ts.map +0 -1
  229. package/dist/utils/index.js +0 -39
  230. package/dist/utils/index.js.map +0 -1
@@ -0,0 +1,212 @@
1
+ /**
2
+ * 内存存储适配器
3
+ *
4
+ * 用于测试、无持久化需求的一次性会话,以及适配器合同的参考实现。
5
+ */
6
+ import { LightDbError, LightDbErrorCodes } from '../../errors';
7
+ import { STORAGE_FILES } from '../StorageAdapter';
8
+ /**
9
+ * 内存存储后端
10
+ *
11
+ * 只有共用同一个后端实例才能跨 `openDatabase` 读到上一会话的数据,
12
+ * 测试据此模拟「关闭后重开」。
13
+ */
14
+ export class MemoryStorageBackend {
15
+ /** 适配器类型 */
16
+ kind = 'memory';
17
+ /** 会话结束后数据不保留 */
18
+ persistent = false;
19
+ directories = new Map();
20
+ /**
21
+ * 打开数据库适配器
22
+ * @param name 数据库名
23
+ */
24
+ async openDatabase(name) {
25
+ let directory = this.directories.get(name);
26
+ if (!directory) {
27
+ directory = new Map();
28
+ this.directories.set(name, directory);
29
+ }
30
+ return new MemoryStorageAdapter(name, directory);
31
+ }
32
+ /** 清空所有数据库 */
33
+ reset() {
34
+ this.directories.clear();
35
+ }
36
+ }
37
+ /**
38
+ * 内存存储适配器
39
+ */
40
+ export class MemoryStorageAdapter {
41
+ /** 适配器类型 */
42
+ kind = 'memory';
43
+ /** 会话结束后数据不保留 */
44
+ persistent = false;
45
+ name;
46
+ directory;
47
+ closed = false;
48
+ constructor(name, directory) {
49
+ this.name = name;
50
+ this.directory = directory;
51
+ }
52
+ /**
53
+ * 打开逻辑文件
54
+ * @param file 逻辑文件名
55
+ * @param mode 打开模式
56
+ */
57
+ async open(file, mode = 'readwrite') {
58
+ this.assertOpen('open');
59
+ const existing = this.directory.get(file);
60
+ if (!existing && mode === 'read') {
61
+ throw new LightDbError(LightDbErrorCodes.io, `storage file "${file}" does not exist in "${this.name}"`, {
62
+ operation: 'storageOpen',
63
+ });
64
+ }
65
+ if (!existing) {
66
+ this.directory.set(file, new Uint8Array(0));
67
+ }
68
+ return new MemoryStorageHandle(this.directory, file);
69
+ }
70
+ /**
71
+ * 判断文件是否存在
72
+ * @param file 逻辑文件名
73
+ */
74
+ async exists(file) {
75
+ this.assertOpen('exists');
76
+ return this.directory.has(file);
77
+ }
78
+ /**
79
+ * 删除文件
80
+ * @param file 逻辑文件名
81
+ */
82
+ async delete(file) {
83
+ this.assertOpen('delete');
84
+ this.directory.delete(file);
85
+ }
86
+ /**
87
+ * 原子重命名
88
+ * @param from 源文件
89
+ * @param to 目标文件
90
+ */
91
+ async rename(from, to) {
92
+ this.assertOpen('rename');
93
+ const data = this.directory.get(from);
94
+ if (!data) {
95
+ throw new LightDbError(LightDbErrorCodes.io, `cannot rename missing storage file "${from}"`, {
96
+ operation: 'storageRename',
97
+ });
98
+ }
99
+ this.directory.set(to, data);
100
+ this.directory.delete(from);
101
+ }
102
+ /**
103
+ * 列出已存在的文件
104
+ */
105
+ async list() {
106
+ this.assertOpen('list');
107
+ return STORAGE_FILES.filter((file) => this.directory.has(file));
108
+ }
109
+ /** 关闭适配器 */
110
+ async close() {
111
+ this.closed = true;
112
+ }
113
+ /**
114
+ * 断言适配器未关闭
115
+ * @param operation 操作名
116
+ */
117
+ assertOpen(operation) {
118
+ if (this.closed) {
119
+ throw new LightDbError(LightDbErrorCodes.sessionClosed, 'storage adapter is closed', { operation });
120
+ }
121
+ }
122
+ }
123
+ /**
124
+ * 内存文件句柄
125
+ */
126
+ class MemoryStorageHandle {
127
+ directory;
128
+ file;
129
+ closed = false;
130
+ constructor(directory, file) {
131
+ this.directory = directory;
132
+ this.file = file;
133
+ }
134
+ /**
135
+ * 读取指定区间
136
+ * @param position 起始位置
137
+ * @param length 期望长度
138
+ */
139
+ async read(position, length) {
140
+ this.assertOpen('read');
141
+ const data = this.readData();
142
+ if (position >= data.length) {
143
+ return new Uint8Array(0);
144
+ }
145
+ return data.slice(position, Math.min(position + length, data.length));
146
+ }
147
+ /**
148
+ * 写入指定位置
149
+ * @param position 起始位置
150
+ * @param data 数据
151
+ */
152
+ async write(position, data) {
153
+ this.assertOpen('write');
154
+ const current = this.readData();
155
+ const required = position + data.length;
156
+ const next = current.length >= required ? current : grow(current, required);
157
+ next.set(data, position);
158
+ this.directory.set(this.file, next);
159
+ }
160
+ /**
161
+ * 截断文件
162
+ * @param size 目标大小
163
+ */
164
+ async truncate(size) {
165
+ this.assertOpen('truncate');
166
+ const current = this.readData();
167
+ if (size <= current.length) {
168
+ this.directory.set(this.file, current.slice(0, size));
169
+ return;
170
+ }
171
+ this.directory.set(this.file, grow(current, size));
172
+ }
173
+ /** 内存写入无需落盘 */
174
+ async sync() {
175
+ this.assertOpen('sync');
176
+ }
177
+ /** 当前文件大小 */
178
+ async size() {
179
+ this.assertOpen('size');
180
+ return this.readData().length;
181
+ }
182
+ /** 关闭句柄 */
183
+ async close() {
184
+ this.closed = true;
185
+ }
186
+ /**
187
+ * 读取当前文件内容
188
+ */
189
+ readData() {
190
+ return this.directory.get(this.file) ?? new Uint8Array(0);
191
+ }
192
+ /**
193
+ * 断言句柄未关闭
194
+ * @param operation 操作名
195
+ */
196
+ assertOpen(operation) {
197
+ if (this.closed) {
198
+ throw new LightDbError(LightDbErrorCodes.sessionClosed, 'storage handle is closed', { operation });
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * 扩展到指定大小,新增区间填零
204
+ * @param current 当前内容
205
+ * @param size 目标大小
206
+ */
207
+ function grow(current, size) {
208
+ const next = new Uint8Array(size);
209
+ next.set(current, 0);
210
+ return next;
211
+ }
212
+ //# sourceMappingURL=MemoryStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MemoryStorageAdapter.js","sourceRoot":"","sources":["../../../src/storage/memory/MemoryStorageAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * OPFS 存储适配器
3
+ *
4
+ * 默认持久化后端。优先使用 sync access handle(需 Worker 上下文),
5
+ * 主线程退化为 `createWritable` + `getFile`,两条路径共享同一套逻辑文件语义。
6
+ *
7
+ * 不把 OPFS 目录结构暴露给上层:上层只认识 `main` / `main.tmp` / `wal` / `shm`。
8
+ */
9
+ import type { StorageAdapter, StorageAdapterFactory, StorageFile, StorageHandle, StorageOpenMode } from '../StorageAdapter';
10
+ /** 文件元信息 */
11
+ interface FileLike {
12
+ size: number;
13
+ arrayBuffer(): Promise<ArrayBuffer>;
14
+ }
15
+ /** 可写流 */
16
+ interface WritableLike {
17
+ write(options: {
18
+ type: 'write';
19
+ position: number;
20
+ data: Uint8Array;
21
+ }): Promise<void>;
22
+ truncate(size: number): Promise<void>;
23
+ close(): Promise<void>;
24
+ }
25
+ /** 同步访问句柄 */
26
+ interface SyncAccessHandleLike {
27
+ read(buffer: Uint8Array, options?: {
28
+ at?: number;
29
+ }): number;
30
+ write(buffer: Uint8Array, options?: {
31
+ at?: number;
32
+ }): number;
33
+ truncate(size: number): void;
34
+ flush(): void;
35
+ getSize(): number;
36
+ close(): void;
37
+ }
38
+ /** 文件句柄 */
39
+ interface FileHandleLike {
40
+ getFile(): Promise<FileLike>;
41
+ createWritable(options?: {
42
+ keepExistingData?: boolean;
43
+ }): Promise<WritableLike>;
44
+ createSyncAccessHandle?(): Promise<SyncAccessHandleLike>;
45
+ move?(name: string): Promise<void>;
46
+ }
47
+ /** 目录句柄 */
48
+ interface DirectoryHandleLike {
49
+ getFileHandle(name: string, options?: {
50
+ create?: boolean;
51
+ }): Promise<FileHandleLike>;
52
+ getDirectoryHandle(name: string, options?: {
53
+ create?: boolean;
54
+ }): Promise<DirectoryHandleLike>;
55
+ removeEntry(name: string, options?: {
56
+ recursive?: boolean;
57
+ }): Promise<void>;
58
+ }
59
+ /**
60
+ * 判断当前宿主是否提供 OPFS
61
+ */
62
+ export declare function isOpfsAvailable(): boolean;
63
+ /**
64
+ * OPFS 适配器工厂
65
+ */
66
+ export declare class OpfsStorageAdapterFactory implements StorageAdapterFactory {
67
+ /** 适配器类型 */
68
+ readonly kind: "opfs";
69
+ /** 数据持久化 */
70
+ readonly persistent = true;
71
+ private root;
72
+ /**
73
+ * 打开数据库适配器
74
+ * @param name 数据库名
75
+ */
76
+ openDatabase(name: string): Promise<StorageAdapter>;
77
+ /**
78
+ * 取得 OPFS 根目录
79
+ */
80
+ private getRoot;
81
+ /**
82
+ * 取得或创建目录
83
+ * @param parent 父目录
84
+ * @param name 目录名
85
+ * @param operation 操作名
86
+ */
87
+ private getDirectory;
88
+ }
89
+ /**
90
+ * OPFS 存储适配器
91
+ */
92
+ export declare class OpfsStorageAdapter implements StorageAdapter {
93
+ /** 适配器类型 */
94
+ readonly kind: "opfs";
95
+ /** 数据持久化 */
96
+ readonly persistent = true;
97
+ private readonly name;
98
+ private readonly directory;
99
+ private closed;
100
+ constructor(name: string, directory: DirectoryHandleLike);
101
+ /**
102
+ * 打开逻辑文件
103
+ * @param file 逻辑文件名
104
+ * @param mode 打开模式
105
+ */
106
+ open(file: StorageFile, mode?: StorageOpenMode): Promise<StorageHandle>;
107
+ /**
108
+ * 判断文件是否存在
109
+ * @param file 逻辑文件名
110
+ */
111
+ exists(file: StorageFile): Promise<boolean>;
112
+ /**
113
+ * 删除文件
114
+ * @param file 逻辑文件名
115
+ */
116
+ delete(file: StorageFile): Promise<void>;
117
+ /**
118
+ * 发布快照:优先 `move`,否则复制后删除
119
+ * @param from 源文件
120
+ * @param to 目标文件
121
+ */
122
+ rename(from: StorageFile, to: StorageFile): Promise<void>;
123
+ /**
124
+ * 列出已存在的文件
125
+ */
126
+ list(): Promise<StorageFile[]>;
127
+ /** 关闭适配器 */
128
+ close(): Promise<void>;
129
+ /**
130
+ * 读取逻辑文件全部内容
131
+ * @param file 逻辑文件名
132
+ */
133
+ private readAll;
134
+ /**
135
+ * 断言适配器未关闭
136
+ * @param operation 操作名
137
+ */
138
+ private assertOpen;
139
+ }
140
+ export {};
141
+ //# sourceMappingURL=OpfsStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OpfsStorageAdapter.d.ts","sourceRoot":"","sources":["../../../src/storage/opfs/OpfsStorageAdapter.ts"],"names":[],"mappings":"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"}