toilscript 0.1.57 → 0.1.58
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/cli.js +53 -3
- package/dist/cli.js.map +2 -2
- package/dist/importmap.json +2 -2
- package/dist/toilscript.js +1 -1
- package/dist/toilscript.js.map +2 -2
- package/dist/web.js +3 -3
- package/package.json +1 -1
- package/std/assembly/bindings/toildb.ts +14 -0
- package/std/assembly/toildb.ts +36 -0
- package/std/assembly/toilscript.d.ts +17 -0
package/dist/web.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
var ASSEMBLYSCRIPT_VERSION = "0.1.
|
|
1
|
+
var ASSEMBLYSCRIPT_VERSION = "0.1.58";
|
|
2
2
|
var ASSEMBLYSCRIPT_IMPORTMAP = {
|
|
3
3
|
"imports": {
|
|
4
|
-
"toilscript": "https://cdn.jsdelivr.net/npm/toilscript@0.1.
|
|
5
|
-
"toilscript/cli": "https://cdn.jsdelivr.net/npm/toilscript@0.1.
|
|
4
|
+
"toilscript": "https://cdn.jsdelivr.net/npm/toilscript@0.1.58/dist/toilscript.js",
|
|
5
|
+
"toilscript/cli": "https://cdn.jsdelivr.net/npm/toilscript@0.1.58/dist/cli.js",
|
|
6
6
|
"binaryen": "https://cdn.jsdelivr.net/npm/binaryen@130.0.0-nightly.20260609/index.js",
|
|
7
7
|
"long": "https://cdn.jsdelivr.net/npm/long@5.3.2/index.js"
|
|
8
8
|
}
|
package/package.json
CHANGED
|
@@ -71,6 +71,20 @@ export namespace toildbHost {
|
|
|
71
71
|
idemPtr: usize
|
|
72
72
|
): i32;
|
|
73
73
|
|
|
74
|
+
// record.upsert -> 0 created | 1 updated | 2 @unique-conflict (not written) |
|
|
75
|
+
// negative error. A single blind last-writer-wins put: creates the row if
|
|
76
|
+
// absent, overwrites it if present, in ONE op (no create-then-patch round trip).
|
|
77
|
+
// @ts-ignore: decorator
|
|
78
|
+
@external("env", "data.upsert")
|
|
79
|
+
export declare function upsert(
|
|
80
|
+
handle: u32,
|
|
81
|
+
keyPtr: usize,
|
|
82
|
+
keyLen: i32,
|
|
83
|
+
valPtr: usize,
|
|
84
|
+
valLen: i32,
|
|
85
|
+
idemPtr: usize
|
|
86
|
+
): i32;
|
|
87
|
+
|
|
74
88
|
// record.delete -> 0 ok | negative error.
|
|
75
89
|
// @ts-ignore: decorator
|
|
76
90
|
@external("env", "data.delete")
|
package/std/assembly/toildb.ts
CHANGED
|
@@ -75,6 +75,18 @@ function __toildbTakeGrow(): Uint8Array {
|
|
|
75
75
|
/// A mutable keyed-entity collection (spec 7.1). `V` is the `@data` value type,
|
|
76
76
|
/// `K` the `@data` key type.
|
|
77
77
|
@global
|
|
78
|
+
/// The outcome of `Documents.upsert` (spec 8.3). The wire bytes are pinned in the
|
|
79
|
+
/// host ABI (`data.upsert`): a non-negative tag the guest returns as-is.
|
|
80
|
+
export enum UpsertResult {
|
|
81
|
+
/// The row did not exist and was created.
|
|
82
|
+
Created = 0,
|
|
83
|
+
/// The row already existed and was overwritten.
|
|
84
|
+
Updated = 1,
|
|
85
|
+
/// A `@unique` field value is already owned by a DIFFERENT record; nothing was
|
|
86
|
+
/// written (the only outcome an upsert cannot auto-resolve).
|
|
87
|
+
Conflict = 2,
|
|
88
|
+
}
|
|
89
|
+
|
|
78
90
|
export class Documents<K, V> {
|
|
79
91
|
private __handle: u32;
|
|
80
92
|
|
|
@@ -158,6 +170,30 @@ export class Documents<K, V> {
|
|
|
158
170
|
) == 0;
|
|
159
171
|
}
|
|
160
172
|
|
|
173
|
+
/// Create-or-overwrite in ONE op (spec 8.3): a blind last-writer-wins put that
|
|
174
|
+
/// creates the row if absent or overwrites it if present, replacing the two-op
|
|
175
|
+
/// `if (!create(k,v)) patch(k,v)` idiom. Returns `UpsertResult.Created` or
|
|
176
|
+
/// `.Updated`; on a `@unique` collection, `.Conflict` when the value's unique
|
|
177
|
+
/// field is already held by ANOTHER record (nothing is written).
|
|
178
|
+
///
|
|
179
|
+
/// The write is blind: it stores `value` as-is, so concurrent upserts do not
|
|
180
|
+
/// conflict or retry - the later one wins and overwrites the earlier. Correct
|
|
181
|
+
/// for writing a whole value (a profile, a settings blob); wrong for a
|
|
182
|
+
/// read-modify-write of accumulating state (a balance, a like count), where a
|
|
183
|
+
/// concurrent write would be lost - use `counter.add` or version-checked
|
|
184
|
+
/// `patch` there. A lost write is a data-integrity concern, not a boundary one:
|
|
185
|
+
/// the key is tenant-scoped, so a race is only ever one tenant's own concurrent
|
|
186
|
+
/// writes, and `@unique` stays race-safe (claim-once at the value's home).
|
|
187
|
+
upsert(key: K, value: V): UpsertResult {
|
|
188
|
+
const kb = key.encode();
|
|
189
|
+
const vb = value.encode();
|
|
190
|
+
const status = toildbHost.upsert(
|
|
191
|
+
this.__handle, kb.dataStart, kb.byteLength, vb.dataStart, vb.byteLength, 0
|
|
192
|
+
);
|
|
193
|
+
if (status < 0) unreachable();
|
|
194
|
+
return <UpsertResult>status;
|
|
195
|
+
}
|
|
196
|
+
|
|
161
197
|
/// Apply a write through the key's home cell; returns the stored record.
|
|
162
198
|
patch(key: K, value: V): V {
|
|
163
199
|
const kb = key.encode();
|
|
@@ -229,6 +229,16 @@ declare function admin(target: Object, propertyKey: string | symbol, descriptor:
|
|
|
229
229
|
// User>` and `App.users.get(...)`. Every handle is KEY-FIRST (`<K, V>`, matching
|
|
230
230
|
// `Map`/`Record`). `K`/`V`/`M` are `@data` types (the codec the host marshals).
|
|
231
231
|
|
|
232
|
+
/** The outcome of `Documents.upsert` (spec 8.3). */
|
|
233
|
+
declare const enum UpsertResult {
|
|
234
|
+
/** The row did not exist and was created. */
|
|
235
|
+
Created = 0,
|
|
236
|
+
/** The row already existed and was overwritten. */
|
|
237
|
+
Updated = 1,
|
|
238
|
+
/** A `@unique` field value is already owned by another record; nothing written. */
|
|
239
|
+
Conflict = 2,
|
|
240
|
+
}
|
|
241
|
+
|
|
232
242
|
/** A mutable keyed-entity collection (spec 7.1): user profiles, items, sessions. */
|
|
233
243
|
declare class Documents<K, V> {
|
|
234
244
|
get(key: K): V | null;
|
|
@@ -237,6 +247,13 @@ declare class Documents<K, V> {
|
|
|
237
247
|
getMany(keys: K[]): (V | null)[];
|
|
238
248
|
create(key: K, value: V): bool;
|
|
239
249
|
patch(key: K, value: V): V;
|
|
250
|
+
/** Create-or-overwrite in one op (blind last-writer-wins); replaces the two-op
|
|
251
|
+
* `if (!create(k,v)) patch(k,v)` idiom. Right for writing a whole value; wrong
|
|
252
|
+
* for read-modify-write of accumulating state (a balance/count), where a
|
|
253
|
+
* concurrent write would be lost - use `counter.add` or version-checked
|
|
254
|
+
* `patch` there. The key is tenant-scoped, so a race is only ever the same
|
|
255
|
+
* tenant's own writes. See {@link UpsertResult}. */
|
|
256
|
+
upsert(key: K, value: V): UpsertResult;
|
|
240
257
|
delete(key: K): void;
|
|
241
258
|
getDelete(key: K): V | null;
|
|
242
259
|
}
|