toilscript 0.1.27 → 0.1.29

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/web.js CHANGED
@@ -1,8 +1,8 @@
1
- var ASSEMBLYSCRIPT_VERSION = "0.1.27";
1
+ var ASSEMBLYSCRIPT_VERSION = "0.1.29";
2
2
  var ASSEMBLYSCRIPT_IMPORTMAP = {
3
3
  "imports": {
4
- "toilscript": "https://cdn.jsdelivr.net/npm/toilscript@0.1.27/dist/toilscript.js",
5
- "toilscript/cli": "https://cdn.jsdelivr.net/npm/toilscript@0.1.27/dist/cli.js",
4
+ "toilscript": "https://cdn.jsdelivr.net/npm/toilscript@0.1.29/dist/toilscript.js",
5
+ "toilscript/cli": "https://cdn.jsdelivr.net/npm/toilscript@0.1.29/dist/cli.js",
6
6
  "binaryen": "https://cdn.jsdelivr.net/npm/binaryen@129.0.0-nightly.20260428/index.js",
7
7
  "long": "https://cdn.jsdelivr.net/npm/long@5.3.2/index.js"
8
8
  }
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "toilscript",
9
9
  "wasm"
10
10
  ],
11
- "version": "0.1.27",
11
+ "version": "0.1.29",
12
12
  "author": "Daniel Wirtz <dcode+assemblyscript@dcode.io>",
13
13
  "license": "Apache-2.0",
14
14
  "homepage": "https://github.com/dacely-cloud/toilscript",
@@ -0,0 +1,230 @@
1
+ // Host-import declarations for the ToilDB data API. The production edge
2
+ // (toil-backend `src/wasm/host/import_functions/db`) and the toiljs dev server
3
+ // both provide these under the `env` namespace. All byte regions are passed as
4
+ // a (pointer, length) pair into guest linear memory.
5
+ //
6
+ // Collections are resolved by name ONCE at module init (`resolveCollection`),
7
+ // which returns an opaque numeric handle; request-time ops pass the handle.
8
+ //
9
+ // Return convention (see toildb/ABI.md):
10
+ // >= 0 success: a length (a value stashed for `takeResult`), a count, a
11
+ // boolean (0/1), a tag, or 0 (ok).
12
+ // -1 output buffer too small (retry `takeResult` with a bigger buffer).
13
+ // -2 absent (a normal null / not-found).
14
+ // <= -1000 a typed failure; the diagnostic is TDL(|v| - 1000).
15
+ //
16
+ // Variable-length results (a fetched value, a patched record, a claim owner)
17
+ // use the two-step pull: the op returns the stashed length, then the guest
18
+ // allocates a buffer and calls `takeResult` to copy the bytes out.
19
+ //
20
+ // `idemPtr` is 0 for none, otherwise a pointer to a 16-byte idempotency key.
21
+ //
22
+ // This is the guest half of the ABI contract; the byte framing of keys/values
23
+ // is the `@data` binary codec (`DataWriter`/`DataReader`).
24
+
25
+ export namespace toildbHost {
26
+ // Resolve a collection by its "<db>/<collection>" name; writes the u32 handle
27
+ // to outHandlePtr. Returns 0 on success or a negative TDL code.
28
+ // @ts-ignore: decorator
29
+ @external("env", "data.resolve_collection")
30
+ export declare function resolveCollection(namePtr: usize, nameLen: i32, outHandlePtr: usize): i32;
31
+
32
+ // record.get -> value length (stashed) | -2 absent | negative error.
33
+ // @ts-ignore: decorator
34
+ @external("env", "data.get")
35
+ export declare function get(handle: u32, keyPtr: usize, keyLen: i32): i32;
36
+
37
+ // record bounded multi-get. Input at keysPtr: u32 count + per key (u32 len +
38
+ // bytes). Result (stashed): u32 count + per item u8 present (+ u32 len + bytes
39
+ // when present), in request order. Returns the stashed length | negative error.
40
+ // @ts-ignore: decorator
41
+ @external("env", "data.get_many")
42
+ export declare function getMany(handle: u32, keysPtr: usize, keysLen: i32): i32;
43
+
44
+ // record.exists -> 1 | 0 | negative error.
45
+ // @ts-ignore: decorator
46
+ @external("env", "data.exists")
47
+ export declare function exists(handle: u32, keyPtr: usize, keyLen: i32): i32;
48
+
49
+ // record.create -> 0 ok | AlreadyExists/typed code.
50
+ // @ts-ignore: decorator
51
+ @external("env", "data.create")
52
+ export declare function create(
53
+ handle: u32,
54
+ keyPtr: usize,
55
+ keyLen: i32,
56
+ valPtr: usize,
57
+ valLen: i32,
58
+ idemPtr: usize
59
+ ): i32;
60
+
61
+ // record.patch -> length of the new record (stashed) | negative error.
62
+ // @ts-ignore: decorator
63
+ @external("env", "data.patch")
64
+ export declare function patch(
65
+ handle: u32,
66
+ keyPtr: usize,
67
+ keyLen: i32,
68
+ patchPtr: usize,
69
+ patchLen: i32,
70
+ idemPtr: usize
71
+ ): i32;
72
+
73
+ // record.delete -> 0 ok | negative error.
74
+ // @ts-ignore: decorator
75
+ @external("env", "data.delete")
76
+ export declare function del(handle: u32, keyPtr: usize, keyLen: i32, idemPtr: usize): i32;
77
+
78
+ // record consume-once fetch-and-delete -> prior value length (stashed) | -2.
79
+ // @ts-ignore: decorator
80
+ @external("env", "data.get_delete")
81
+ export declare function getDelete(handle: u32, keyPtr: usize, keyLen: i32, idemPtr: usize): i32;
82
+
83
+ // unique.lookup -> owner value length (stashed) | -2 absent.
84
+ // @ts-ignore: decorator
85
+ @external("env", "data.unique_lookup")
86
+ export declare function uniqueLookup(handle: u32, keyPtr: usize, keyLen: i32): i32;
87
+
88
+ // unique.claim -> 0 Claimed | 1 AlreadyClaimed (owner stashed) | 2 owned-by-caller | neg.
89
+ // @ts-ignore: decorator
90
+ @external("env", "data.unique_claim")
91
+ export declare function uniqueClaim(
92
+ handle: u32,
93
+ keyPtr: usize,
94
+ keyLen: i32,
95
+ valPtr: usize,
96
+ valLen: i32,
97
+ idemPtr: usize
98
+ ): i32;
99
+
100
+ // unique.release -> 0 ok | neg (Conflict if not the owner).
101
+ // @ts-ignore: decorator
102
+ @external("env", "data.unique_release")
103
+ export declare function uniqueRelease(
104
+ handle: u32,
105
+ keyPtr: usize,
106
+ keyLen: i32,
107
+ valPtr: usize,
108
+ valLen: i32,
109
+ idemPtr: usize
110
+ ): i32;
111
+
112
+ // view.get -> view value length (stashed) | -2 absent | negative error.
113
+ // @ts-ignore: decorator
114
+ @external("env", "data.view_get")
115
+ export declare function viewGet(handle: u32, keyPtr: usize, keyLen: i32): i32;
116
+
117
+ // view.publish -> 0 ok | negative error (derive/job only; the host gate enforces).
118
+ // @ts-ignore: decorator
119
+ @external("env", "data.view_publish")
120
+ export declare function viewPublish(
121
+ handle: u32,
122
+ keyPtr: usize,
123
+ keyLen: i32,
124
+ valPtr: usize,
125
+ valLen: i32,
126
+ idemPtr: usize
127
+ ): i32;
128
+
129
+ // membership.contains -> 1 present | 0 absent | negative error.
130
+ // @ts-ignore: decorator
131
+ @external("env", "data.membership_contains")
132
+ export declare function membershipContains(
133
+ handle: u32, setPtr: usize, setLen: i32, memberPtr: usize, memberLen: i32
134
+ ): i32;
135
+
136
+ // membership.add -> 0 ok | negative error.
137
+ // @ts-ignore: decorator
138
+ @external("env", "data.membership_add")
139
+ export declare function membershipAdd(
140
+ handle: u32, setPtr: usize, setLen: i32, memberPtr: usize, memberLen: i32, idemPtr: usize
141
+ ): i32;
142
+
143
+ // membership.remove -> 0 ok | negative error.
144
+ // @ts-ignore: decorator
145
+ @external("env", "data.membership_remove")
146
+ export declare function membershipRemove(
147
+ handle: u32, setPtr: usize, setLen: i32, memberPtr: usize, memberLen: i32, idemPtr: usize
148
+ ): i32;
149
+
150
+ // membership.list(limit) -> framed-list length (stashed) | negative error.
151
+ // The blob is `u32 count` then per member `u32 len + bytes`.
152
+ // @ts-ignore: decorator
153
+ @external("env", "data.membership_list")
154
+ export declare function membershipList(handle: u32, setPtr: usize, setLen: i32, limit: i32): i32;
155
+
156
+ // capacity.set_total(total: i64) -> 0 ok | negative error (job/derive only).
157
+ // @ts-ignore: decorator
158
+ @external("env", "data.capacity_set_total")
159
+ export declare function capacitySetTotal(
160
+ handle: u32, keyPtr: usize, keyLen: i32, total: i64, idemPtr: usize
161
+ ): i32;
162
+
163
+ // capacity.available -> 8 (the i64 available stashed as 8 LE bytes) | neg.
164
+ // @ts-ignore: decorator
165
+ @external("env", "data.capacity_available")
166
+ export declare function capacityAvailable(handle: u32, keyPtr: usize, keyLen: i32): i32;
167
+
168
+ // capacity.reserve(amount: i64, ttl_ms: i64) -> 8 (the u64 reservation id
169
+ // stashed) | -2 insufficient | negative error.
170
+ // @ts-ignore: decorator
171
+ @external("env", "data.capacity_reserve")
172
+ export declare function capacityReserve(
173
+ handle: u32, keyPtr: usize, keyLen: i32, amount: i64, ttlMs: i64, idemPtr: usize
174
+ ): i32;
175
+
176
+ // capacity.confirm(reservationId: i64) -> 1 confirmed | 0 unknown | neg.
177
+ // @ts-ignore: decorator
178
+ @external("env", "data.capacity_confirm")
179
+ export declare function capacityConfirm(
180
+ handle: u32, keyPtr: usize, keyLen: i32, reservationId: i64, idemPtr: usize
181
+ ): i32;
182
+
183
+ // capacity.cancel(reservationId: i64) -> 1 cancelled | 0 unknown/confirmed | neg.
184
+ // @ts-ignore: decorator
185
+ @external("env", "data.capacity_cancel")
186
+ export declare function capacityCancel(
187
+ handle: u32, keyPtr: usize, keyLen: i32, reservationId: i64, idemPtr: usize
188
+ ): i32;
189
+
190
+ // counter.get -> 8 (the i64 sum stashed as 8 LE bytes) | negative error.
191
+ // @ts-ignore: decorator
192
+ @external("env", "data.counter_get")
193
+ export declare function counterGet(handle: u32, keyPtr: usize, keyLen: i32): i32;
194
+
195
+ // counter.add(delta: i64) -> 0 ok | negative error.
196
+ // @ts-ignore: decorator
197
+ @external("env", "data.counter_add")
198
+ export declare function counterAdd(
199
+ handle: u32,
200
+ keyPtr: usize,
201
+ keyLen: i32,
202
+ delta: i64,
203
+ idemPtr: usize
204
+ ): i32;
205
+
206
+ // events.append -> 0 ok | negative error.
207
+ // @ts-ignore: decorator
208
+ @external("env", "data.append")
209
+ export declare function append(
210
+ handle: u32,
211
+ keyPtr: usize,
212
+ keyLen: i32,
213
+ evPtr: usize,
214
+ evLen: i32,
215
+ idemPtr: usize
216
+ ): i32;
217
+
218
+ // events.latest(limit) -> framed-list length (stashed) | negative error.
219
+ // The blob is `u32 count` then per event `u32 len + bytes`, newest first.
220
+ // @ts-ignore: decorator
221
+ @external("env", "data.latest")
222
+ export declare function latest(handle: u32, keyPtr: usize, keyLen: i32, limit: i32): i32;
223
+
224
+ // Copy the last stashed variable-length result into outPtr (outLen must equal
225
+ // the length the producing op returned). Returns bytes written, or -1 if the
226
+ // buffer is too small.
227
+ // @ts-ignore: decorator
228
+ @external("env", "data.take_result")
229
+ export declare function takeResult(outPtr: usize, outLen: i32): i32;
230
+ }
@@ -7,12 +7,11 @@ import { webcrypto } from "bindings/webcrypto";
7
7
  import { CryptoKey } from "crypto/key";
8
8
  import {
9
9
  AlgorithmParams,
10
- algId,
11
- formatId,
12
10
  cryptoError,
13
- FMT_JWK,
11
+ FMT_RAW,
14
12
  FMT_PKCS8,
15
13
  FMT_SPKI,
14
+ FMT_JWK,
16
15
  ALG_AES_GCM,
17
16
  ALG_AES_CBC,
18
17
  ALG_AES_CTR,
@@ -43,26 +42,24 @@ function isSymmetricAlg(alg: i32): bool {
43
42
  }
44
43
 
45
44
  export class SubtleCrypto {
46
- digest(algorithm: string, data: Uint8Array): Uint8Array {
47
- let id = algId(algorithm);
48
- if (id == 0) throw new Error("Unrecognized algorithm: " + algorithm);
49
- return drain(webcrypto.digest(id, data.dataStart, data.byteLength));
45
+ // `algorithm` is a hash-id selector: an `ALG_SHA_*` const (NOT a magic string).
46
+ digest(algorithm: i32, data: Uint8Array): Uint8Array {
47
+ return drain(webcrypto.digest(algorithm, data.dataStart, data.byteLength));
50
48
  }
51
49
 
50
+ // `format` is an `FMT_*` selector const (FMT_RAW / FMT_PKCS8 / FMT_SPKI).
52
51
  importKey(
53
- format: string,
52
+ format: i32,
54
53
  keyData: Uint8Array,
55
54
  algorithm: AlgorithmParams,
56
55
  extractable: bool,
57
56
  usages: i32
58
57
  ): CryptoKey {
59
- let fmt = formatId(format);
60
- if (fmt < 0) throw new Error("Unknown key format: " + format);
61
- if (fmt == FMT_JWK) throw new Error("jwk key format is not supported");
58
+ if (format == FMT_JWK) throw new Error("jwk key format is not supported");
62
59
  let p = algorithm.pack();
63
60
  let alg = load<i32>(p.dataStart); // first packed field is the alg id
64
61
  let handle = webcrypto.importKey(
65
- fmt,
62
+ format,
66
63
  keyData.dataStart,
67
64
  keyData.byteLength,
68
65
  p.dataStart,
@@ -73,18 +70,17 @@ export class SubtleCrypto {
73
70
  if (handle < 0) throw new Error(cryptoError(handle));
74
71
 
75
72
  let type: string;
76
- if (fmt == FMT_PKCS8) type = "private";
77
- else if (fmt == FMT_SPKI) type = "public";
73
+ if (format == FMT_PKCS8) type = "private";
74
+ else if (format == FMT_SPKI) type = "public";
78
75
  else type = isSymmetricAlg(alg) ? "secret" : "public";
79
76
 
80
77
  return new CryptoKey(handle, type, extractable, alg, usages);
81
78
  }
82
79
 
83
- exportKey(format: string, key: CryptoKey): Uint8Array {
84
- let fmt = formatId(format);
85
- if (fmt < 0) throw new Error("Unknown key format: " + format);
86
- if (fmt == FMT_JWK) throw new Error("jwk key format is not supported");
87
- return drain(webcrypto.exportKey(fmt, key.handle));
80
+ // `format` is an `FMT_*` selector const (FMT_RAW / FMT_PKCS8 / FMT_SPKI).
81
+ exportKey(format: i32, key: CryptoKey): Uint8Array {
82
+ if (format == FMT_JWK) throw new Error("jwk key format is not supported");
83
+ return drain(webcrypto.exportKey(format, key.handle));
88
84
  }
89
85
 
90
86
  encrypt(algorithm: AlgorithmParams, key: CryptoKey, data: Uint8Array): Uint8Array {
@@ -146,6 +142,6 @@ export class SubtleCrypto {
146
142
  usages: i32
147
143
  ): CryptoKey {
148
144
  let bits = this.deriveBits(algorithm, baseKey, lengthBits);
149
- return this.importKey("raw", bits, derivedKeyAlgorithm, extractable, usages);
145
+ return this.importKey(FMT_RAW, bits, derivedKeyAlgorithm, extractable, usages);
150
146
  }
151
147
  }
@@ -11,7 +11,16 @@
11
11
 
12
12
  import { webcrypto } from "bindings/webcrypto";
13
13
  import { SubtleCrypto } from "crypto/subtle";
14
- import { HmacImportParams, HmacParams, ALG_SHA_256, USAGE_SIGN } from "crypto/algorithms";
14
+ import {
15
+ HmacImportParams,
16
+ HmacParams,
17
+ ALG_SHA_1,
18
+ ALG_SHA_256,
19
+ ALG_SHA_384,
20
+ ALG_SHA_512,
21
+ FMT_RAW,
22
+ USAGE_SIGN,
23
+ } from "crypto/algorithms";
15
24
  import { Encoding } from "encoding";
16
25
 
17
26
  // Re-export the public surface so guests can import everything from "crypto".
@@ -51,6 +60,13 @@ export {
51
60
  ALG_X25519,
52
61
  ALG_HKDF,
53
62
  ALG_PBKDF2,
63
+ ALG_SHA3_256,
64
+ ALG_SHA3_384,
65
+ ALG_SHA3_512,
66
+ FMT_RAW,
67
+ FMT_PKCS8,
68
+ FMT_SPKI,
69
+ FMT_JWK,
54
70
  CURVE_P256,
55
71
  CURVE_P384,
56
72
  USAGE_ENCRYPT,
@@ -101,16 +117,16 @@ export namespace crypto {
101
117
 
102
118
  // --- Ergonomic digest helpers (thin wrappers over subtle.digest) ----------
103
119
  export function sha1(data: Uint8Array): Uint8Array {
104
- return subtle.digest("SHA-1", data);
120
+ return subtle.digest(ALG_SHA_1, data);
105
121
  }
106
122
  export function sha256(data: Uint8Array): Uint8Array {
107
- return subtle.digest("SHA-256", data);
123
+ return subtle.digest(ALG_SHA_256, data);
108
124
  }
109
125
  export function sha384(data: Uint8Array): Uint8Array {
110
- return subtle.digest("SHA-384", data);
126
+ return subtle.digest(ALG_SHA_384, data);
111
127
  }
112
128
  export function sha512(data: Uint8Array): Uint8Array {
113
- return subtle.digest("SHA-512", data);
129
+ return subtle.digest(ALG_SHA_512, data);
114
130
  }
115
131
 
116
132
  // String-input variants (UTF-8 encode, then hash).
@@ -129,7 +145,7 @@ export namespace crypto {
129
145
 
130
146
  /// One-shot HMAC-SHA-256 over raw key + message bytes.
131
147
  export function hmacSha256(key: Uint8Array, msg: Uint8Array): Uint8Array {
132
- let k = subtle.importKey("raw", key, new HmacImportParams(ALG_SHA_256), false, USAGE_SIGN);
148
+ let k = subtle.importKey(FMT_RAW, key, new HmacImportParams(ALG_SHA_256), false, USAGE_SIGN);
133
149
  return subtle.sign(new HmacParams(), k, msg);
134
150
  }
135
151
  export function hmacSha256Text(key: Uint8Array, msg: string): Uint8Array {
@@ -2853,11 +2853,14 @@ declare class X25519ImportParams extends AlgorithmParams {}
2853
2853
  declare class EcdhParams extends AlgorithmParams {
2854
2854
  constructor(alg: i32, publicKeyHandle: i32);
2855
2855
  }
2856
- /** Synchronous SubtleCrypto (no Promises). Returns values directly. */
2856
+ /** Synchronous SubtleCrypto (no Promises). Returns values directly. The hash and
2857
+ * key-format arguments are typed ABI ids (no magic strings): pass an `ALG_SHA_*`
2858
+ * const to `digest`, and an `FMT_*` const (`FMT_RAW` / `FMT_PKCS8` / `FMT_SPKI`)
2859
+ * to `importKey` / `exportKey`. */
2857
2860
  declare class SubtleCrypto {
2858
- digest(algorithm: string, data: Uint8Array): Uint8Array;
2859
- importKey(format: string, keyData: Uint8Array, algorithm: AlgorithmParams, extractable: bool, usages: i32): CryptoKey;
2860
- exportKey(format: string, key: CryptoKey): Uint8Array;
2861
+ digest(algorithm: i32, data: Uint8Array): Uint8Array;
2862
+ importKey(format: i32, keyData: Uint8Array, algorithm: AlgorithmParams, extractable: bool, usages: i32): CryptoKey;
2863
+ exportKey(format: i32, key: CryptoKey): Uint8Array;
2861
2864
  encrypt(algorithm: AlgorithmParams, key: CryptoKey, data: Uint8Array): Uint8Array;
2862
2865
  decrypt(algorithm: AlgorithmParams, key: CryptoKey, data: Uint8Array): Uint8Array;
2863
2866
  sign(algorithm: AlgorithmParams, key: CryptoKey, data: Uint8Array): Uint8Array;
@@ -2868,6 +2871,8 @@ declare class SubtleCrypto {
2868
2871
 
2869
2872
  // Algorithm / format / curve / usage ids (the Web Crypto ABI contract).
2870
2873
  declare const ALG_SHA_1: i32, ALG_SHA_256: i32, ALG_SHA_384: i32, ALG_SHA_512: i32;
2874
+ declare const ALG_SHA3_256: i32, ALG_SHA3_384: i32, ALG_SHA3_512: i32;
2875
+ declare const FMT_RAW: i32, FMT_PKCS8: i32, FMT_SPKI: i32, FMT_JWK: i32;
2871
2876
  declare const ALG_AES_GCM: i32, ALG_AES_CBC: i32, ALG_AES_CTR: i32, ALG_AES_KW: i32;
2872
2877
  declare const ALG_HMAC: i32, ALG_ECDSA: i32, ALG_ED25519: i32, ALG_ECDH: i32, ALG_X25519: i32, ALG_HKDF: i32, ALG_PBKDF2: i32;
2873
2878
  declare const CURVE_P256: i32, CURVE_P384: i32;