@yydb/light-db 0.0.10 → 0.0.12

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.
@@ -1,48 +1,104 @@
1
+ import { type WasmSession } from '@yydb/yydb-unknown-wasm32';
1
2
  import { type EmittableItem } from '@voml/vos';
2
3
  /** Schema 版本与文档。 */
3
4
  export interface SchemaVersion {
4
5
  version: number;
5
6
  document: string;
6
7
  }
8
+ /** One row from a scan. */
9
+ export interface ScanRow {
10
+ key: string;
11
+ value: Uint8Array;
12
+ }
13
+ /** Options for scan. */
14
+ export interface ScanOptions {
15
+ prefix?: string;
16
+ after?: string | null;
17
+ limit?: number;
18
+ }
19
+ /** One batch change. */
20
+ export interface BatchChange {
21
+ key: string;
22
+ value: Uint8Array | string | null;
23
+ }
24
+ /** Options for migrateSchema. */
25
+ export interface MigrateOptions {
26
+ renames?: ReadonlyArray<{
27
+ fromType: string;
28
+ toType: string;
29
+ } | {
30
+ type: string;
31
+ fromField: string;
32
+ toField: string;
33
+ }>;
34
+ }
7
35
  /** 打开浏览器数据库的选项。 */
8
- export interface LightDatabaseOptions {
36
+ export interface OpenOptions {
9
37
  /** 使用内存 session(测试专用;默认使用 OPFS 持久 session)。 */
10
38
  memory?: boolean;
11
39
  }
12
- /** 浏览器侧 YYDB 数据库句柄,委托给 Rust WASM 核心。 */
13
- export declare class BrowserDatabase {
40
+ /** Transaction-local handle for callback-style transactions. */
41
+ export declare class TransactionHandle {
42
+ private readonly session;
43
+ constructor(session: WasmSession);
44
+ private parseResult;
45
+ get(key: string): Promise<Uint8Array | null>;
46
+ put(key: string, value: Uint8Array | string): Promise<void>;
47
+ delete(key: string): Promise<void>;
48
+ scan(options?: ScanOptions): Promise<ScanRow[]>;
49
+ batch(changes: readonly BatchChange[]): Promise<void>;
50
+ compareExchange(key: string, expected: Uint8Array | string | null, replacement: Uint8Array | string | null): Promise<boolean>;
51
+ query<T = Record<string, unknown>>(source: string): Promise<T[]>;
52
+ execute(source: string): Promise<void>;
53
+ }
54
+ /**
55
+ * Browser/WASM 侧 YYDB 数据库句柄。
56
+ *
57
+ * 与 `@yydb/yydb` 的 {@link Database} 同名——宿主靠 import 来源区分:
58
+ *
59
+ * ```ts
60
+ * import { Database } from '@yydb/yydb'; // Node 原生
61
+ * import { Database } from '@yydb/light-db'; // 浏览器 WASM
62
+ * ```
63
+ */
64
+ export declare class Database {
14
65
  /** 数据库名(OPFS 路径)。 */
15
66
  readonly name: string;
16
67
  private readonly session;
17
68
  private constructor();
18
69
  /** 初始化 WASM 并打开一个 session(memory 或 OPFS persistent)。 */
19
- static open(name: string, options?: LightDatabaseOptions): Promise<BrowserDatabase>;
70
+ static open(name: string, options?: OpenOptions): Promise<Database>;
71
+ /** 解析 WASM JSON 结果,失败时转 LightDbError。 */
72
+ private parseResult;
20
73
  /** 读取已持久化的 schema,或 `null`。 */
21
- schema(): Promise<SchemaVersion | null>;
22
- /**
23
- * 声明 schema 文档。接受原始 `.vos` 源码字符串,或 `@voml/vos`
24
- * descriptor(`v.table()` / `v.class()`),或多个 descriptor。
25
- */
74
+ getSchema(): Promise<SchemaVersion | null>;
75
+ /** 声明 schema 文档。 */
26
76
  ensureSchema(...input: [string] | EmittableItem[]): Promise<void>;
27
77
  /** 读取键,或 `null`。 */
28
78
  get(key: string): Promise<Uint8Array | null>;
29
79
  /** 写入键。 */
30
- put(key: string, value: Uint8Array): Promise<void>;
31
- /** 删除键(底层等价 write_batch([(key, None)]))。 */
32
- delete(key: string): Promise<boolean>;
33
- /** 开启事务。 */
34
- begin(): Promise<void>;
35
- /** 提交事务。 */
36
- commit(): Promise<void>;
37
- /** 回滚事务。 */
38
- rollback(): Promise<void>;
80
+ put(key: string, value: Uint8Array | string): Promise<void>;
81
+ /** 删除键。 */
82
+ delete(key: string): Promise<void>;
83
+ /** 扫描键值对。 */
84
+ scan(options?: ScanOptions): Promise<ScanRow[]>;
85
+ /** 原子批量写入/删除。 */
86
+ batch(changes: readonly BatchChange[]): Promise<void>;
87
+ /** Compare-and-swap。 */
88
+ compareExchange(key: string, expected: Uint8Array | string | null, replacement: Uint8Array | string | null): Promise<boolean>;
89
+ /** Callback-style 事务:自动 begin/commit,异常自动 rollback。 */
90
+ transaction<T>(fn: (tx: TransactionHandle) => Promise<T>): Promise<T>;
91
+ /** 执行 VOS read pipeline,返回 typed rows。 */
92
+ query<T = Record<string, unknown>>(source: string): Promise<T[]>;
93
+ /** 执行 VOS write program。 */
94
+ execute(source: string): Promise<void>;
95
+ /** 发布新 schema 版本。 */
96
+ migrateSchema(documentOrSource: string | EmittableItem, ...rest: (EmittableItem | MigrateOptions)[]): Promise<void>;
39
97
  /** 执行检查点(折叠 WAL)。 */
40
98
  checkpoint(): Promise<void>;
41
- /** 数据库统计(暂不可用)。 */
42
- stats(): never;
43
99
  /** 关闭 session。 */
44
100
  close(): Promise<void>;
45
101
  }
46
- /** 打开浏览器数据库的便捷函数。 */
47
- export declare function openLightDatabase(name: string, options?: LightDatabaseOptions): Promise<BrowserDatabase>;
102
+ /** 打开浏览器数据库的便捷函数(等价于 {@link Database.open})。 */
103
+ export declare function openLightDatabase(name: string, options?: OpenOptions): Promise<Database>;
48
104
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/api/database.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAY3D,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,mBAAmB;AACnB,MAAM,WAAW,oBAAoB;IACjC,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAWD,wCAAwC;AACxC,qBAAa,eAAe;IACxB,qBAAqB;IACrB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C,OAAO;IAKP,wDAAwD;WACpC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,eAAe,CAAC;IAcpG,+BAA+B;IAClB,MAAM,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAWpD;;;OAGG;IACU,YAAY,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9E,oBAAoB;IACP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAmBzD,WAAW;IACE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/D,4CAA4C;IAC/B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlD,YAAY;IACC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC,YAAY;IACC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,YAAY;IACC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtC,qBAAqB;IACR,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxC,mBAAmB;IACZ,KAAK,IAAI,KAAK;IAIrB,kBAAkB;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC;AAED,qBAAqB;AACrB,wBAAsB,iBAAiB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACnC,OAAO,CAAC,eAAe,CAAC,CAE1B"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/api/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAIH,KAAK,WAAW,EACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAc3D,oBAAoB;AACpB,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,2BAA2B;AAC3B,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,CAAC;CACrB;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAwB;AACxB,MAAM,WAAW,WAAW;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;CACrC;AAED,iCAAiC;AACjC,MAAM,WAAW,cAAc;IAC3B,OAAO,CAAC,EAAE,aAAa,CACjB;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GACpC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CACzD,CAAC;CACL;AAED,mBAAmB;AACnB,MAAM,WAAW,WAAW;IACxB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,gEAAgE;AAChE,qBAAa,iBAAiB;IACd,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,WAAW;IAEjD,OAAO,CAAC,WAAW;IASb,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQ5C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IASnD,KAAK,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD,eAAe,CACjB,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAC3F,OAAO,CAAC,OAAO,CAAC;IAQb,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAMhE,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG/C;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;IACjB,qBAAqB;IACrB,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IAEtC,OAAO;IAKP,wDAAwD;WACpC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAcpF,yCAAyC;IACzC,OAAO,CAAC,WAAW;IASnB,+BAA+B;IAClB,SAAS,IAAI,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAMvD,oBAAoB;IACP,YAAY,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAK9E,oBAAoB;IACP,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQzD,WAAW;IACE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxE,WAAW;IACE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,aAAa;IACA,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAahE,iBAAiB;IACJ,KAAK,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE,wBAAwB;IACX,eAAe,CACxB,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,EAAE,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAC3F,OAAO,CAAC,OAAO,CAAC;IAQnB,uDAAuD;IAC1C,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAiBlF,0CAA0C;IAC7B,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAM7E,4BAA4B;IACf,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,qBAAqB;IACR,aAAa,CACtB,gBAAgB,EAAE,MAAM,GAAG,aAAa,EACxC,GAAG,IAAI,EAAE,CAAC,aAAa,GAAG,cAAc,CAAC,EAAE,GAC5C,OAAO,CAAC,IAAI,CAAC;IAsBhB,qBAAqB;IACR,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,kBAAkB;IACL,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC;AAED,gDAAgD;AAChD,wBAAsB,iBAAiB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAEnB"}
@@ -1,7 +1,81 @@
1
1
  import { initWasm, openPersistentSession, createMemorySession, } from '@yydb/yydb-unknown-wasm32';
2
2
  import { emitSource } from '@voml/vos';
3
- /** 浏览器侧 YYDB 数据库句柄,委托给 Rust WASM 核心。 */
4
- export class BrowserDatabase {
3
+ import { LightDbError } from '../errors/index.js';
4
+ /** Transaction-local handle for callback-style transactions. */
5
+ export class TransactionHandle {
6
+ session;
7
+ constructor(session) {
8
+ this.session = session;
9
+ }
10
+ parseResult(raw) {
11
+ const parsed = JSON.parse(raw);
12
+ if (!parsed.ok) {
13
+ const err = LightDbError.fromDiagnosticJson(parsed.error);
14
+ throw err ?? new Error(typeof parsed.error === 'string' ? parsed.error : 'wasm error');
15
+ }
16
+ return parsed;
17
+ }
18
+ async get(key) {
19
+ const raw = JSON.parse(this.session.get(key));
20
+ if (!raw.ok)
21
+ throw new Error(raw.error);
22
+ if (raw.value === null || raw.value === undefined)
23
+ return null;
24
+ if (Array.isArray(raw.value))
25
+ return new Uint8Array(raw.value);
26
+ return new Uint8Array(raw.value);
27
+ }
28
+ async put(key, value) {
29
+ const bytes = typeof value === 'string' ? new TextEncoder().encode(value) : value;
30
+ this.parseResult(this.session.put(key, bytes));
31
+ }
32
+ async delete(key) {
33
+ this.parseResult(this.session.delete(key));
34
+ }
35
+ async scan(options = {}) {
36
+ const raw = JSON.parse(this.session.scanPrefix(options.prefix ?? '', options.after ?? null, options.limit ?? 1000));
37
+ if (!raw.ok)
38
+ throw new Error(raw.error);
39
+ return (raw.rows ?? []).map((r) => ({
40
+ key: r.key,
41
+ value: new Uint8Array(r.value),
42
+ }));
43
+ }
44
+ async batch(changes) {
45
+ const body = changes.map((c) => ({
46
+ key: c.key,
47
+ value: c.value === null ? null : typeof c.value === 'string' ? Array.from(new TextEncoder().encode(c.value)) : Array.from(c.value),
48
+ }));
49
+ this.parseResult(this.session.writeBatch(new TextEncoder().encode(JSON.stringify(body))));
50
+ }
51
+ async compareExchange(key, expected, replacement) {
52
+ const toBytes = (v) => v === null ? null : typeof v === 'string' ? new TextEncoder().encode(v) : v;
53
+ const raw = JSON.parse(this.session.compareExchange(key, toBytes(expected), toBytes(replacement)));
54
+ if (!raw.ok)
55
+ throw new Error(raw.error);
56
+ return raw.success ?? false;
57
+ }
58
+ async query(source) {
59
+ const raw = JSON.parse(this.session.queryVos(source));
60
+ if (!raw.ok)
61
+ throw new Error(raw.error);
62
+ return (raw.rows ?? []);
63
+ }
64
+ async execute(source) {
65
+ this.parseResult(this.session.executeVosWrite(source));
66
+ }
67
+ }
68
+ /**
69
+ * Browser/WASM 侧 YYDB 数据库句柄。
70
+ *
71
+ * 与 `@yydb/yydb` 的 {@link Database} 同名——宿主靠 import 来源区分:
72
+ *
73
+ * ```ts
74
+ * import { Database } from '@yydb/yydb'; // Node 原生
75
+ * import { Database } from '@yydb/light-db'; // 浏览器 WASM
76
+ * ```
77
+ */
78
+ export class Database {
5
79
  /** 数据库名(OPFS 路径)。 */
6
80
  name;
7
81
  session;
@@ -15,106 +89,140 @@ export class BrowserDatabase {
15
89
  throw new Error('database name must not be empty');
16
90
  }
17
91
  await initWasm();
18
- const base = options.memory
92
+ const session = options.memory
19
93
  ? createMemorySession()
20
94
  : openPersistentSession(name);
21
- return new BrowserDatabase(name, base);
95
+ return new Database(name, session);
22
96
  }
23
- /** 读取已持久化的 schema,或 `null`。 */
24
- async schema() {
25
- const raw = JSON.parse(this.session.getSchema());
26
- if (!raw.ok) {
27
- throw new Error(raw.error ?? 'getSchema failed');
97
+ /** 解析 WASM JSON 结果,失败时转 LightDbError。 */
98
+ parseResult(raw) {
99
+ const parsed = JSON.parse(raw);
100
+ if (!parsed.ok) {
101
+ const err = LightDbError.fromDiagnosticJson(parsed.error);
102
+ throw err ?? new Error(typeof parsed.error === 'string' ? parsed.error : 'wasm error');
28
103
  }
29
- if (!raw.schema) {
104
+ return parsed;
105
+ }
106
+ /** 读取已持久化的 schema,或 `null`。 */
107
+ async getSchema() {
108
+ const raw = this.parseResult(this.session.getSchema());
109
+ if (!raw.schema)
30
110
  return null;
31
- }
32
111
  return raw.schema;
33
112
  }
34
- /**
35
- * 声明 schema 文档。接受原始 `.vos` 源码字符串,或 `@voml/vos`
36
- * descriptor(`v.table()` / `v.class()`),或多个 descriptor。
37
- */
113
+ /** 声明 schema 文档。 */
38
114
  async ensureSchema(...input) {
39
115
  const document = typeof input[0] === 'string' ? input[0] : emitSource(input);
40
- const raw = JSON.parse(this.session.ensureSchema(document));
41
- if (!raw.ok) {
42
- throw new Error(raw.error ?? 'ensureSchema failed');
43
- }
116
+ this.parseResult(this.session.ensureSchema(document));
44
117
  }
45
118
  /** 读取键,或 `null`。 */
46
119
  async get(key) {
47
120
  const raw = JSON.parse(this.session.get(key));
48
- if (!raw.ok) {
49
- throw new Error(raw.error ?? `get(${key}) failed`);
50
- }
51
- if (raw.value === null || raw.value === undefined) {
121
+ if (!raw.ok)
122
+ throw (LightDbError.fromDiagnosticJson(raw.error) ?? new Error(raw.error));
123
+ if (raw.value === null || raw.value === undefined)
52
124
  return null;
53
- }
54
- // WASM JSON 序列化为普通数组 [1, 2, 3, ...];转回 Uint8Array
55
- if (raw.value instanceof Uint8Array) {
56
- return raw.value;
57
- }
58
- if (Array.isArray(raw.value)) {
125
+ if (Array.isArray(raw.value))
59
126
  return new Uint8Array(raw.value);
60
- }
61
- // 兜底:如果是 base64 字符串等,尝试 new Uint8Array
62
127
  return new Uint8Array(raw.value);
63
128
  }
64
129
  /** 写入键。 */
65
130
  async put(key, value) {
66
- const raw = JSON.parse(this.session.put(key, value));
67
- if (!raw.ok) {
68
- throw new Error(raw.error ?? `put(${key}) failed`);
69
- }
131
+ const bytes = typeof value === 'string' ? new TextEncoder().encode(value) : value;
132
+ this.parseResult(this.session.put(key, bytes));
70
133
  }
71
- /** 删除键(底层等价 write_batch([(key, None)]))。 */
134
+ /** 删除键。 */
72
135
  async delete(key) {
73
- const raw = JSON.parse(this.session.delete(key));
74
- if (!raw.ok) {
75
- throw new Error(raw.error ?? `delete(${key}) failed`);
76
- }
77
- return true;
136
+ this.parseResult(this.session.delete(key));
78
137
  }
79
- /** 开启事务。 */
80
- async begin() {
81
- const raw = JSON.parse(this.session.begin());
82
- if (!raw.ok) {
83
- throw new Error(raw.error ?? 'begin failed');
84
- }
138
+ /** 扫描键值对。 */
139
+ async scan(options = {}) {
140
+ const raw = JSON.parse(this.session.scanPrefix(options.prefix ?? '', options.after ?? null, options.limit ?? 1000));
141
+ if (!raw.ok)
142
+ throw (LightDbError.fromDiagnosticJson(raw.error) ?? new Error(raw.error));
143
+ return (raw.rows ?? []).map((r) => ({
144
+ key: r.key,
145
+ value: new Uint8Array(r.value),
146
+ }));
147
+ }
148
+ /** 原子批量写入/删除。 */
149
+ async batch(changes) {
150
+ const body = changes.map((c) => ({
151
+ key: c.key,
152
+ value: c.value === null ? null : typeof c.value === 'string' ? Array.from(new TextEncoder().encode(c.value)) : Array.from(c.value),
153
+ }));
154
+ this.parseResult(this.session.writeBatch(new TextEncoder().encode(JSON.stringify(body))));
155
+ }
156
+ /** Compare-and-swap。 */
157
+ async compareExchange(key, expected, replacement) {
158
+ const toBytes = (v) => v === null ? null : typeof v === 'string' ? new TextEncoder().encode(v) : v;
159
+ const raw = JSON.parse(this.session.compareExchange(key, toBytes(expected), toBytes(replacement)));
160
+ if (!raw.ok)
161
+ throw (LightDbError.fromDiagnosticJson(raw.error) ?? new Error(raw.error));
162
+ return raw.success ?? false;
85
163
  }
86
- /** 提交事务。 */
87
- async commit() {
88
- const raw = JSON.parse(this.session.commit());
89
- if (!raw.ok) {
90
- throw new Error(raw.error ?? 'commit failed');
164
+ /** Callback-style 事务:自动 begin/commit,异常自动 rollback。 */
165
+ async transaction(fn) {
166
+ this.parseResult(this.session.begin());
167
+ const tx = new TransactionHandle(this.session);
168
+ try {
169
+ const result = await fn(tx);
170
+ this.parseResult(this.session.commit());
171
+ return result;
91
172
  }
173
+ catch (err) {
174
+ try {
175
+ this.session.rollback();
176
+ }
177
+ catch {
178
+ // don't mask original
179
+ }
180
+ throw err;
181
+ }
182
+ }
183
+ /** 执行 VOS read pipeline,返回 typed rows。 */
184
+ async query(source) {
185
+ const raw = JSON.parse(this.session.queryVos(source));
186
+ if (!raw.ok)
187
+ throw (LightDbError.fromDiagnosticJson(raw.error) ?? new Error(raw.error));
188
+ return (raw.rows ?? []);
92
189
  }
93
- /** 回滚事务。 */
94
- async rollback() {
95
- const raw = JSON.parse(this.session.rollback());
96
- if (!raw.ok) {
97
- throw new Error(raw.error ?? 'rollback failed');
190
+ /** 执行 VOS write program。 */
191
+ async execute(source) {
192
+ this.parseResult(this.session.executeVosWrite(source));
193
+ }
194
+ /** 发布新 schema 版本。 */
195
+ async migrateSchema(documentOrSource, ...rest) {
196
+ let document;
197
+ let options = {};
198
+ const all = [documentOrSource, ...rest];
199
+ const last = all[all.length - 1];
200
+ if (last && typeof last === 'object' &&
201
+ !('table' in last) &&
202
+ !('class' in last) &&
203
+ ('renames' in last || Object.keys(last).length === 0)) {
204
+ options = all.pop() ?? {};
205
+ }
206
+ if (typeof all[0] === 'string') {
207
+ document = all[0];
208
+ }
209
+ else {
210
+ document = emitSource(all);
98
211
  }
212
+ const renamesJson = options.renames?.length ? JSON.stringify(options.renames) : null;
213
+ this.parseResult(this.session.migrateSchema(document, renamesJson));
99
214
  }
100
215
  /** 执行检查点(折叠 WAL)。 */
101
216
  async checkpoint() {
102
- const raw = JSON.parse(this.session.checkpoint());
103
- if (!raw.ok) {
104
- throw new Error(raw.error ?? 'checkpoint failed');
105
- }
106
- }
107
- /** 数据库统计(暂不可用)。 */
108
- stats() {
109
- throw new Error('stats() is not available on the WASM core');
217
+ this.parseResult(this.session.checkpoint());
110
218
  }
111
219
  /** 关闭 session。 */
112
220
  async close() {
113
221
  this.session.close();
114
222
  }
115
223
  }
116
- /** 打开浏览器数据库的便捷函数。 */
224
+ /** 打开浏览器数据库的便捷函数(等价于 {@link Database.open})。 */
117
225
  export async function openLightDatabase(name, options = {}) {
118
- return BrowserDatabase.open(name, options);
226
+ return Database.open(name, options);
119
227
  }
120
228
  //# sourceMappingURL=database.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/api/database.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/api/database.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * api 层导出
3
3
  */
4
- export { BrowserDatabase, openLightDatabase } from './database';
4
+ export { Database, openLightDatabase } from './database';
5
+ export type { OpenOptions, ScanRow, ScanOptions, BatchChange, MigrateOptions } from './database';
5
6
  export { Transaction } from './transaction';
6
7
  export type { TransactionState } from './transaction';
7
8
  export { SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema } from './schema';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7H,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7H,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
package/dist/api/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * api 层导出
3
3
  */
4
- export { BrowserDatabase, openLightDatabase } from './database';
4
+ export { Database, openLightDatabase } from './database';
5
5
  export { Transaction } from './transaction';
6
6
  export { SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema } from './schema';
7
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,eAAe,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -2,7 +2,9 @@
2
2
  * 稳定错误模型
3
3
  *
4
4
  * 与 `@yydb/yydb` / `@yydb/yydb-client` 共用同一组错误码:宿主只按 `code` 分支,
5
- * `message` 只用于显示。
5
+ * `message` 只用于显示。所有边界表面(N-API reason field、WASM JSON envelope、
6
+ * wire protocol)都承载 `yydb::Error::to_json` 产生的同一 `{ code, operation,
7
+ * retryable, message, params? }` 合同。
6
8
  */
7
9
  /** 浏览器产品对外的稳定错误码 */
8
10
  export declare const LightDbErrorCodes: {
@@ -23,12 +25,12 @@ export declare const LightDbErrorCodes: {
23
25
  /** 存储配额不足 */
24
26
  readonly quotaExceeded: "yydb.quota.exceeded";
25
27
  };
26
- /**
27
- * 数据库错误选项
28
- */
28
+ /** 数据库错误选项 */
29
29
  export interface LightDbErrorOptions {
30
30
  /** 失败的操作(`schemaGet`、`kvPut` 等) */
31
31
  operation?: string;
32
+ /** 结构化参数(catalog 模板用) */
33
+ params?: Readonly<Record<string, string>>;
32
34
  /** 底层失败 */
33
35
  cause?: unknown;
34
36
  }
@@ -42,6 +44,25 @@ export declare class LightDbError extends Error {
42
44
  readonly operation: string;
43
45
  /** 是否可以用相同参数重试 */
44
46
  readonly retryable: boolean;
47
+ /** 结构化参数(存在时) */
48
+ readonly params?: Readonly<Record<string, string>>;
45
49
  constructor(code: string, message: string, options?: LightDbErrorOptions);
50
+ /**
51
+ * 解析 N-API / WASM 边界表面塞在 message 里的诊断 JSON。
52
+ *
53
+ * ```ts
54
+ * try {
55
+ * await db.put('key', value);
56
+ * } catch (err) {
57
+ * const parsed = LightDbError.fromDiagnosticJson(
58
+ * err instanceof Error ? err.message : String(err),
59
+ * );
60
+ * if (parsed) {
61
+ * // branch on parsed.code / retryable / operation
62
+ * }
63
+ * }
64
+ * ```
65
+ */
66
+ static fromDiagnosticJson(value: unknown): LightDbError | null;
46
67
  }
47
68
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,eAAO,MAAM,iBAAiB;IAC1B,aAAa;;IAEb,cAAc;;IAEd,yBAAyB;;IAEzB,mBAAmB;;IAEnB,eAAe;;IAEf,gBAAgB;;IAEhB,+BAA+B;;IAE/B,aAAa;;CAEP,CAAC;AAKX;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACnC,YAAY;IACZ,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,YAAY;IACZ,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,kBAAkB;IAClB,SAAgB,SAAS,EAAE,OAAO,CAAC;gBAEvB,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;CAQ/E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,oBAAoB;AACpB,eAAO,MAAM,iBAAiB;IAC1B,aAAa;;IAEb,cAAc;;IAEd,yBAAyB;;IAEzB,mBAAmB;;IAEnB,eAAe;;IAEf,gBAAgB;;IAEhB,+BAA+B;;IAE/B,aAAa;;CAEP,CAAC;AAWX,cAAc;AACd,MAAM,WAAW,mBAAmB;IAChC,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,WAAW;IACX,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IACnC,YAAY;IACZ,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B,YAAY;IACZ,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,kBAAkB;IAClB,SAAgB,SAAS,EAAE,OAAO,CAAC;IAEnC,iBAAiB;IACjB,SAAgB,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBAE9C,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB;IAY5E;;;;;;;;;;;;;;;OAeG;IACH,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,GAAG,IAAI;CAuCjE"}
@@ -2,7 +2,9 @@
2
2
  * 稳定错误模型
3
3
  *
4
4
  * 与 `@yydb/yydb` / `@yydb/yydb-client` 共用同一组错误码:宿主只按 `code` 分支,
5
- * `message` 只用于显示。
5
+ * `message` 只用于显示。所有边界表面(N-API reason field、WASM JSON envelope、
6
+ * wire protocol)都承载 `yydb::Error::to_json` 产生的同一 `{ code, operation,
7
+ * retryable, message, params? }` 合同。
6
8
  */
7
9
  /** 浏览器产品对外的稳定错误码 */
8
10
  export const LightDbErrorCodes = {
@@ -24,7 +26,13 @@ export const LightDbErrorCodes = {
24
26
  quotaExceeded: 'yydb.quota.exceeded',
25
27
  };
26
28
  /** 相同参数重试即可成功的错误码 */
27
- const RETRYABLE_CODES = new Set([LightDbErrorCodes.leaseUnavailable]);
29
+ const RETRYABLE_CODES = new Set([
30
+ LightDbErrorCodes.leaseUnavailable,
31
+ // WASM core 还可能返回这些 engine 码,LightDbError 也要认
32
+ 'yydb.lease.expired',
33
+ 'yydb.protocol',
34
+ 'yydb.cas.conflict',
35
+ ]);
28
36
  /**
29
37
  * 携带稳定错误码的数据库错误
30
38
  */
@@ -35,13 +43,79 @@ export class LightDbError extends Error {
35
43
  operation;
36
44
  /** 是否可以用相同参数重试 */
37
45
  retryable;
46
+ /** 结构化参数(存在时) */
47
+ params;
38
48
  constructor(code, message, options = {}) {
39
49
  super(message, { cause: options.cause });
40
50
  this.name = 'LightDbError';
41
51
  this.code = code;
42
52
  this.operation = options.operation ?? 'unknown';
43
53
  this.retryable = RETRYABLE_CODES.has(code);
54
+ if (options.params !== undefined) {
55
+ this.params = options.params;
56
+ }
44
57
  Object.setPrototypeOf(this, LightDbError.prototype);
45
58
  }
59
+ /**
60
+ * 解析 N-API / WASM 边界表面塞在 message 里的诊断 JSON。
61
+ *
62
+ * ```ts
63
+ * try {
64
+ * await db.put('key', value);
65
+ * } catch (err) {
66
+ * const parsed = LightDbError.fromDiagnosticJson(
67
+ * err instanceof Error ? err.message : String(err),
68
+ * );
69
+ * if (parsed) {
70
+ * // branch on parsed.code / retryable / operation
71
+ * }
72
+ * }
73
+ * ```
74
+ */
75
+ static fromDiagnosticJson(value) {
76
+ let obj;
77
+ if (typeof value === 'string') {
78
+ try {
79
+ const parsed = JSON.parse(value);
80
+ if (!parsed || typeof parsed !== 'object')
81
+ return null;
82
+ obj = parsed;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ else if (value && typeof value === 'object') {
89
+ obj = value;
90
+ }
91
+ else {
92
+ return null;
93
+ }
94
+ // WASM envelope 会是 { ok: false, error: { code, operation, ... } },
95
+ // 也可能直接 { code, operation, ... }。
96
+ let diag = obj;
97
+ if (typeof obj['ok'] === 'boolean' && !obj['ok'] && obj['error'] && typeof obj['error'] === 'object') {
98
+ diag = obj['error'];
99
+ }
100
+ const code = typeof diag['code'] === 'string' ? diag['code'] : null;
101
+ const message = typeof diag['message'] === 'string' ? diag['message'] : '';
102
+ if (!code)
103
+ return null;
104
+ const operation = typeof diag['operation'] === 'string' ? diag['operation'] : undefined;
105
+ const retryable = typeof diag['retryable'] === 'boolean' ? diag['retryable'] : undefined;
106
+ const params = diag['params'] && typeof diag['params'] === 'object'
107
+ ? diag['params']
108
+ : undefined;
109
+ const options = {};
110
+ if (operation !== undefined)
111
+ options.operation = operation;
112
+ if (params !== undefined)
113
+ options.params = params;
114
+ const err = new LightDbError(code, message, options);
115
+ if (typeof retryable === 'boolean') {
116
+ err.retryable = retryable;
117
+ }
118
+ return err;
119
+ }
46
120
  }
47
121
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,oBAAoB;AACpB,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,aAAa;IACb,EAAE,EAAE,SAAS;IACb,cAAc;IACd,OAAO,EAAE,cAAc;IACvB,yBAAyB;IACzB,cAAc,EAAE,sBAAsB;IACtC,mBAAmB;IACnB,aAAa,EAAE,qBAAqB;IACpC,eAAe;IACf,WAAW,EAAE,kBAAkB;IAC/B,gBAAgB;IAChB,aAAa,EAAE,qBAAqB;IACpC,+BAA+B;IAC/B,gBAAgB,EAAE,wBAAwB;IAC1C,aAAa;IACb,aAAa,EAAE,qBAAqB;CAC9B,CAAC;AAEX,qBAAqB;AACrB,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAC,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAY3F;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACnC,YAAY;IACI,IAAI,CAAS;IAE7B,YAAY;IACI,SAAS,CAAS;IAElC,kBAAkB;IACF,SAAS,CAAU;IAEnC,YAAY,IAAY,EAAE,OAAe,EAAE,UAA+B,EAAE;QACxE,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;CACJ"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -14,6 +14,6 @@ export { STORAGE_FILES, MemoryStorageAdapter, MemoryStorageBackend, OpfsStorageA
14
14
  export type { StorageAdapter, StorageAdapterFactory, StorageAdapterKind, StorageFile, StorageHandle, StorageOpenMode } from './storage';
15
15
  export { StorageEngine, DEFAULT_WAL_THRESHOLD, acquireWriterLease, listenDatabaseEvents } from './core';
16
16
  export type { CheckpointResult, LeaseMode, RecoveryOutcome, StorageEngineOptions, StorageEngineStats, TransactionState, DatabaseEvent, DatabaseEventType, WriterLease, } from './core';
17
- export { BrowserDatabase, openLightDatabase, Transaction, SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema, } from './api';
18
- export type { LightDatabase, LightDatabaseOptions, SchemaVersion } from './api';
17
+ export { Database, openLightDatabase, Transaction, SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema, } from './api';
18
+ export type { OpenOptions, ScanRow, ScanOptions, BatchChange, MigrateOptions, LightDatabase, LightDatabaseOptions, SchemaVersion } from './api';
19
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EACH,WAAW,EACX,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG9F,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGxI,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACxG,YAAY,EACR,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,WAAW,GACd,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,GACf,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3D,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAGpD,OAAO,EACH,WAAW,EACX,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,GAClB,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAG9F,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAGxI,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AACxG,YAAY,EACR,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,WAAW,GACd,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACH,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,GACf,MAAM,OAAO,CAAC;AACf,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC"}
package/dist/index.js CHANGED
@@ -15,5 +15,5 @@ export { STORAGE_FILES, MemoryStorageAdapter, MemoryStorageBackend, OpfsStorageA
15
15
  // 数据库语义
16
16
  export { StorageEngine, DEFAULT_WAL_THRESHOLD, acquireWriterLease, listenDatabaseEvents } from './core';
17
17
  // 作者面
18
- export { BrowserDatabase, openLightDatabase, Transaction, SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema, } from './api';
18
+ export { Database, openLightDatabase, Transaction, SCHEMA_KEY, RESERVED_KEY_PREFIX, documentVersion, parseSchemaDocument, encodeSchema, decodeSchema, } from './api';
19
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG3D,MAAM;AACN,OAAO,EACH,WAAW,EACX,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,GAClB,MAAM,SAAS,CAAC;AAGjB,SAAS;AACT,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACvB,MAAM,WAAW,CAAC;AAGnB,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAaxG,MAAM;AACN,OAAO,EACH,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,GACf,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO;AACP,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG3D,MAAM;AACN,OAAO,EACH,WAAW,EACX,UAAU,EACV,UAAU,EACV,qBAAqB,EACrB,KAAK,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,eAAe,EACf,eAAe,GAClB,MAAM,SAAS,CAAC;AAGjB,SAAS;AACT,OAAO,EACH,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,EACvB,8BAA8B,EAC9B,oBAAoB,GACvB,MAAM,WAAW,CAAC;AAGnB,QAAQ;AACR,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAaxG,MAAM;AACN,OAAO,EACH,QAAQ,EACR,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,GACf,MAAM,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yydb/light-db",
3
- "version": "0.0.10",
3
+ "version": "0.0.12",
4
4
  "description": "Light DB — browser-native YYDB database written in pure TypeScript",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",