edinburgh 0.5.0 → 0.6.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.
- package/README.md +322 -262
- package/build/src/datapack.d.ts +9 -9
- package/build/src/datapack.js +9 -9
- package/build/src/edinburgh.d.ts +18 -7
- package/build/src/edinburgh.js +30 -51
- package/build/src/edinburgh.js.map +1 -1
- package/build/src/indexes.d.ts +85 -205
- package/build/src/indexes.js +150 -503
- package/build/src/indexes.js.map +1 -1
- package/build/src/migrate.js +8 -10
- package/build/src/migrate.js.map +1 -1
- package/build/src/models.d.ts +152 -107
- package/build/src/models.js +433 -144
- package/build/src/models.js.map +1 -1
- package/build/src/types.d.ts +30 -48
- package/build/src/types.js +25 -24
- package/build/src/types.js.map +1 -1
- package/build/src/utils.d.ts +4 -4
- package/build/src/utils.js +4 -4
- package/package.json +1 -1
- package/skill/AnyModelClass.md +7 -0
- package/skill/FindOptions.md +37 -0
- package/skill/Lifecycle Hooks.md +24 -0
- package/skill/{Model_delete.md → Lifecycle Hooks_delete.md } +1 -1
- package/skill/{Model_getPrimaryKeyHash.md → Lifecycle Hooks_getPrimaryKeyHash.md } +1 -1
- package/skill/{Model_isValid.md → Lifecycle Hooks_isValid.md } +1 -1
- package/skill/Lifecycle Hooks_migrate.md +26 -0
- package/skill/{Model_preCommit.md → Lifecycle Hooks_preCommit.md } +2 -2
- package/skill/{Model_preventPersist.md → Lifecycle Hooks_preventPersist.md } +1 -1
- package/skill/{Model_validate.md → Lifecycle Hooks_validate.md } +2 -2
- package/skill/ModelBase.md +7 -0
- package/skill/ModelClass.md +8 -0
- package/skill/SKILL.md +180 -132
- package/skill/Schema Evolution.md +19 -0
- package/skill/TypeWrapper_containsNull.md +11 -0
- package/skill/TypeWrapper_deserialize.md +9 -0
- package/skill/TypeWrapper_getError.md +11 -0
- package/skill/TypeWrapper_serialize.md +10 -0
- package/skill/TypeWrapper_serializeType.md +9 -0
- package/skill/array.md +2 -2
- package/skill/defineModel.md +3 -2
- package/skill/deleteEverything.md +8 -0
- package/skill/field.md +3 -3
- package/skill/link.md +3 -3
- package/skill/literal.md +1 -1
- package/skill/opt.md +1 -1
- package/skill/or.md +1 -1
- package/skill/record.md +1 -1
- package/skill/set.md +2 -2
- package/skill/setOnSaveCallback.md +2 -2
- package/skill/transact.md +1 -1
- package/src/datapack.ts +9 -9
- package/src/edinburgh.ts +43 -52
- package/src/indexes.ts +251 -599
- package/src/migrate.ts +9 -10
- package/src/models.ts +528 -231
- package/src/types.ts +36 -34
- package/src/utils.ts +4 -4
- package/skill/BaseIndex.md +0 -16
- package/skill/BaseIndex_batchProcess.md +0 -10
- package/skill/BaseIndex_find.md +0 -7
- package/skill/BaseIndex_find_2.md +0 -7
- package/skill/BaseIndex_find_3.md +0 -7
- package/skill/BaseIndex_find_4.md +0 -7
- package/skill/Model.md +0 -20
- package/skill/Model_batchProcess.md +0 -8
- package/skill/Model_migrate.md +0 -32
- package/skill/Model_replaceInto.md +0 -16
- package/skill/NonPrimaryIndex.md +0 -10
- package/skill/SecondaryIndex.md +0 -9
- package/skill/UniqueIndex.md +0 -9
- package/skill/dump.md +0 -8
package/build/src/datapack.d.ts
CHANGED
|
@@ -17,21 +17,21 @@ export default class DataPack {
|
|
|
17
17
|
get _buffer(): Uint8Array;
|
|
18
18
|
/**
|
|
19
19
|
* Create a new DataPack instance.
|
|
20
|
-
* @param data
|
|
20
|
+
* @param data Optional initial data as Uint8Array or buffer size as number.
|
|
21
21
|
*/
|
|
22
22
|
constructor(data?: Uint8Array | number);
|
|
23
23
|
/**
|
|
24
24
|
* Helper function to write a multi-byte integer with length prefix
|
|
25
|
-
* @param value
|
|
26
|
-
* @param headerType
|
|
27
|
-
* @param invertBytes
|
|
28
|
-
* @param invertByteCount
|
|
25
|
+
* @param value The value to write
|
|
26
|
+
* @param headerType The type bits (0-7) for the header
|
|
27
|
+
* @param invertBytes Whether to invert bytes (for negative numbers)
|
|
28
|
+
* @param invertByteCount Whether to invert the byte count (for type 0)
|
|
29
29
|
*/
|
|
30
30
|
private writeMultiByteNumber;
|
|
31
31
|
/**
|
|
32
32
|
* Helper function to read a multi-byte integer with length prefix
|
|
33
|
-
* @param byteCount
|
|
34
|
-
* @param invertBytes
|
|
33
|
+
* @param byteCount Number of bytes to read
|
|
34
|
+
* @param invertBytes Whether to invert bytes (for negative numbers)
|
|
35
35
|
* @returns The read value
|
|
36
36
|
*/
|
|
37
37
|
private readMultiByteNumber;
|
|
@@ -69,7 +69,7 @@ export default class DataPack {
|
|
|
69
69
|
} | undefined): any;
|
|
70
70
|
/**
|
|
71
71
|
* Ensure the buffer has capacity for additional bytes.
|
|
72
|
-
* @param bytesNeeded
|
|
72
|
+
* @param bytesNeeded Number of additional bytes needed.
|
|
73
73
|
*/
|
|
74
74
|
private ensureCapacity;
|
|
75
75
|
readNumber(): number;
|
|
@@ -84,7 +84,7 @@ export default class DataPack {
|
|
|
84
84
|
/**
|
|
85
85
|
* Like writeString but writes without a length prefix and with a null terminator, for ordered storage.
|
|
86
86
|
* Can be read with {@link read} or {@link readString} just like any other string.
|
|
87
|
-
* @param str
|
|
87
|
+
* @param str The string to write. May not contain null characters.
|
|
88
88
|
*/
|
|
89
89
|
writeOrderedString(str: string): DataPack;
|
|
90
90
|
toUint8Array(copyBuffer?: boolean, startPos?: number, endPos?: number): Uint8Array;
|
package/build/src/datapack.js
CHANGED
|
@@ -34,7 +34,7 @@ export default class DataPack {
|
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
36
|
* Create a new DataPack instance.
|
|
37
|
-
* @param data
|
|
37
|
+
* @param data Optional initial data as Uint8Array or buffer size as number.
|
|
38
38
|
*/
|
|
39
39
|
constructor(data = 1900) {
|
|
40
40
|
if (data instanceof Uint8Array) {
|
|
@@ -47,10 +47,10 @@ export default class DataPack {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Helper function to write a multi-byte integer with length prefix
|
|
50
|
-
* @param value
|
|
51
|
-
* @param headerType
|
|
52
|
-
* @param invertBytes
|
|
53
|
-
* @param invertByteCount
|
|
50
|
+
* @param value The value to write
|
|
51
|
+
* @param headerType The type bits (0-7) for the header
|
|
52
|
+
* @param invertBytes Whether to invert bytes (for negative numbers)
|
|
53
|
+
* @param invertByteCount Whether to invert the byte count (for type 0)
|
|
54
54
|
*/
|
|
55
55
|
writeMultiByteNumber(value, headerType, invertBytes = false, invertByteCount = false) {
|
|
56
56
|
let byteCount = 0;
|
|
@@ -74,8 +74,8 @@ export default class DataPack {
|
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
76
|
* Helper function to read a multi-byte integer with length prefix
|
|
77
|
-
* @param byteCount
|
|
78
|
-
* @param invertBytes
|
|
77
|
+
* @param byteCount Number of bytes to read
|
|
78
|
+
* @param invertBytes Whether to invert bytes (for negative numbers)
|
|
79
79
|
* @returns The read value
|
|
80
80
|
*/
|
|
81
81
|
readMultiByteNumber(byteCount, invertBytes = false) {
|
|
@@ -386,7 +386,7 @@ export default class DataPack {
|
|
|
386
386
|
}
|
|
387
387
|
/**
|
|
388
388
|
* Ensure the buffer has capacity for additional bytes.
|
|
389
|
-
* @param bytesNeeded
|
|
389
|
+
* @param bytesNeeded Number of additional bytes needed.
|
|
390
390
|
*/
|
|
391
391
|
ensureCapacity(bytesNeeded) {
|
|
392
392
|
const needed = this.writePos + bytesNeeded;
|
|
@@ -498,7 +498,7 @@ export default class DataPack {
|
|
|
498
498
|
/**
|
|
499
499
|
* Like writeString but writes without a length prefix and with a null terminator, for ordered storage.
|
|
500
500
|
* Can be read with {@link read} or {@link readString} just like any other string.
|
|
501
|
-
* @param str
|
|
501
|
+
* @param str The string to write. May not contain null characters.
|
|
502
502
|
*/
|
|
503
503
|
writeOrderedString(str) {
|
|
504
504
|
const utf8Bytes = new TextEncoder().encode(str);
|
package/build/src/edinburgh.d.ts
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
export { Model, defineModel,
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
export { Model, type ModelClass, type AnyModelClass, type ModelBase, defineModel, deleteEverything, field, } from "./models.js";
|
|
3
3
|
import type { Change, Model } from "./models.js";
|
|
4
4
|
export { string, orderedString, number, dateTime, boolean, identifier, undef, opt, or, array, set, record, literal, link, } from "./types.js";
|
|
5
5
|
export { dump, } from "./indexes.js";
|
|
6
|
-
export {
|
|
6
|
+
export type { FindOptions, IndexRangeIterator } from './indexes.js';
|
|
7
7
|
export { type Change } from './models.js';
|
|
8
|
-
export type {
|
|
8
|
+
export type { FieldConfig } from './models.js';
|
|
9
|
+
export { TypeWrapper } from './types.js';
|
|
9
10
|
export { DatabaseError } from "olmdb/lowlevel";
|
|
10
11
|
export { runMigration } from './migrate.js';
|
|
11
12
|
export type { MigrationOptions, MigrationResult } from './migrate.js';
|
|
13
|
+
export interface Transaction {
|
|
14
|
+
id: number;
|
|
15
|
+
instances: Map<number, Model<unknown>>;
|
|
16
|
+
}
|
|
17
|
+
export declare const txnStorage: AsyncLocalStorage<Transaction>;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the current transaction from AsyncLocalStorage.
|
|
20
|
+
* Throws if called outside a transact() callback.
|
|
21
|
+
* @internal
|
|
22
|
+
*/
|
|
23
|
+
export declare function currentTxn(): Transaction;
|
|
12
24
|
/**
|
|
13
25
|
* Initialize the database with the specified directory path.
|
|
14
26
|
* This function may be called multiple times with the same parameters. If it is not called before the first transact(),
|
|
@@ -32,7 +44,7 @@ export declare function init(dbDir: string): void;
|
|
|
32
44
|
* times.
|
|
33
45
|
*
|
|
34
46
|
* @template T - The return type of the transaction function.
|
|
35
|
-
* @param fn
|
|
47
|
+
* @param fn The function to execute within the transaction context. Receives a Transaction instance.
|
|
36
48
|
* @returns A promise that resolves with the function's return value.
|
|
37
49
|
* @throws {DatabaseError} With code "RACING_TRANSACTION" if the transaction fails after retries due to conflicts.
|
|
38
50
|
* @throws {DatabaseError} With code "TXN_LIMIT" if maximum number of transactions is reached.
|
|
@@ -73,5 +85,4 @@ export declare function setMaxRetryCount(count: number): void;
|
|
|
73
85
|
* - A sequential number. Higher numbers have been committed after lower numbers.
|
|
74
86
|
* - A map of model instances to their changes. The change can be "created", "deleted", or an object containing the old values.
|
|
75
87
|
*/
|
|
76
|
-
export declare function setOnSaveCallback(callback: ((commitId: number, items: Map<Model<
|
|
77
|
-
export declare function deleteEverything(): Promise<void>;
|
|
88
|
+
export declare function setOnSaveCallback(callback: ((commitId: number, items: Map<Model<unknown>, Change>) => void) | undefined): void;
|
package/build/src/edinburgh.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import * as lowlevel from "olmdb/lowlevel";
|
|
2
2
|
import { init as olmdbInit, DatabaseError } from "olmdb/lowlevel";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
export function scheduleInit() { initNeeded = true; }
|
|
3
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
|
+
import { pendingModelInits } from "./models.js";
|
|
6
5
|
// Re-export public API from models
|
|
7
|
-
export { Model, defineModel,
|
|
6
|
+
export { Model, defineModel, deleteEverything, field, } from "./models.js";
|
|
8
7
|
// Re-export public API from types (only factory functions and instances)
|
|
9
8
|
export {
|
|
10
9
|
// Pre-defined type instances
|
|
@@ -13,9 +12,21 @@ string, orderedString, number, dateTime, boolean, identifier, undef,
|
|
|
13
12
|
opt, or, array, set, record, literal, link, } from "./types.js";
|
|
14
13
|
// Re-export public API from indexes
|
|
15
14
|
export { dump, } from "./indexes.js";
|
|
16
|
-
export {
|
|
15
|
+
export { TypeWrapper } from './types.js';
|
|
17
16
|
export { DatabaseError } from "olmdb/lowlevel";
|
|
18
17
|
export { runMigration } from './migrate.js';
|
|
18
|
+
export const txnStorage = new AsyncLocalStorage();
|
|
19
|
+
/**
|
|
20
|
+
* Returns the current transaction from AsyncLocalStorage.
|
|
21
|
+
* Throws if called outside a transact() callback.
|
|
22
|
+
* @internal
|
|
23
|
+
*/
|
|
24
|
+
export function currentTxn() {
|
|
25
|
+
const txn = txnStorage.getStore();
|
|
26
|
+
if (!txn)
|
|
27
|
+
throw new DatabaseError("No active transaction. Operations must be performed within a transact() callback.", 'NO_TRANSACTION');
|
|
28
|
+
return txn;
|
|
29
|
+
}
|
|
19
30
|
let olmdbReady = false;
|
|
20
31
|
let maxRetryCount = 6;
|
|
21
32
|
/**
|
|
@@ -50,7 +61,7 @@ const STALE_INSTANCE_DESCRIPTOR = {
|
|
|
50
61
|
* times.
|
|
51
62
|
*
|
|
52
63
|
* @template T - The return type of the transaction function.
|
|
53
|
-
* @param fn
|
|
64
|
+
* @param fn The function to execute within the transaction context. Receives a Transaction instance.
|
|
54
65
|
* @returns A promise that resolves with the function's return value.
|
|
55
66
|
* @throws {DatabaseError} With code "RACING_TRANSACTION" if the transaction fails after retries due to conflicts.
|
|
56
67
|
* @throws {DatabaseError} With code "TXN_LIMIT" if maximum number of transactions is reached.
|
|
@@ -76,8 +87,7 @@ const STALE_INSTANCE_DESCRIPTOR = {
|
|
|
76
87
|
* ```
|
|
77
88
|
*/
|
|
78
89
|
export async function transact(fn) {
|
|
79
|
-
while (
|
|
80
|
-
// Make sure only one async task is doing the inits, the rest should wait for it
|
|
90
|
+
while (pendingModelInits.size || pendingInit) {
|
|
81
91
|
if (pendingInit) {
|
|
82
92
|
await pendingInit;
|
|
83
93
|
}
|
|
@@ -86,9 +96,10 @@ export async function transact(fn) {
|
|
|
86
96
|
if (!olmdbReady)
|
|
87
97
|
olmdbInit('.edinburgh');
|
|
88
98
|
olmdbReady = true;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
99
|
+
const models = [...pendingModelInits];
|
|
100
|
+
pendingModelInits.clear();
|
|
101
|
+
for (const model of models) {
|
|
102
|
+
await model._initialize();
|
|
92
103
|
}
|
|
93
104
|
})();
|
|
94
105
|
await pendingInit;
|
|
@@ -98,22 +109,23 @@ export async function transact(fn) {
|
|
|
98
109
|
// try {
|
|
99
110
|
for (let retryCount = 0; retryCount < maxRetryCount; retryCount++) {
|
|
100
111
|
const txnId = lowlevel.startTransaction();
|
|
101
|
-
const txn = { id: txnId, instances: new
|
|
112
|
+
const txn = { id: txnId, instances: new Map() };
|
|
102
113
|
const onSaveItems = onSaveCallback ? new Map() : undefined;
|
|
103
114
|
let result;
|
|
104
115
|
try {
|
|
105
116
|
await txnStorage.run(txn, async function () {
|
|
106
117
|
result = await fn();
|
|
107
118
|
// Call preCommit() on all instances before writing.
|
|
108
|
-
// Note:
|
|
119
|
+
// Note: Map iteration visits newly added items, so preCommit() creating
|
|
109
120
|
// new instances is handled correctly.
|
|
110
|
-
for (const instance of txn.instances) {
|
|
111
|
-
instance.
|
|
121
|
+
for (const instance of txn.instances.values()) {
|
|
122
|
+
if (instance._oldValues !== false)
|
|
123
|
+
instance.preCommit?.();
|
|
112
124
|
}
|
|
113
125
|
// Save all modified instances before committing
|
|
114
126
|
// This needs to happen inside txnStorage.run, because resolving default values
|
|
115
127
|
// for identifiers requires database access.
|
|
116
|
-
for (const instance of txn.instances) {
|
|
128
|
+
for (const instance of txn.instances.values()) {
|
|
117
129
|
const change = instance._write(txn);
|
|
118
130
|
if (onSaveItems && change) {
|
|
119
131
|
onSaveItems.set(instance, change);
|
|
@@ -130,14 +142,14 @@ export async function transact(fn) {
|
|
|
130
142
|
}
|
|
131
143
|
finally {
|
|
132
144
|
// Make the instances read-only to make it clear that their transaction has ended.
|
|
133
|
-
for (const instance of txn.instances) {
|
|
145
|
+
for (const instance of txn.instances.values()) {
|
|
134
146
|
delete instance._oldValues;
|
|
135
147
|
Object.defineProperty(instance, "_txn", STALE_INSTANCE_DESCRIPTOR);
|
|
136
148
|
Object.freeze(instance);
|
|
137
149
|
}
|
|
138
150
|
// Destroy the transaction object, to make sure things crash if they are used after
|
|
139
151
|
// this point, and to help the GC reclaim memory.
|
|
140
|
-
txn.id = txn.instances =
|
|
152
|
+
txn.id = txn.instances = undefined;
|
|
141
153
|
}
|
|
142
154
|
const commitResult = lowlevel.commitTransaction(txnId);
|
|
143
155
|
const commitSeq = typeof commitResult === 'number' ? commitResult : await commitResult;
|
|
@@ -179,37 +191,4 @@ let onSaveCallback;
|
|
|
179
191
|
export function setOnSaveCallback(callback) {
|
|
180
192
|
onSaveCallback = callback;
|
|
181
193
|
}
|
|
182
|
-
export async function deleteEverything() {
|
|
183
|
-
let done = false;
|
|
184
|
-
while (!done) {
|
|
185
|
-
await transact(() => {
|
|
186
|
-
const txn = currentTxn();
|
|
187
|
-
const iteratorId = lowlevel.createIterator(txn.id, undefined, undefined, false);
|
|
188
|
-
const deadline = Date.now() + 150;
|
|
189
|
-
let count = 0;
|
|
190
|
-
try {
|
|
191
|
-
while (true) {
|
|
192
|
-
const raw = lowlevel.readIterator(iteratorId);
|
|
193
|
-
if (!raw) {
|
|
194
|
-
done = true;
|
|
195
|
-
break;
|
|
196
|
-
}
|
|
197
|
-
lowlevel.del(txn.id, raw.key);
|
|
198
|
-
if (++count >= 4096 || Date.now() >= deadline)
|
|
199
|
-
break;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
finally {
|
|
203
|
-
lowlevel.closeIterator(iteratorId);
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
// Re-init indexes since metadata was deleted
|
|
208
|
-
for (const model of Object.values(modelRegistry)) {
|
|
209
|
-
if (!model.fields)
|
|
210
|
-
continue;
|
|
211
|
-
model._resetIndexes();
|
|
212
|
-
await model._loadCreateIndexes();
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
194
|
//# sourceMappingURL=edinburgh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edinburgh.js","sourceRoot":"","sources":["../../src/edinburgh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"edinburgh.js","sourceRoot":"","sources":["../../src/edinburgh.ts"],"names":[],"mappings":"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"}
|