@latlng/wasm 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 TobiLG <github@tobilg.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,343 @@
1
+ # @latlng/wasm
2
+
3
+ Browser Web Worker and WebAssembly package for the `latlng` geospatial object engine.
4
+
5
+ This package is intentionally browser-only and worker-only. The wasm engine runs in a dedicated module worker; the main thread talks to it through async TypeScript methods and receives object mutation/geofence events as DOM `CustomEvent`s.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @latlng/wasm
11
+ ```
12
+
13
+ ## Quickstart
14
+
15
+ ```ts
16
+ import { createLatLng } from "@latlng/wasm";
17
+
18
+ const db = await createLatLng();
19
+
20
+ await db.createCollection("fleet");
21
+ await db.setPoint("fleet", "truck-1", { lat: 52.52, lon: 13.405 });
22
+
23
+ const nearby = await db.nearby("fleet", {
24
+ lat: 52.52,
25
+ lon: 13.405,
26
+ meters: 1_000,
27
+ });
28
+
29
+ console.log(nearby.results);
30
+ db.close();
31
+ ```
32
+
33
+ If your bundler or CDN serves the wasm file from a custom location, pass it explicitly:
34
+
35
+ ```ts
36
+ const db = await createLatLng({
37
+ wasmUrl: "/assets/latlng_core_bg.wasm",
38
+ });
39
+ ```
40
+
41
+ ## Events
42
+
43
+ Mutation events are emitted for collection, object, and hook changes.
44
+
45
+ ```ts
46
+ const unsubscribe = db.on("mutation", (event) => {
47
+ console.log(event.detail.type, event.detail.collection, event.detail.id);
48
+ });
49
+
50
+ await db.setPoint("fleet", "truck-1", { lat: 52.52, lon: 13.405 });
51
+ unsubscribe();
52
+ ```
53
+
54
+ Browser hooks emit geofence events as JavaScript events. They do not send HTTP POST requests.
55
+
56
+ ```ts
57
+ db.addEventListener("geofence:enter", (event) => {
58
+ console.log("entered", event.detail.hook, event.detail.id);
59
+ });
60
+
61
+ await db.setHook("berlin", {
62
+ collection: "fleet",
63
+ query: {
64
+ type: "within",
65
+ area: {
66
+ type: "circle",
67
+ lat: 52.52,
68
+ lon: 13.405,
69
+ meters: 1_000,
70
+ },
71
+ },
72
+ detect: ["enter", "exit"],
73
+ commands: ["set", "del"],
74
+ });
75
+
76
+ await db.setPoint("fleet", "truck-1", { lat: 52.52, lon: 13.405 });
77
+ ```
78
+
79
+ Supported geofence event names:
80
+
81
+ - `geofence`
82
+ - `geofence:inside`
83
+ - `geofence:outside`
84
+ - `geofence:enter`
85
+ - `geofence:exit`
86
+ - `geofence:cross`
87
+ - `geofence:roam`
88
+
89
+ ## API
90
+
91
+ All methods are asynchronous because calls cross the Web Worker boundary.
92
+
93
+ ### Lifecycle
94
+
95
+ ```ts
96
+ const db = await createLatLng();
97
+ db.close();
98
+ ```
99
+
100
+ `createLatLng()` starts the bundled worker and waits until the wasm engine is ready. `close()` terminates the worker and rejects pending requests.
101
+
102
+ `wasmUrl` accepts a `string` or `URL` and must point to `latlng_core_bg.wasm`. If omitted, the worker loads `../wasm/latlng_core_bg.wasm` relative to the emitted worker file.
103
+
104
+ `workerFactory` is available for tests and advanced bundler setups that need to
105
+ construct the worker themselves:
106
+
107
+ ```ts
108
+ const db = await createLatLng({
109
+ workerFactory: () => new Worker(new URL("./latlng.worker.js", import.meta.url), {
110
+ type: "module",
111
+ }),
112
+ });
113
+ ```
114
+
115
+ `LatLngWasmClient` is exported for low-level integration code. Application code
116
+ should usually prefer `createLatLng()`, which constructs the worker and awaits
117
+ `ready()` for you.
118
+
119
+ Complete client method surface:
120
+
121
+ | Area | Methods |
122
+ | --- | --- |
123
+ | Lifecycle | `ready()`, `close()` |
124
+ | Events | `addEventListener()`, `removeEventListener()`, `on()` |
125
+ | Collections | `createCollection()`, `dropCollection()`, `collections()`, `collectionInfo()`, `bounds()`, `stats()` |
126
+ | Objects | `setObject()`, `setPoint()`, `getObject()`, `deleteObject()`, `expire()`, `persist()`, `ttl()` |
127
+ | Queries | `nearby()`, `within()`, `intersects()`, `scan()`, `search()` |
128
+ | Hooks | `setHook()`, `deleteHook()`, `hooks()`, `getHook()` |
129
+ | Metadata | `serverInfo()` |
130
+
131
+ ### Collections
132
+
133
+ ```ts
134
+ await db.createCollection("fleet");
135
+ await db.collections();
136
+ await db.collections("fl*");
137
+ await db.collectionInfo("fleet");
138
+ await db.bounds("fleet");
139
+ await db.stats(["fleet"]);
140
+ await db.dropCollection("fleet");
141
+ ```
142
+
143
+ Collection creation is explicit, but object writes still implicitly create missing collections.
144
+
145
+ ### Objects
146
+
147
+ ```ts
148
+ await db.setPoint("fleet", "truck-1", { lat: 52.52, lon: 13.405 });
149
+
150
+ await db.setObject(
151
+ "fleet",
152
+ "truck-2",
153
+ { type: "geojson", value: { type: "Point", coordinates: [13.4, 52.5] } },
154
+ {
155
+ fields: {
156
+ status: { type: "text", value: "active" },
157
+ speed: { type: "number", value: 42 },
158
+ },
159
+ expireSeconds: 300,
160
+ condition: "always",
161
+ },
162
+ );
163
+
164
+ const object = await db.getObject("fleet", "truck-1");
165
+ await db.expire("fleet", "truck-1", 60);
166
+ const ttl = await db.ttl("fleet", "truck-1");
167
+ await db.persist("fleet", "truck-1");
168
+ await db.deleteObject("fleet", "truck-1");
169
+ ```
170
+
171
+ `condition` can be `always`, `nx`, or `xx`.
172
+ `getObject()` accepts `{ withFields?: boolean }` and includes fields by default.
173
+ Stored object shapes are `point`, `bounds`, `hash`, `geojson`, and `string`.
174
+ Field values can be `number`, `text`, or `json`.
175
+
176
+ ### Queries
177
+
178
+ ```ts
179
+ await db.nearby("fleet", {
180
+ lat: 52.52,
181
+ lon: 13.405,
182
+ meters: 2_000,
183
+ options: { limit: 20, output: "objects" },
184
+ });
185
+
186
+ await db.within("fleet", {
187
+ area: { type: "circle", lat: 52.52, lon: 13.405, meters: 2_000 },
188
+ });
189
+
190
+ await db.intersects("fleet", {
191
+ area: {
192
+ type: "bounds",
193
+ bounds: {
194
+ min_lat: 52.4,
195
+ min_lon: 13.2,
196
+ max_lat: 52.6,
197
+ max_lon: 13.6,
198
+ },
199
+ },
200
+ });
201
+
202
+ await db.scan("fleet", { limit: 100 });
203
+ await db.search("fleet", { matchPattern: "truck-*" });
204
+ ```
205
+
206
+ Query options support:
207
+
208
+ - `cursor` and `limit`
209
+ - `nofields`
210
+ - `matchPattern`
211
+ - `sort`: `asc` or `desc`
212
+ - `whereFilters`, `whereInFilters`, and `whereExprFilters`
213
+ - `clip`
214
+ - `output`: `objects`, `points`, `bounds`, `ids`, `count`, or geohashes
215
+
216
+ Area queries support `circle`, `bounds`, `hash`, `geojson`, `tile`, `quadkey`,
217
+ `sector`, and `reference` areas.
218
+
219
+ ### Hooks
220
+
221
+ ```ts
222
+ await db.setHook("near-alex", {
223
+ collection: "fleet",
224
+ query: {
225
+ type: "nearby",
226
+ lat: 52.5219,
227
+ lon: 13.4132,
228
+ meters: 500,
229
+ },
230
+ detect: ["enter", "exit"],
231
+ commands: ["set", "del"],
232
+ });
233
+
234
+ await db.hooks();
235
+ await db.getHook("near-alex");
236
+ await db.deleteHook("near-alex");
237
+ ```
238
+
239
+ Hook queries support `nearby`, `within`, `intersects`, `scan`, `search`, and
240
+ `roam`. Hooks are persisted only inside the in-browser wasm engine lifetime.
241
+ They emit JS geofence events and do not use webhook delivery. The browser wasm
242
+ package does not expose the server channel API.
243
+
244
+ ### Metadata
245
+
246
+ ```ts
247
+ const info = await db.serverInfo();
248
+ console.log(info.version, info.num_collections, info.num_objects);
249
+ ```
250
+
251
+ ## Runtime Notes
252
+
253
+ - The package has no network, auth, replication, Durable Object, AOF, or webhook queue APIs.
254
+ - The wasm state is in-memory inside the worker and is lost when the worker is terminated or the page reloads.
255
+ - Serve `.wasm` files with `application/wasm` for fastest startup. The fallback still works but is slower.
256
+ - Bundlers must preserve the emitted worker asset and make `latlng_core_bg.wasm` available to the worker.
257
+ - Package builds run `wasm-bindgen` and then `wasm-opt -Oz`; install
258
+ `wasm-bindgen-cli` `0.2.106` and Binaryen locally before running
259
+ `npm run build` or `npm run test`.
260
+
261
+ ## Bundling
262
+
263
+ ### Vite
264
+
265
+ For Vite apps, use the package plugin. It copies `latlng_core_bg.wasm` to `dist/wasm/latlng_core_bg.wasm`, matching the worker's default runtime URL.
266
+
267
+ ```ts
268
+ import { defineConfig } from "vite";
269
+ import { latlngWasmPlugin } from "@latlng/wasm/vite-plugin";
270
+
271
+ export default defineConfig({
272
+ plugins: [latlngWasmPlugin()],
273
+ });
274
+ ```
275
+
276
+ Custom output names are supported:
277
+
278
+ ```ts
279
+ latlngWasmPlugin({
280
+ wasmPath: "/absolute/path/to/latlng_core_bg.wasm",
281
+ wasmDirName: "assets",
282
+ wasmFileName: "latlng.wasm",
283
+ });
284
+ ```
285
+
286
+ When using a custom location, pass the matching URL at runtime:
287
+
288
+ ```ts
289
+ const db = await createLatLng({
290
+ wasmUrl: "/assets/latlng.wasm",
291
+ });
292
+ ```
293
+
294
+ The Vite plugin entrypoint also exports `getLatLngWasmPath()` for build systems
295
+ that need the absolute path to the packaged wasm file.
296
+
297
+ ### Rollup
298
+
299
+ Copy `node_modules/@latlng/wasm/dist/wasm/latlng_core_bg.wasm` into your public output and pass its URL:
300
+
301
+ ```ts
302
+ const db = await createLatLng({
303
+ wasmUrl: new URL("/wasm/latlng_core_bg.wasm", location.href),
304
+ });
305
+ ```
306
+
307
+ If your Rollup setup emits workers under `assets/`, copying the wasm file to `dist/wasm/latlng_core_bg.wasm` lets the default URL work without `wasmUrl`.
308
+
309
+ ### Webpack
310
+
311
+ Use `copy-webpack-plugin` or an equivalent asset-copy step to copy:
312
+
313
+ ```text
314
+ node_modules/@latlng/wasm/dist/wasm/latlng_core_bg.wasm -> dist/wasm/latlng_core_bg.wasm
315
+ ```
316
+
317
+ Then either rely on the default worker-relative URL or pass:
318
+
319
+ ```ts
320
+ const db = await createLatLng({
321
+ wasmUrl: "/wasm/latlng_core_bg.wasm",
322
+ });
323
+ ```
324
+
325
+ ### esbuild or tsup
326
+
327
+ esbuild and tsup do not automatically understand this package's worker/wasm asset relationship. Keep the worker bundle as an external emitted asset, copy the wasm file into your served output, and pass `wasmUrl` explicitly.
328
+
329
+ ```ts
330
+ const db = await createLatLng({
331
+ wasmUrl: "/static/latlng_core_bg.wasm",
332
+ });
333
+ ```
334
+
335
+ ### CDN or Static Hosting
336
+
337
+ Publish or copy `latlng_core_bg.wasm` to a stable URL and pass that URL to `createLatLng`.
338
+
339
+ ```ts
340
+ const db = await createLatLng({
341
+ wasmUrl: "https://cdn.example.com/latlng/latlng_core_bg.wasm",
342
+ });
343
+ ```
@@ -0,0 +1,2 @@
1
+ (function(){let e;function t(t){let n=e.__externref_table_alloc();return e.__wbindgen_externrefs.set(n,t),n}function n(e){let t=typeof e;if(t==`number`||t==`boolean`||e==null)return`${e}`;if(t==`string`)return`"${e}"`;if(t==`symbol`){let t=e.description;return t==null?`Symbol`:`Symbol(${t})`}if(t==`function`){let t=e.name;return typeof t==`string`&&t.length>0?`Function(${t})`:`Function`}if(Array.isArray(e)){let t=e.length,r=`[`;t>0&&(r+=n(e[0]));for(let i=1;i<t;i++)r+=`, `+n(e[i]);return r+=`]`,r}let r=/\[object ([^\]]+)\]/.exec(toString.call(e)),i;if(r&&r.length>1)i=r[1];else return toString.call(e);if(i==`Object`)try{return`Object(`+JSON.stringify(e)+`)`}catch{return`Object`}return e instanceof Error?`${e.name}: ${e.message}\n${e.stack}`:i}function r(e,t){return e>>>=0,c().subarray(e/1,e/1+t)}let i=null;function a(){return(i===null||i.buffer.detached===!0||i.buffer.detached===void 0&&i.buffer!==e.memory.buffer)&&(i=new DataView(e.memory.buffer)),i}function o(e,t){return e>>>=0,h(e,t)}let s=null;function c(){return(s===null||s.byteLength===0)&&(s=new Uint8Array(e.memory.buffer)),s}function l(n,r){try{return n.apply(this,r)}catch(n){let r=t(n);e.__wbindgen_exn_store(r)}}function u(e){return e==null}function d(e,t,n){if(n===void 0){let n=g.encode(e),r=t(n.length,1)>>>0;return c().subarray(r,r+n.length).set(n),_=n.length,r}let r=e.length,i=t(r,1)>>>0,a=c(),o=0;for(;o<r;o++){let t=e.charCodeAt(o);if(t>127)break;a[i+o]=t}if(o!==r){o!==0&&(e=e.slice(o)),i=n(i,r,r=o+e.length*3,1)>>>0;let t=c().subarray(i+o,i+r),a=g.encodeInto(e,t);o+=a.written,i=n(i,r,o,1)>>>0}return _=o,i}function f(t){let n=e.__wbindgen_externrefs.get(t);return e.__externref_table_dealloc(t),n}let p=new TextDecoder(`utf-8`,{ignoreBOM:!0,fatal:!0});p.decode();let m=0;function h(e,t){return m+=t,m>=2146435072&&(p=new TextDecoder(`utf-8`,{ignoreBOM:!0,fatal:!0}),p.decode(),m=t),p.decode(c().subarray(e,e+t))}let g=new TextEncoder;`encodeInto`in g||(g.encodeInto=function(e,t){let n=g.encode(e);return t.set(n),{read:e.length,written:n.length}});let _=0,v=typeof FinalizationRegistry>`u`?{register:()=>{},unregister:()=>{}}:new FinalizationRegistry(t=>e.__wbg_browserlatlng_free(t>>>0,1));var y=class{__destroy_into_raw(){let e=this.__wbg_ptr;return this.__wbg_ptr=0,v.unregister(this),e}free(){let t=this.__destroy_into_raw();e.__wbg_browserlatlng_free(t,0)}get_object(t,n,r){let i=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),a=_,o=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),s=_,c=e.browserlatlng_get_object(this.__wbg_ptr,i,a,o,s,r);if(c[2])throw f(c[1]);return f(c[0])}set_object(t,n,r){let i=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),a=_,o=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),s=_,c=e.browserlatlng_set_object(this.__wbg_ptr,i,a,o,s,r);if(c[2])throw f(c[1]);return f(c[0])}collections(t){var n=u(t)?0:d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_;let i=e.browserlatlng_collections(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}delete_hook(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_delete_hook(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return i[0]!==0}server_info(){let t=e.browserlatlng_server_info(this.__wbg_ptr);if(t[2])throw f(t[1]);return f(t[0])}nearby_query(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_nearby_query(this.__wbg_ptr,r,i,n);if(a[2])throw f(a[1]);return f(a[0])}within_query(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_within_query(this.__wbg_ptr,r,i,n);if(a[2])throw f(a[1]);return f(a[0])}delete_object(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),o=_,s=e.browserlatlng_delete_object(this.__wbg_ptr,r,i,a,o);if(s[2])throw f(s[1]);return f(s[0])}collection_info(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_collection_info(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}drop_collection(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_drop_collection(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}intersects_query(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_intersects_query(this.__wbg_ptr,r,i,n);if(a[2])throw f(a[1]);return f(a[0])}create_collection(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_create_collection(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}constructor(){let t=e.browserlatlng_new();if(t[2])throw f(t[1]);return this.__wbg_ptr=t[0]>>>0,v.register(this,this.__wbg_ptr,this),this}ttl(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),o=_,s=e.browserlatlng_ttl(this.__wbg_ptr,r,i,a,o);if(s[2])throw f(s[1]);return f(s[0])}hook(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_hook(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}scan(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_scan(this.__wbg_ptr,r,i,n);if(a[2])throw f(a[1]);return f(a[0])}hooks(t){var n=u(t)?0:d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_;let i=e.browserlatlng_hooks(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}stats(t){let n=e.browserlatlng_stats(this.__wbg_ptr,t);if(n[2])throw f(n[1]);return f(n[0])}bounds(t){let n=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),r=_,i=e.browserlatlng_bounds(this.__wbg_ptr,n,r);if(i[2])throw f(i[1]);return f(i[0])}expire(t,n,r){let i=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),a=_,o=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),s=_,c=e.browserlatlng_expire(this.__wbg_ptr,i,a,o,s,r);if(c[2])throw f(c[1]);return f(c[0])}search(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_search(this.__wbg_ptr,r,i,n);if(a[2])throw f(a[1]);return f(a[0])}persist(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=d(n,e.__wbindgen_malloc,e.__wbindgen_realloc),o=_,s=e.browserlatlng_persist(this.__wbg_ptr,r,i,a,o);if(s[2])throw f(s[1]);return f(s[0])}set_hook(t,n){let r=d(t,e.__wbindgen_malloc,e.__wbindgen_realloc),i=_,a=e.browserlatlng_set_hook(this.__wbg_ptr,r,i,n);if(a[1])throw f(a[0])}};Symbol.dispose&&(y.prototype[Symbol.dispose]=y.prototype.free);let b=new Set([`basic`,`cors`,`default`]);async function x(e,t){if(typeof Response==`function`&&e instanceof Response){if(typeof WebAssembly.instantiateStreaming==`function`)try{return await WebAssembly.instantiateStreaming(e,t)}catch(t){if(e.ok&&b.has(e.type)&&e.headers.get(`Content-Type`)!==`application/wasm`)console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n",t);else throw t}let n=await e.arrayBuffer();return await WebAssembly.instantiate(n,t)}else{let n=await WebAssembly.instantiate(e,t);return n instanceof WebAssembly.Instance?{instance:n,module:e}:n}}function S(){let t={};return t.wbg={},t.wbg.__wbg_Error_52673b7de5a0ca89=function(e,t){return Error(o(e,t))},t.wbg.__wbg_Number_2d1dcfcf4ec51736=function(e){return Number(e)},t.wbg.__wbg_String_8f0eb39a4a4c2f66=function(t,n){let r=d(String(n),e.__wbindgen_malloc,e.__wbindgen_realloc),i=_;a().setInt32(t+4,i,!0),a().setInt32(t+0,r,!0)},t.wbg.__wbg___wbindgen_bigint_get_as_i64_6e32f5e6aff02e1d=function(e,t){let n=t,r=typeof n==`bigint`?n:void 0;a().setBigInt64(e+8,u(r)?BigInt(0):r,!0),a().setInt32(e+0,!u(r),!0)},t.wbg.__wbg___wbindgen_boolean_get_dea25b33882b895b=function(e){let t=e,n=typeof t==`boolean`?t:void 0;return u(n)?16777215:+!!n},t.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6=function(t,r){let i=d(n(r),e.__wbindgen_malloc,e.__wbindgen_realloc),o=_;a().setInt32(t+4,o,!0),a().setInt32(t+0,i,!0)},t.wbg.__wbg___wbindgen_in_0d3e1e8f0c669317=function(e,t){return e in t},t.wbg.__wbg___wbindgen_is_bigint_0e1a2e3f55cfae27=function(e){return typeof e==`bigint`},t.wbg.__wbg___wbindgen_is_function_8d400b8b1af978cd=function(e){return typeof e==`function`},t.wbg.__wbg___wbindgen_is_null_dfda7d66506c95b5=function(e){return e===null},t.wbg.__wbg___wbindgen_is_object_ce774f3490692386=function(e){let t=e;return typeof t==`object`&&!!t},t.wbg.__wbg___wbindgen_is_string_704ef9c8fc131030=function(e){return typeof e==`string`},t.wbg.__wbg___wbindgen_is_undefined_f6b95eab589e0269=function(e){return e===void 0},t.wbg.__wbg___wbindgen_jsval_eq_b6101cc9cef1fe36=function(e,t){return e===t},t.wbg.__wbg___wbindgen_jsval_loose_eq_766057600fdd1b0d=function(e,t){return e==t},t.wbg.__wbg___wbindgen_number_get_9619185a74197f95=function(e,t){let n=t,r=typeof n==`number`?n:void 0;a().setFloat64(e+8,u(r)?0:r,!0),a().setInt32(e+0,!u(r),!0)},t.wbg.__wbg___wbindgen_string_get_a2a31e16edf96e42=function(t,n){let r=n,i=typeof r==`string`?r:void 0;var o=u(i)?0:d(i,e.__wbindgen_malloc,e.__wbindgen_realloc),s=_;a().setInt32(t+4,s,!0),a().setInt32(t+0,o,!0)},t.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e=function(e,t){throw Error(o(e,t))},t.wbg.__wbg_call_abb4ff46ce38be40=function(){return l(function(e,t){return e.call(t)},arguments)},t.wbg.__wbg_done_62ea16af4ce34b24=function(e){return e.done},t.wbg.__wbg_entries_83c79938054e065f=function(e){return Object.entries(e)},t.wbg.__wbg_get_6b7bd52aca3f9671=function(e,t){return e[t>>>0]},t.wbg.__wbg_get_af9dab7e9603ea93=function(){return l(function(e,t){return Reflect.get(e,t)},arguments)},t.wbg.__wbg_get_with_ref_key_1dc361bd10053bfe=function(e,t){return e[t]},t.wbg.__wbg_instanceof_ArrayBuffer_f3320d2419cd0355=function(e){let t;try{t=e instanceof ArrayBuffer}catch{t=!1}return t},t.wbg.__wbg_instanceof_Map_084be8da74364158=function(e){let t;try{t=e instanceof Map}catch{t=!1}return t},t.wbg.__wbg_instanceof_Uint8Array_da54ccc9d3e09434=function(e){let t;try{t=e instanceof Uint8Array}catch{t=!1}return t},t.wbg.__wbg_isArray_51fd9e6422c0a395=function(e){return Array.isArray(e)},t.wbg.__wbg_isSafeInteger_ae7d3f054d55fa16=function(e){return Number.isSafeInteger(e)},t.wbg.__wbg_iterator_27b7c8b35ab3e86b=function(){return Symbol.iterator},t.wbg.__wbg_length_22ac23eaec9d8053=function(e){return e.length},t.wbg.__wbg_length_d45040a40c570362=function(e){return e.length},t.wbg.__wbg_new_1ba21ce319a06297=function(){return{}},t.wbg.__wbg_new_25f239778d6112b9=function(){return[]},t.wbg.__wbg_new_6421f6084cc5bc5a=function(e){return new Uint8Array(e)},t.wbg.__wbg_new_b546ae120718850e=function(){return new Map},t.wbg.__wbg_next_138a17bbf04e926c=function(e){return e.next},t.wbg.__wbg_next_3cfe5c0fe2a4cc53=function(){return l(function(e){return e.next()},arguments)},t.wbg.__wbg_now_69d776cd24f5215b=function(){return Date.now()},t.wbg.__wbg_prototypesetcall_dfe9b766cdc1f1fd=function(e,t,n){Uint8Array.prototype.set.call(r(e,t),n)},t.wbg.__wbg_set_3f1d0b984ed272ed=function(e,t,n){e[t]=n},t.wbg.__wbg_set_7df433eea03a5c14=function(e,t,n){e[t>>>0]=n},t.wbg.__wbg_set_efaaf145b9377369=function(e,t,n){return e.set(t,n)},t.wbg.__wbg_value_57b7b035e117f7ee=function(e){return e.value},t.wbg.__wbindgen_cast_2241b6af4c4b2941=function(e,t){return o(e,t)},t.wbg.__wbindgen_cast_4625c577ab2ec9ee=function(e){return BigInt.asUintN(64,e)},t.wbg.__wbindgen_cast_9ae0607507abb057=function(e){return e},t.wbg.__wbindgen_cast_d6cd19b81560fd6e=function(e){return e},t.wbg.__wbindgen_init_externref_table=function(){let t=e.__wbindgen_externrefs,n=t.grow(4);t.set(0,void 0),t.set(n+0,void 0),t.set(n+1,null),t.set(n+2,!0),t.set(n+3,!1)},t}function C(t,n){return e=t.exports,w.__wbindgen_wasm_module=n,i=null,s=null,e.__wbindgen_start(),e}async function w(t){if(e!==void 0)return e;if(t!==void 0&&(Object.getPrototypeOf(t)===Object.prototype?{module_or_path:t}=t:console.warn(`using deprecated parameters for the initialization function; pass a single object instead`)),t===void 0)throw Error(`latlng wasm initialization requires an explicit wasm URL`);let n=S();(typeof t==`string`||typeof Request==`function`&&t instanceof Request||typeof URL==`function`&&t instanceof URL)&&(t=fetch(t));let{instance:r,module:i}=await x(await t,n);return C(r,i)}function T(e){return M(e,`geofence event`),{command:k(e.command),detect:A(e.detect),collection:N(e.collection,`event collection`),id:N(e.id,`event id`),object:O(e.object),fields:D(e.fields),timestamp_ns:typeof e.timestamp_ns==`number`?e.timestamp_ns:Number(e.timestamp_ns??0),event_id:typeof e.event_id==`string`?e.event_id:null,hook:typeof e.hook==`string`?e.hook:null,group:typeof e.group==`string`?e.group:null,nearby:j(e.nearby)&&typeof e.nearby.collection==`string`&&typeof e.nearby.id==`string`&&typeof e.nearby.meters==`number`?{collection:e.nearby.collection,id:e.nearby.id,meters:e.nearby.meters}:null}}function E(e){if(M(e,`field value`),e.type===`number`)return{type:`number`,value:Number(e.value)};if(e.type===`text`)return{type:`text`,value:String(e.value)};if(e.type===`json`){let t=String(e.value);try{return{type:`json`,value:JSON.parse(t)}}catch{return{type:`json`,value:t}}}throw Error(`unknown field value shape`)}function D(e){return!j(e)||!j(e.values)?{}:Object.fromEntries(Object.entries(e.values).map(([e,t])=>[e,E(t)]))}function O(e){if(M(e,`geo object`),`Point`in e){let t=e.Point;return M(t,`point`),{type:`point`,lat:Number(t.lat),lon:Number(t.lon),z:typeof t.z==`number`||t.z===null?t.z:void 0}}if(`Bounds`in e)return{type:`bounds`,bounds:e.Bounds};if(`Hash`in e)return{type:`hash`,value:String(e.Hash)};if(`GeoJson`in e)return{type:`geojson`,value:e.GeoJson};if(`String`in e)return{type:`string`,value:String(e.String)};throw Error(`unknown geo object shape`)}function k(e){switch(e){case`Set`:case`set`:return`set`;case`Del`:case`del`:return`del`;case`Drop`:case`drop`:return`drop`;case`Fset`:case`fset`:return`fset`;default:throw Error(`unknown mutation command: ${String(e)}`)}}function A(e){switch(e){case`Inside`:case`inside`:return`inside`;case`Outside`:case`outside`:return`outside`;case`Enter`:case`enter`:return`enter`;case`Exit`:case`exit`:return`exit`;case`Cross`:case`cross`:return`cross`;case`Roam`:case`roam`:return`roam`;default:throw Error(`unknown detect type: ${String(e)}`)}}function j(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function M(e,t){if(!j(e))throw Error(`${t} must be an object`)}function N(e,t){if(typeof e!=`string`)throw Error(`${t} must be a string`);return e}let P,F;function I(){let e=F??new URL([`..`,`wasm`,`latlng_core_bg.wasm`].join(`/`),self.location.href);return P??=w(e).then(()=>new y),P}self.addEventListener(`message`,e=>{L(e.data)});async function L(e){try{if(e.method===`init`){let t=await R(e.params);H({id:e.id,ok:!0,result:t});return}let t=await z(await I(),e.method,e.params);H({id:e.id,ok:!0,result:t})}catch(t){H({id:e.id,ok:!1,error:t instanceof Error?t.message:String(t)})}}async function R(e){let[t]=U(e);return!P&&typeof t==`string`&&t.length>0&&(F=t),(await I()).server_info()}async function z(e,t,n){switch(t){case`init`:return R(n);case`createCollection`:{let[t]=U(n),r=e.create_collection(t);return B({type:`collection:create`,collection:t,changed:r.result}),V(r.events),r.result}case`dropCollection`:{let[t]=U(n),r=e.drop_collection(t);return B({type:`collection:drop`,collection:t,changed:r.result}),V(r.events),r.result}case`collections`:{let[t]=U(n);return e.collections(t)}case`collectionInfo`:{let[t]=U(n);return e.collection_info(t)}case`setObject`:{let[t,r,i]=U(n),a=e.set_object(t,r,i);return B({type:`object:set`,collection:t,id:r,changed:a.result}),V(a.events),a.result}case`getObject`:{let[t,r,i]=U(n);return e.get_object(t,r,i)}case`deleteObject`:{let[t,r]=U(n),i=e.delete_object(t,r);return B({type:`object:delete`,collection:t,id:r,changed:i.result}),V(i.events),i.result}case`expire`:{let[t,r,i]=U(n),a=e.expire(t,r,i);return B({type:`object:expire`,collection:t,id:r,changed:a.result}),a.result}case`persist`:{let[t,r]=U(n),i=e.persist(t,r);return B({type:`object:persist`,collection:t,id:r,changed:i.result}),i.result}case`ttl`:{let[t,r]=U(n);return e.ttl(t,r)}case`setHook`:{let[t,r]=U(n);return e.set_hook(t,r),B({type:`hook:set`,hook:t,changed:!0}),!0}case`deleteHook`:{let[t]=U(n),r=e.delete_hook(t);return B({type:`hook:delete`,hook:t,changed:r}),r}case`hooks`:{let[t]=U(n);return e.hooks(t)}case`getHook`:{let[t]=U(n);return e.hook(t)}case`nearby`:{let[t,r]=U(n);return e.nearby_query(t,r)}case`within`:{let[t,r]=U(n);return e.within_query(t,r)}case`intersects`:{let[t,r]=U(n);return e.intersects_query(t,r)}case`scan`:{let[t,r]=U(n);return e.scan(t,r)}case`search`:{let[t,r]=U(n);return e.search(t,r)}case`bounds`:{let[t]=U(n);return e.bounds(t)}case`stats`:{let[t]=U(n);return e.stats(t)}case`serverInfo`:return e.server_info()}}function B(e){H({type:`event`,eventType:`mutation`,event:e})}function V(e){for(let t of e)H({type:`event`,eventType:`geofence`,event:T(t)})}function H(e){self.postMessage(e)}function U(e){return e}})();
2
+ //# sourceMappingURL=engine.worker-CkKJqc5H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.worker-CkKJqc5H.js","names":["ret"],"sources":["../../pkg/latlng_core.js","../../src/types.ts","../../src/engine.worker.ts"],"sourcesContent":["let wasm;\n\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n }\n}\n\nlet WASM_VECTOR_LEN = 0;\n\nconst BrowserLatLngFinalization = (typeof FinalizationRegistry === 'undefined')\n ? { register: () => {}, unregister: () => {} }\n : new FinalizationRegistry(ptr => wasm.__wbg_browserlatlng_free(ptr >>> 0, 1));\n\nexport class BrowserLatLng {\n __destroy_into_raw() {\n const ptr = this.__wbg_ptr;\n this.__wbg_ptr = 0;\n BrowserLatLngFinalization.unregister(this);\n return ptr;\n }\n free() {\n const ptr = this.__destroy_into_raw();\n wasm.__wbg_browserlatlng_free(ptr, 0);\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @param {boolean} with_fields\n * @returns {any}\n */\n get_object(collection, id, with_fields) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_get_object(this.__wbg_ptr, ptr0, len0, ptr1, len1, with_fields);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @param {any} request\n * @returns {any}\n */\n set_object(collection, id, request) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_set_object(this.__wbg_ptr, ptr0, len0, ptr1, len1, request);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string | null} [pattern]\n * @returns {any}\n */\n collections(pattern) {\n var ptr0 = isLikeNone(pattern) ? 0 : passStringToWasm0(pattern, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_collections(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} name\n * @returns {boolean}\n */\n delete_hook(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_delete_hook(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] !== 0;\n }\n /**\n * @returns {any}\n */\n server_info() {\n const ret = wasm.browserlatlng_server_info(this.__wbg_ptr);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {any} query\n * @returns {any}\n */\n nearby_query(collection, query) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_nearby_query(this.__wbg_ptr, ptr0, len0, query);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {any} query\n * @returns {any}\n */\n within_query(collection, query) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_within_query(this.__wbg_ptr, ptr0, len0, query);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @returns {any}\n */\n delete_object(collection, id) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_delete_object(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @returns {any}\n */\n collection_info(collection) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_collection_info(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @returns {any}\n */\n drop_collection(collection) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_drop_collection(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {any} query\n * @returns {any}\n */\n intersects_query(collection, query) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_intersects_query(this.__wbg_ptr, ptr0, len0, query);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @returns {any}\n */\n create_collection(collection) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_create_collection(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n constructor() {\n const ret = wasm.browserlatlng_new();\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n this.__wbg_ptr = ret[0] >>> 0;\n BrowserLatLngFinalization.register(this, this.__wbg_ptr, this);\n return this;\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @returns {any}\n */\n ttl(collection, id) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_ttl(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} name\n * @returns {any}\n */\n hook(name) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_hook(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {any} options\n * @returns {any}\n */\n scan(collection, options) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_scan(this.__wbg_ptr, ptr0, len0, options);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string | null} [pattern]\n * @returns {any}\n */\n hooks(pattern) {\n var ptr0 = isLikeNone(pattern) ? 0 : passStringToWasm0(pattern, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_hooks(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {any} collections\n * @returns {any}\n */\n stats(collections) {\n const ret = wasm.browserlatlng_stats(this.__wbg_ptr, collections);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @returns {any}\n */\n bounds(collection) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_bounds(this.__wbg_ptr, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @param {number} seconds\n * @returns {any}\n */\n expire(collection, id, seconds) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_expire(this.__wbg_ptr, ptr0, len0, ptr1, len1, seconds);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {any} options\n * @returns {any}\n */\n search(collection, options) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_search(this.__wbg_ptr, ptr0, len0, options);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} collection\n * @param {string} id\n * @returns {any}\n */\n persist(collection, id) {\n const ptr0 = passStringToWasm0(collection, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_persist(this.__wbg_ptr, ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n }\n /**\n * @param {string} name\n * @param {any} request\n */\n set_hook(name, request) {\n const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.browserlatlng_set_hook(this.__wbg_ptr, ptr0, len0, request);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n }\n}\nif (Symbol.dispose) BrowserLatLng.prototype[Symbol.dispose] = BrowserLatLng.prototype.free;\n\nconst EXPECTED_RESPONSE_TYPES = new Set(['basic', 'cors', 'default']);\n\nasync function __wbg_load(module, imports) {\n if (typeof Response === 'function' && module instanceof Response) {\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(module, imports);\n } catch (e) {\n const validResponse = module.ok && EXPECTED_RESPONSE_TYPES.has(module.type);\n\n if (validResponse && module.headers.get('Content-Type') !== 'application/wasm') {\n console.warn(\"`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n\", e);\n\n } else {\n throw e;\n }\n }\n }\n\n const bytes = await module.arrayBuffer();\n return await WebAssembly.instantiate(bytes, imports);\n } else {\n const instance = await WebAssembly.instantiate(module, imports);\n\n if (instance instanceof WebAssembly.Instance) {\n return { instance, module };\n } else {\n return instance;\n }\n }\n}\n\nfunction __wbg_get_imports() {\n const imports = {};\n imports.wbg = {};\n imports.wbg.__wbg_Error_52673b7de5a0ca89 = function(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n };\n imports.wbg.__wbg_Number_2d1dcfcf4ec51736 = function(arg0) {\n const ret = Number(arg0);\n return ret;\n };\n imports.wbg.__wbg_String_8f0eb39a4a4c2f66 = function(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbg___wbindgen_bigint_get_as_i64_6e32f5e6aff02e1d = function(arg0, arg1) {\n const v = arg1;\n const ret = typeof(v) === 'bigint' ? v : undefined;\n getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n };\n imports.wbg.__wbg___wbindgen_boolean_get_dea25b33882b895b = function(arg0) {\n const v = arg0;\n const ret = typeof(v) === 'boolean' ? v : undefined;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n };\n imports.wbg.__wbg___wbindgen_debug_string_adfb662ae34724b6 = function(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbg___wbindgen_in_0d3e1e8f0c669317 = function(arg0, arg1) {\n const ret = arg0 in arg1;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_bigint_0e1a2e3f55cfae27 = function(arg0) {\n const ret = typeof(arg0) === 'bigint';\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_function_8d400b8b1af978cd = function(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_null_dfda7d66506c95b5 = function(arg0) {\n const ret = arg0 === null;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_object_ce774f3490692386 = function(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_string_704ef9c8fc131030 = function(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n };\n imports.wbg.__wbg___wbindgen_is_undefined_f6b95eab589e0269 = function(arg0) {\n const ret = arg0 === undefined;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_jsval_eq_b6101cc9cef1fe36 = function(arg0, arg1) {\n const ret = arg0 === arg1;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_jsval_loose_eq_766057600fdd1b0d = function(arg0, arg1) {\n const ret = arg0 == arg1;\n return ret;\n };\n imports.wbg.__wbg___wbindgen_number_get_9619185a74197f95 = function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n };\n imports.wbg.__wbg___wbindgen_string_get_a2a31e16edf96e42 = function(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n };\n imports.wbg.__wbg___wbindgen_throw_dd24417ed36fc46e = function(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n };\n imports.wbg.__wbg_call_abb4ff46ce38be40 = function() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_done_62ea16af4ce34b24 = function(arg0) {\n const ret = arg0.done;\n return ret;\n };\n imports.wbg.__wbg_entries_83c79938054e065f = function(arg0) {\n const ret = Object.entries(arg0);\n return ret;\n };\n imports.wbg.__wbg_get_6b7bd52aca3f9671 = function(arg0, arg1) {\n const ret = arg0[arg1 >>> 0];\n return ret;\n };\n imports.wbg.__wbg_get_af9dab7e9603ea93 = function() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(arg0, arg1);\n return ret;\n }, arguments) };\n imports.wbg.__wbg_get_with_ref_key_1dc361bd10053bfe = function(arg0, arg1) {\n const ret = arg0[arg1];\n return ret;\n };\n imports.wbg.__wbg_instanceof_ArrayBuffer_f3320d2419cd0355 = function(arg0) {\n let result;\n try {\n result = arg0 instanceof ArrayBuffer;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n };\n imports.wbg.__wbg_instanceof_Map_084be8da74364158 = function(arg0) {\n let result;\n try {\n result = arg0 instanceof Map;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n };\n imports.wbg.__wbg_instanceof_Uint8Array_da54ccc9d3e09434 = function(arg0) {\n let result;\n try {\n result = arg0 instanceof Uint8Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n };\n imports.wbg.__wbg_isArray_51fd9e6422c0a395 = function(arg0) {\n const ret = Array.isArray(arg0);\n return ret;\n };\n imports.wbg.__wbg_isSafeInteger_ae7d3f054d55fa16 = function(arg0) {\n const ret = Number.isSafeInteger(arg0);\n return ret;\n };\n imports.wbg.__wbg_iterator_27b7c8b35ab3e86b = function() {\n const ret = Symbol.iterator;\n return ret;\n };\n imports.wbg.__wbg_length_22ac23eaec9d8053 = function(arg0) {\n const ret = arg0.length;\n return ret;\n };\n imports.wbg.__wbg_length_d45040a40c570362 = function(arg0) {\n const ret = arg0.length;\n return ret;\n };\n imports.wbg.__wbg_new_1ba21ce319a06297 = function() {\n const ret = new Object();\n return ret;\n };\n imports.wbg.__wbg_new_25f239778d6112b9 = function() {\n const ret = new Array();\n return ret;\n };\n imports.wbg.__wbg_new_6421f6084cc5bc5a = function(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n };\n imports.wbg.__wbg_new_b546ae120718850e = function() {\n const ret = new Map();\n return ret;\n };\n imports.wbg.__wbg_next_138a17bbf04e926c = function(arg0) {\n const ret = arg0.next;\n return ret;\n };\n imports.wbg.__wbg_next_3cfe5c0fe2a4cc53 = function() { return handleError(function (arg0) {\n const ret = arg0.next();\n return ret;\n }, arguments) };\n imports.wbg.__wbg_now_69d776cd24f5215b = function() {\n const ret = Date.now();\n return ret;\n };\n imports.wbg.__wbg_prototypesetcall_dfe9b766cdc1f1fd = function(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n };\n imports.wbg.__wbg_set_3f1d0b984ed272ed = function(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n };\n imports.wbg.__wbg_set_7df433eea03a5c14 = function(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n };\n imports.wbg.__wbg_set_efaaf145b9377369 = function(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n };\n imports.wbg.__wbg_value_57b7b035e117f7ee = function(arg0) {\n const ret = arg0.value;\n return ret;\n };\n imports.wbg.__wbindgen_cast_2241b6af4c4b2941 = function(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n };\n imports.wbg.__wbindgen_cast_4625c577ab2ec9ee = function(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n };\n imports.wbg.__wbindgen_cast_9ae0607507abb057 = function(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_cast_d6cd19b81560fd6e = function(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n };\n imports.wbg.__wbindgen_init_externref_table = function() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n };\n\n return imports;\n}\n\nfunction __wbg_finalize_init(instance, module) {\n wasm = instance.exports;\n __wbg_init.__wbindgen_wasm_module = module;\n cachedDataViewMemory0 = null;\n cachedUint8ArrayMemory0 = null;\n\n\n wasm.__wbindgen_start();\n return wasm;\n}\n\nfunction initSync(module) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module !== 'undefined') {\n if (Object.getPrototypeOf(module) === Object.prototype) {\n ({module} = module)\n } else {\n console.warn('using deprecated parameters for `initSync()`; pass a single object instead')\n }\n }\n\n const imports = __wbg_get_imports();\n if (!(module instanceof WebAssembly.Module)) {\n module = new WebAssembly.Module(module);\n }\n const instance = new WebAssembly.Instance(module, imports);\n return __wbg_finalize_init(instance, module);\n}\n\nasync function __wbg_init(module_or_path) {\n if (wasm !== undefined) return wasm;\n\n\n if (typeof module_or_path !== 'undefined') {\n if (Object.getPrototypeOf(module_or_path) === Object.prototype) {\n ({module_or_path} = module_or_path)\n } else {\n console.warn('using deprecated parameters for the initialization function; pass a single object instead')\n }\n }\n\n if (typeof module_or_path === 'undefined') {\n throw new Error('latlng wasm initialization requires an explicit wasm URL');\n }\n const imports = __wbg_get_imports();\n\n if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {\n module_or_path = fetch(module_or_path);\n }\n\n const { instance, module } = await __wbg_load(await module_or_path, imports);\n\n return __wbg_finalize_init(instance, module);\n}\n\nexport { initSync };\nexport default __wbg_init;\n","/** JSON value accepted by GeoJSON payloads and field values. */\nexport type JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\n/** Geographic bounding box expressed as min/max latitude and longitude. */\nexport interface BoundingBox {\n /** Southern latitude bound. */\n min_lat: number;\n /** Western longitude bound. */\n min_lon: number;\n /** Northern latitude bound. */\n max_lat: number;\n /** Eastern longitude bound. */\n max_lon: number;\n}\n\n/** Stored field value. */\nexport type FieldValue =\n | { type: \"number\"; value: number }\n | { type: \"text\"; value: string }\n | { type: \"json\"; value: JsonValue };\n\n/** Named field assignment. */\nexport interface FieldEntry {\n /** Field name. */\n name: string;\n /** Field value. */\n value: FieldValue;\n}\n\n/** Field map keyed by field name. */\nexport type FieldMap = Record<string, FieldValue>;\n\n/** Geographic object payload accepted by `setObject`. */\nexport type GeoObject =\n | { type: \"point\"; lat: number; lon: number; z?: number | null }\n | { type: \"bounds\"; bounds: BoundingBox }\n | { type: \"hash\"; value: string }\n | { type: \"geojson\"; value: JsonValue }\n | { type: \"string\"; value: string };\n\n/** Stored object returned by read and query operations. */\nexport interface LatLngObject {\n /** Object identifier. */\n id: string;\n /** Stored object payload. */\n geo: GeoObject;\n /** Stored field values. */\n fields: FieldMap;\n /** Expiration timestamp in milliseconds since epoch, or `null`. */\n expires_at: number | null;\n}\n\n/** Area definition used by spatial queries and geofence definitions. */\nexport type Area =\n | { type: \"circle\"; lat: number; lon: number; meters: number }\n | { type: \"bounds\"; bounds: BoundingBox }\n | { type: \"hash\"; value: string }\n | { type: \"geojson\"; value: JsonValue }\n | { type: \"tile\"; x: number; y: number; z: number }\n | { type: \"quadkey\"; value: string }\n | {\n type: \"sector\";\n lat: number;\n lon: number;\n meters: number;\n bearing1: number;\n bearing2: number;\n }\n | { type: \"reference\"; collection: string; id: string };\n\n/** Sort direction for query results. */\nexport type SortOrder = \"asc\" | \"desc\";\n\n/** Query output format. */\nexport type OutputFormat =\n | \"objects\"\n | \"points\"\n | \"bounds\"\n | \"ids\"\n | \"count\"\n | { hashes: { precision: number } };\n\n/** Numeric or textual field comparison. */\nexport type WhereComparison =\n | { type: \"range\"; min: number; max: number }\n | { type: \"equalsText\"; value: string }\n | { type: \"regex\"; value: string };\n\n/** Field-level filter used by search queries. */\nexport interface WhereFilter {\n /** Field name to inspect. */\n field: string;\n /** Comparison to apply. */\n comparison: WhereComparison;\n}\n\n/** Inclusion filter used by search queries. */\nexport interface WhereInFilter {\n /** Field name to inspect. */\n field: string;\n /** Accepted string values. */\n values: string[];\n}\n\n/** Expression filter used by search queries. */\nexport interface WhereExprFilter {\n /** Server-side expression string. */\n expression: string;\n}\n\n/** Shared options accepted by scan/search/spatial query methods. */\nexport interface SearchOptions {\n /** Cursor to resume a paginated query. */\n cursor?: number;\n /** Maximum number of results to return. */\n limit?: number;\n /** Omit fields from result items when true. */\n nofields?: boolean;\n /** Match pattern applied to object IDs. */\n matchPattern?: string;\n /** Result sort direction. */\n sort?: SortOrder;\n /** Numeric/text filters. */\n whereFilters?: WhereFilter[];\n /** Inclusion filters. */\n whereInFilters?: WhereInFilter[];\n /** Expression filters. */\n whereExprFilters?: WhereExprFilter[];\n /** Clip geometries to the query area when supported. */\n clip?: boolean;\n /** Output format for result items. */\n output?: OutputFormat;\n}\n\n/** Nearby query request. */\nexport interface NearbyQuery {\n /** Center latitude. */\n lat: number;\n /** Center longitude. */\n lon: number;\n /** Search radius in meters. */\n meters: number;\n /** Optional query controls. */\n options?: SearchOptions;\n}\n\n/** Area-based query request shared by `within` and `intersects`. */\nexport interface AreaQuery {\n /** Area to test. */\n area: Area;\n /** Optional query controls. */\n options?: SearchOptions;\n}\n\n/** Query result item. */\nexport interface SearchItem {\n /** Object identifier. */\n id: string;\n /** Object payload when requested by output options. */\n object?: GeoObject;\n /** Field map unless omitted by query options. */\n fields?: FieldMap;\n /** Distance from query center for nearby queries. */\n distance_meters: number | null;\n}\n\n/** Query results returned by scan/search/spatial queries. */\nexport interface SearchResults {\n /** Result objects. */\n results: SearchItem[];\n /** Cursor for the next page. */\n cursor: number;\n /** Number of returned items. */\n count: number;\n}\n\n/** Collection statistics. */\nexport interface CollectionStats {\n /** Collection name. */\n name: string;\n /** Number of live objects. */\n object_count: number;\n /** Number of point objects. */\n point_count: number;\n /** Number of string objects. */\n string_count: number;\n /** Number of objects with expiration metadata. */\n expires_count: number;\n}\n\n/** Collection metadata returned by `collectionInfo`. */\nexport interface CollectionInfo {\n /** Collection name. */\n name: string;\n /** Spatial bounds, if the collection contains spatial objects. */\n bounds: BoundingBox | null;\n /** Collection statistics. */\n stats: CollectionStats;\n}\n\n/** Engine metadata returned by `serverInfo`. */\nexport interface ServerInfo {\n /** Product version. */\n version: string;\n /** Public API version. */\n api_version: string;\n /** Protocol version used by native transports. */\n protocol_version: string;\n /** Storage format version. */\n storage_format_version: string;\n /** Number of collections. */\n num_collections: number;\n /** Number of live objects. */\n num_objects: number;\n /** Number of live point objects. */\n num_points: number;\n /** Approximate heap usage in bytes. */\n heap_bytes: number;\n /** Whether writes are disabled. */\n read_only: boolean;\n /** Whether the engine is acting as leader. */\n leader: boolean;\n /** Current storage sequence. */\n last_sequence: number;\n}\n\n/** Object upsert options. */\nexport interface SetObjectOptions {\n /** Field values to store alongside the object. */\n fields?: FieldMap | FieldEntry[];\n /** Optional object TTL in seconds. */\n expireSeconds?: number;\n /** Conditional write mode. */\n condition?: \"always\" | \"nx\" | \"xx\";\n}\n\n/** Mutation command names used by geofence definitions and events. */\nexport type MutationCommand = \"set\" | \"del\" | \"drop\" | \"fset\";\n\n/** Geofence detection mode. */\nexport type DetectType =\n | \"inside\"\n | \"outside\"\n | \"enter\"\n | \"exit\"\n | \"cross\"\n | \"roam\";\n\n/** Geofence query definition. */\nexport type GeofenceQuery =\n | { type: \"nearby\"; lat: number; lon: number; meters: number; options?: SearchOptions }\n | { type: \"within\"; area: Area; options?: SearchOptions }\n | { type: \"intersects\"; area: Area; options?: SearchOptions }\n | {\n type: \"roam\";\n targetCollection: string;\n targetPattern: string;\n meters: number;\n options?: SearchOptions;\n nodwell?: boolean;\n };\n\n/** Geofence hook definition. */\nexport interface GeofenceDef {\n /** Target collection evaluated by the hook. */\n collection: string;\n /** Query used by the hook. */\n query: GeofenceQuery;\n /** Detection modes emitted by the hook. */\n detect: DetectType[];\n /** Mutation commands that trigger the hook. */\n commands: MutationCommand[];\n}\n\n/** Hook summary. */\nexport interface HookInfo {\n /** Hook name. */\n name: string;\n /** Internal browser event endpoint. */\n endpoint: string;\n /** Target collection. */\n collection: string;\n}\n\n/** Full hook definition. */\nexport interface HookDef {\n /** Hook name. */\n name: string;\n /** Internal browser event endpoint. */\n endpoint: string;\n /** Geofence definition. */\n def: GeofenceDef;\n}\n\n/** Roaming metadata attached to roam events. */\nexport interface RoamingInfo {\n /** Target collection. */\n collection: string;\n /** Target object ID. */\n id: string;\n /** Roam distance in meters. */\n meters: number;\n}\n\n/** Geofence event emitted by browser hooks. */\nexport interface GeofenceEvent {\n /** Mutation command that triggered the event. */\n command: MutationCommand;\n /** Detection mode that matched. */\n detect: DetectType;\n /** Collection containing the changed object. */\n collection: string;\n /** Object ID. */\n id: string;\n /** Object payload at event time. */\n object: GeoObject;\n /** Field map at event time. */\n fields: FieldMap;\n /** Event timestamp in nanoseconds. */\n timestamp_ns: number;\n /** Stable opaque event identifier when available. */\n event_id?: string | null;\n /** Browser hook name when available. */\n hook?: string | null;\n /** Roaming group when available. */\n group?: string | null;\n /** Roaming metadata when available. */\n nearby?: RoamingInfo | null;\n}\n\n/** Client event emitted for object and collection mutations. */\nexport interface MutationEvent {\n /** Event type. */\n type:\n | \"collection:create\"\n | \"collection:drop\"\n | \"object:set\"\n | \"object:delete\"\n | \"object:expire\"\n | \"object:persist\"\n | \"hook:set\"\n | \"hook:delete\";\n /** Collection name, when applicable. */\n collection?: string;\n /** Object ID, when applicable. */\n id?: string;\n /** Hook name, when applicable. */\n hook?: string;\n /** Whether the mutation changed state. */\n changed?: boolean;\n}\n\n/** Event map used by `LatLngWasmClient.addEventListener`. */\nexport interface LatLngWasmEventMap {\n /** Any object, collection, or hook mutation. */\n mutation: CustomEvent<MutationEvent>;\n /** Any browser geofence hook event. */\n geofence: CustomEvent<GeofenceEvent>;\n /** Inside geofence event. */\n \"geofence:inside\": CustomEvent<GeofenceEvent>;\n /** Outside geofence event. */\n \"geofence:outside\": CustomEvent<GeofenceEvent>;\n /** Enter geofence event. */\n \"geofence:enter\": CustomEvent<GeofenceEvent>;\n /** Exit geofence event. */\n \"geofence:exit\": CustomEvent<GeofenceEvent>;\n /** Cross geofence event. */\n \"geofence:cross\": CustomEvent<GeofenceEvent>;\n /** Roam geofence event. */\n \"geofence:roam\": CustomEvent<GeofenceEvent>;\n}\n\nexport function toWireSetObjectRequest(\n object: GeoObject,\n options: SetObjectOptions | undefined,\n): unknown {\n return {\n object: toWireGeoObject(object),\n fields: toWireFieldEntries(options?.fields),\n expire_seconds: options?.expireSeconds ?? null,\n condition: toWireSetCondition(options?.condition),\n };\n}\n\nexport function toWireNearbyQuery(query: NearbyQuery): unknown {\n return {\n lat: query.lat,\n lon: query.lon,\n meters: query.meters,\n options: toWireSearchOptions(query.options),\n };\n}\n\nexport function toWireAreaQuery(query: AreaQuery): unknown {\n return {\n area: toWireArea(query.area),\n options: toWireSearchOptions(query.options),\n };\n}\n\nexport function toWireSearchOptions(options: SearchOptions | undefined): unknown {\n const value = options ?? {};\n return {\n cursor: value.cursor ?? 0,\n limit: value.limit ?? 100,\n nofields: value.nofields ?? false,\n match_pattern: value.matchPattern ?? null,\n sort: value.sort === \"desc\" ? \"Desc\" : \"Asc\",\n where_filters: (value.whereFilters ?? []).map((filter) => ({\n field: filter.field,\n comparison: toWireWhereComparison(filter.comparison),\n })),\n where_in_filters: value.whereInFilters ?? [],\n where_expr_filters: value.whereExprFilters ?? [],\n clip: value.clip ?? false,\n output: toWireOutputFormat(value.output),\n };\n}\n\nexport function toWireGeofenceDef(value: GeofenceDef): unknown {\n return {\n collection: value.collection,\n query: toWireGeofenceQuery(value.query),\n detect: value.detect.map(toWireDetectType),\n commands: value.commands.map(toWireMutationCommand),\n };\n}\n\nexport function fromWireObject(value: unknown): LatLngObject | null {\n if (value === null || value === undefined) {\n return null;\n }\n assertRecord(value, \"object response\");\n return {\n id: expectString(value.id, \"object id\"),\n geo: fromWireGeoObject(value.geo),\n fields: fromWireFieldMap(value.fields),\n expires_at: typeof value.expires_at === \"number\" ? value.expires_at : null,\n };\n}\n\nexport function fromWireSearchResults(value: unknown): SearchResults {\n assertRecord(value, \"search results\");\n if (!Array.isArray(value.results)) {\n throw new Error(\"search results must include results array\");\n }\n return {\n results: value.results.map((entry) => {\n assertRecord(entry, \"search result item\");\n return {\n id: expectString(entry.id, \"result id\"),\n object:\n entry.object === null || entry.object === undefined\n ? undefined\n : fromWireGeoObject(entry.object),\n fields:\n entry.fields === null || entry.fields === undefined\n ? undefined\n : fromWireFieldMap(entry.fields),\n distance_meters:\n typeof entry.distance_meters === \"number\" ? entry.distance_meters : null,\n };\n }),\n cursor: Number(value.cursor ?? 0),\n count: Number(value.count ?? 0),\n };\n}\n\nexport function fromWireGeofenceEvent(value: unknown): GeofenceEvent {\n assertRecord(value, \"geofence event\");\n return {\n command: fromWireMutationCommand(value.command),\n detect: fromWireDetectType(value.detect),\n collection: expectString(value.collection, \"event collection\"),\n id: expectString(value.id, \"event id\"),\n object: fromWireGeoObject(value.object),\n fields: fromWireFieldMap(value.fields),\n timestamp_ns:\n typeof value.timestamp_ns === \"number\"\n ? value.timestamp_ns\n : Number(value.timestamp_ns ?? 0),\n event_id: typeof value.event_id === \"string\" ? value.event_id : null,\n hook: typeof value.hook === \"string\" ? value.hook : null,\n group: typeof value.group === \"string\" ? value.group : null,\n nearby:\n isRecord(value.nearby) &&\n typeof value.nearby.collection === \"string\" &&\n typeof value.nearby.id === \"string\" &&\n typeof value.nearby.meters === \"number\"\n ? {\n collection: value.nearby.collection,\n id: value.nearby.id,\n meters: value.nearby.meters,\n }\n : null,\n };\n}\n\nexport function fromWireHookDef(value: unknown): HookDef | null {\n if (value === null || value === undefined) {\n return null;\n }\n assertRecord(value, \"hook definition\");\n return {\n name: expectString(value.name, \"hook name\"),\n endpoint: expectString(value.endpoint, \"hook endpoint\"),\n def: fromWireGeofenceDef(value.def),\n };\n}\n\nfunction toWireFieldEntries(fields: FieldMap | FieldEntry[] | undefined): unknown[] {\n if (!fields) {\n return [];\n }\n const entries = Array.isArray(fields)\n ? fields\n : Object.entries(fields).map(([name, value]) => ({ name, value }));\n return entries.map((entry) => ({\n name: entry.name,\n value: toWireFieldValue(entry.value),\n }));\n}\n\nfunction toWireFieldValue(value: FieldValue): unknown {\n switch (value.type) {\n case \"number\":\n return { type: \"number\", value: value.value };\n case \"text\":\n return { type: \"text\", value: value.value };\n case \"json\":\n return { type: \"json\", value: JSON.stringify(value.value) };\n }\n}\n\nfunction fromWireFieldValue(value: unknown): FieldValue {\n assertRecord(value, \"field value\");\n if (value.type === \"number\") {\n return { type: \"number\", value: Number(value.value) };\n }\n if (value.type === \"text\") {\n return { type: \"text\", value: String(value.value) };\n }\n if (value.type === \"json\") {\n const raw = String(value.value);\n try {\n return { type: \"json\", value: JSON.parse(raw) as JsonValue };\n } catch {\n return { type: \"json\", value: raw };\n }\n }\n throw new Error(\"unknown field value shape\");\n}\n\nfunction fromWireFieldMap(value: unknown): FieldMap {\n if (!isRecord(value) || !isRecord(value.values)) {\n return {};\n }\n return Object.fromEntries(\n Object.entries(value.values).map(([name, fieldValue]) => [\n name,\n fromWireFieldValue(fieldValue),\n ]),\n );\n}\n\nfunction toWireGeoObject(value: GeoObject): unknown {\n switch (value.type) {\n case \"point\":\n return { Point: { lat: value.lat, lon: value.lon, z: value.z ?? null } };\n case \"bounds\":\n return { Bounds: value.bounds };\n case \"hash\":\n return { Hash: value.value };\n case \"geojson\":\n return { GeoJson: value.value };\n case \"string\":\n return { String: value.value };\n }\n}\n\nfunction fromWireGeoObject(value: unknown): GeoObject {\n assertRecord(value, \"geo object\");\n if (\"Point\" in value) {\n const point = value.Point;\n assertRecord(point, \"point\");\n return {\n type: \"point\",\n lat: Number(point.lat),\n lon: Number(point.lon),\n z: typeof point.z === \"number\" || point.z === null ? point.z : undefined,\n };\n }\n if (\"Bounds\" in value) {\n return { type: \"bounds\", bounds: value.Bounds as BoundingBox };\n }\n if (\"Hash\" in value) {\n return { type: \"hash\", value: String(value.Hash) };\n }\n if (\"GeoJson\" in value) {\n return { type: \"geojson\", value: value.GeoJson as JsonValue };\n }\n if (\"String\" in value) {\n return { type: \"string\", value: String(value.String) };\n }\n throw new Error(\"unknown geo object shape\");\n}\n\nfunction toWireArea(area: Area): unknown {\n switch (area.type) {\n case \"circle\":\n return { Circle: { lat: area.lat, lon: area.lon, meters: area.meters } };\n case \"bounds\":\n return { Bounds: area.bounds };\n case \"hash\":\n return { Hash: area.value };\n case \"geojson\":\n return { GeoJson: area.value };\n case \"tile\":\n return { Tile: { x: area.x, y: area.y, z: area.z } };\n case \"quadkey\":\n return { Quadkey: area.value };\n case \"sector\":\n return {\n Sector: {\n lat: area.lat,\n lon: area.lon,\n meters: area.meters,\n bearing1: area.bearing1,\n bearing2: area.bearing2,\n },\n };\n case \"reference\":\n return { Reference: { collection: area.collection, id: area.id } };\n }\n}\n\nfunction toWireOutputFormat(value: OutputFormat | undefined): unknown {\n if (!value || value === \"objects\") {\n return \"Objects\";\n }\n if (value === \"points\") {\n return \"Points\";\n }\n if (value === \"bounds\") {\n return \"Bounds\";\n }\n if (value === \"ids\") {\n return \"Ids\";\n }\n if (value === \"count\") {\n return \"Count\";\n }\n return { Hashes: { precision: value.hashes.precision } };\n}\n\nfunction toWireWhereComparison(value: WhereComparison): unknown {\n switch (value.type) {\n case \"range\":\n return { Range: { min: value.min, max: value.max } };\n case \"equalsText\":\n return { EqualsText: value.value };\n case \"regex\":\n return { Regex: value.value };\n }\n}\n\nfunction toWireGeofenceQuery(value: GeofenceQuery): unknown {\n switch (value.type) {\n case \"nearby\":\n return {\n Nearby: {\n lat: value.lat,\n lon: value.lon,\n meters: value.meters,\n options: toWireSearchOptions(value.options),\n },\n };\n case \"within\":\n return { Within: { area: toWireArea(value.area), options: toWireSearchOptions(value.options) } };\n case \"intersects\":\n return {\n Intersects: {\n area: toWireArea(value.area),\n options: toWireSearchOptions(value.options),\n },\n };\n case \"roam\":\n return {\n Roam: {\n target_collection: value.targetCollection,\n target_pattern: value.targetPattern,\n meters: value.meters,\n options: toWireSearchOptions(value.options),\n nodwell: value.nodwell ?? false,\n },\n };\n }\n}\n\nfunction fromWireGeofenceDef(value: unknown): GeofenceDef {\n assertRecord(value, \"geofence definition\");\n const detect = value.detect;\n const commands = value.commands;\n if (!Array.isArray(detect) || !Array.isArray(commands)) {\n throw new Error(\"geofence detect and commands must be arrays\");\n }\n return {\n collection: expectString(value.collection, \"geofence collection\"),\n query: fromWireGeofenceQuery(value.query),\n detect: detect.map(fromWireDetectType),\n commands: commands.map(fromWireMutationCommand),\n };\n}\n\nfunction fromWireGeofenceQuery(value: unknown): GeofenceQuery {\n assertRecord(value, \"geofence query\");\n if (\"Nearby\" in value) {\n const nearby = value.Nearby;\n assertRecord(nearby, \"nearby query\");\n return {\n type: \"nearby\",\n lat: Number(nearby.lat),\n lon: Number(nearby.lon),\n meters: Number(nearby.meters),\n options: fromWireSearchOptions(nearby.options),\n };\n }\n if (\"Within\" in value) {\n const within = value.Within;\n assertRecord(within, \"within query\");\n return {\n type: \"within\",\n area: fromWireArea(within.area),\n options: fromWireSearchOptions(within.options),\n };\n }\n if (\"Intersects\" in value) {\n const intersects = value.Intersects;\n assertRecord(intersects, \"intersects query\");\n return {\n type: \"intersects\",\n area: fromWireArea(intersects.area),\n options: fromWireSearchOptions(intersects.options),\n };\n }\n if (\"Roam\" in value) {\n const roam = value.Roam;\n assertRecord(roam, \"roam query\");\n return {\n type: \"roam\",\n targetCollection: expectString(roam.target_collection, \"roam target collection\"),\n targetPattern: expectString(roam.target_pattern, \"roam target pattern\"),\n meters: Number(roam.meters),\n options: fromWireSearchOptions(roam.options),\n nodwell: typeof roam.nodwell === \"boolean\" ? roam.nodwell : undefined,\n };\n }\n throw new Error(\"unknown geofence query shape\");\n}\n\nfunction fromWireArea(value: unknown): Area {\n assertRecord(value, \"area\");\n if (\"Circle\" in value) {\n const circle = value.Circle;\n assertRecord(circle, \"circle area\");\n return {\n type: \"circle\",\n lat: Number(circle.lat),\n lon: Number(circle.lon),\n meters: Number(circle.meters),\n };\n }\n if (\"Bounds\" in value) {\n return { type: \"bounds\", bounds: value.Bounds as BoundingBox };\n }\n if (\"Hash\" in value) {\n return { type: \"hash\", value: String(value.Hash) };\n }\n if (\"GeoJson\" in value) {\n return { type: \"geojson\", value: value.GeoJson as JsonValue };\n }\n if (\"Tile\" in value) {\n const tile = value.Tile;\n assertRecord(tile, \"tile area\");\n return { type: \"tile\", x: Number(tile.x), y: Number(tile.y), z: Number(tile.z) };\n }\n if (\"Quadkey\" in value) {\n return { type: \"quadkey\", value: String(value.Quadkey) };\n }\n if (\"Sector\" in value) {\n const sector = value.Sector;\n assertRecord(sector, \"sector area\");\n return {\n type: \"sector\",\n lat: Number(sector.lat),\n lon: Number(sector.lon),\n meters: Number(sector.meters),\n bearing1: Number(sector.bearing1),\n bearing2: Number(sector.bearing2),\n };\n }\n if (\"Reference\" in value) {\n const reference = value.Reference;\n assertRecord(reference, \"reference area\");\n return {\n type: \"reference\",\n collection: expectString(reference.collection, \"reference collection\"),\n id: expectString(reference.id, \"reference id\"),\n };\n }\n throw new Error(\"unknown area shape\");\n}\n\nfunction fromWireSearchOptions(value: unknown): SearchOptions | undefined {\n if (!isRecord(value)) {\n return undefined;\n }\n return {\n cursor: typeof value.cursor === \"number\" ? value.cursor : undefined,\n limit: typeof value.limit === \"number\" ? value.limit : undefined,\n nofields: typeof value.nofields === \"boolean\" ? value.nofields : undefined,\n matchPattern:\n typeof value.match_pattern === \"string\" ? value.match_pattern : undefined,\n sort: value.sort === \"Desc\" ? \"desc\" : value.sort === \"Asc\" ? \"asc\" : undefined,\n clip: typeof value.clip === \"boolean\" ? value.clip : undefined,\n };\n}\n\nfunction toWireSetCondition(value: SetObjectOptions[\"condition\"] | undefined): unknown {\n switch (value) {\n case \"nx\":\n return \"Nx\";\n case \"xx\":\n return \"Xx\";\n case \"always\":\n case undefined:\n return \"Always\";\n }\n}\n\nfunction toWireMutationCommand(value: MutationCommand): string {\n switch (value) {\n case \"set\":\n return \"Set\";\n case \"del\":\n return \"Del\";\n case \"drop\":\n return \"Drop\";\n case \"fset\":\n return \"Fset\";\n }\n}\n\nfunction fromWireMutationCommand(value: unknown): MutationCommand {\n switch (value) {\n case \"Set\":\n case \"set\":\n return \"set\";\n case \"Del\":\n case \"del\":\n return \"del\";\n case \"Drop\":\n case \"drop\":\n return \"drop\";\n case \"Fset\":\n case \"fset\":\n return \"fset\";\n default:\n throw new Error(`unknown mutation command: ${String(value)}`);\n }\n}\n\nfunction toWireDetectType(value: DetectType): string {\n switch (value) {\n case \"inside\":\n return \"Inside\";\n case \"outside\":\n return \"Outside\";\n case \"enter\":\n return \"Enter\";\n case \"exit\":\n return \"Exit\";\n case \"cross\":\n return \"Cross\";\n case \"roam\":\n return \"Roam\";\n }\n}\n\nfunction fromWireDetectType(value: unknown): DetectType {\n switch (value) {\n case \"Inside\":\n case \"inside\":\n return \"inside\";\n case \"Outside\":\n case \"outside\":\n return \"outside\";\n case \"Enter\":\n case \"enter\":\n return \"enter\";\n case \"Exit\":\n case \"exit\":\n return \"exit\";\n case \"Cross\":\n case \"cross\":\n return \"cross\";\n case \"Roam\":\n case \"roam\":\n return \"roam\";\n default:\n throw new Error(`unknown detect type: ${String(value)}`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction assertRecord(value: unknown, label: string): asserts value is Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`${label} must be an object`);\n }\n}\n\nfunction expectString(value: unknown, label: string): string {\n if (typeof value !== \"string\") {\n throw new Error(`${label} must be a string`);\n }\n return value;\n}\n","import init, { BrowserLatLng } from \"../pkg/latlng_core.js\";\nimport type {\n WasmMutationResponse,\n WorkerOutboundMessage,\n WorkerRequest,\n} from \"./messages.js\";\nimport { fromWireGeofenceEvent, type MutationEvent } from \"./types.js\";\n\nlet enginePromise: Promise<BrowserLatLng> | undefined;\nlet configuredWasmUrl: string | undefined;\n\nfunction engine(): Promise<BrowserLatLng> {\n const wasmUrl =\n configuredWasmUrl ??\n new URL([\"..\", \"wasm\", \"latlng_core_bg.wasm\"].join(\"/\"), import.meta.url);\n enginePromise ??= init(wasmUrl).then(() => new BrowserLatLng());\n return enginePromise;\n}\n\nself.addEventListener(\"message\", (message: MessageEvent<WorkerRequest>) => {\n void handleRequest(message.data);\n});\n\nasync function handleRequest(request: WorkerRequest): Promise<void> {\n try {\n if (request.method === \"init\") {\n const result = await initialize(request.params);\n post({ id: request.id, ok: true, result });\n return;\n }\n const db = await engine();\n const result = await dispatch(db, request.method, request.params);\n post({ id: request.id, ok: true, result });\n } catch (error) {\n post({\n id: request.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n}\n\nasync function initialize(params: unknown[]): Promise<unknown> {\n const [wasmUrl] = expectParams<[string | null]>(params);\n if (!enginePromise && typeof wasmUrl === \"string\" && wasmUrl.length > 0) {\n configuredWasmUrl = wasmUrl;\n }\n return (await engine()).server_info();\n}\n\nasync function dispatch(\n db: BrowserLatLng,\n method: WorkerRequest[\"method\"],\n params: unknown[],\n): Promise<unknown> {\n switch (method) {\n case \"init\":\n return initialize(params);\n case \"createCollection\": {\n const [collection] = expectParams<[string]>(params);\n const response = db.create_collection(collection) as WasmMutationResponse<boolean>;\n emitMutation({\n type: \"collection:create\",\n collection,\n changed: response.result,\n });\n emitGeofences(response.events);\n return response.result;\n }\n case \"dropCollection\": {\n const [collection] = expectParams<[string]>(params);\n const response = db.drop_collection(collection) as WasmMutationResponse<boolean>;\n emitMutation({\n type: \"collection:drop\",\n collection,\n changed: response.result,\n });\n emitGeofences(response.events);\n return response.result;\n }\n case \"collections\": {\n const [pattern] = expectParams<[string | null]>(params);\n return db.collections(pattern);\n }\n case \"collectionInfo\": {\n const [collection] = expectParams<[string]>(params);\n return db.collection_info(collection);\n }\n case \"setObject\": {\n const [collection, id, payload] = expectParams<[string, string, unknown]>(params);\n const response = db.set_object(\n collection,\n id,\n payload,\n ) as WasmMutationResponse<boolean>;\n emitMutation({\n type: \"object:set\",\n collection,\n id,\n changed: response.result,\n });\n emitGeofences(response.events);\n return response.result;\n }\n case \"getObject\": {\n const [collection, id, withFields] = expectParams<[string, string, boolean]>(params);\n return db.get_object(collection, id, withFields);\n }\n case \"deleteObject\": {\n const [collection, id] = expectParams<[string, string]>(params);\n const response = db.delete_object(\n collection,\n id,\n ) as WasmMutationResponse<boolean>;\n emitMutation({\n type: \"object:delete\",\n collection,\n id,\n changed: response.result,\n });\n emitGeofences(response.events);\n return response.result;\n }\n case \"expire\": {\n const [collection, id, seconds] = expectParams<[string, string, number]>(params);\n const response = db.expire(collection, id, seconds) as WasmMutationResponse<boolean>;\n emitMutation({ type: \"object:expire\", collection, id, changed: response.result });\n return response.result;\n }\n case \"persist\": {\n const [collection, id] = expectParams<[string, string]>(params);\n const response = db.persist(collection, id) as WasmMutationResponse<boolean>;\n emitMutation({ type: \"object:persist\", collection, id, changed: response.result });\n return response.result;\n }\n case \"ttl\": {\n const [collection, id] = expectParams<[string, string]>(params);\n return db.ttl(collection, id);\n }\n case \"setHook\": {\n const [name, def] = expectParams<[string, unknown]>(params);\n db.set_hook(name, def);\n emitMutation({ type: \"hook:set\", hook: name, changed: true });\n return true;\n }\n case \"deleteHook\": {\n const [name] = expectParams<[string]>(params);\n const deleted = db.delete_hook(name);\n emitMutation({ type: \"hook:delete\", hook: name, changed: deleted });\n return deleted;\n }\n case \"hooks\": {\n const [pattern] = expectParams<[string | null]>(params);\n return db.hooks(pattern);\n }\n case \"getHook\": {\n const [name] = expectParams<[string]>(params);\n return db.hook(name);\n }\n case \"nearby\": {\n const [collection, query] = expectParams<[string, unknown]>(params);\n return db.nearby_query(collection, query);\n }\n case \"within\": {\n const [collection, query] = expectParams<[string, unknown]>(params);\n return db.within_query(collection, query);\n }\n case \"intersects\": {\n const [collection, query] = expectParams<[string, unknown]>(params);\n return db.intersects_query(collection, query);\n }\n case \"scan\": {\n const [collection, options] = expectParams<[string, unknown]>(params);\n return db.scan(collection, options);\n }\n case \"search\": {\n const [collection, options] = expectParams<[string, unknown]>(params);\n return db.search(collection, options);\n }\n case \"bounds\": {\n const [collection] = expectParams<[string]>(params);\n return db.bounds(collection);\n }\n case \"stats\": {\n const [collections] = expectParams<[string[]]>(params);\n return db.stats(collections);\n }\n case \"serverInfo\":\n return db.server_info();\n }\n}\n\nfunction emitMutation(event: MutationEvent): void {\n post({ type: \"event\", eventType: \"mutation\", event });\n}\n\nfunction emitGeofences(events: unknown[]): void {\n for (const event of events) {\n post({\n type: \"event\",\n eventType: \"geofence\",\n event: fromWireGeofenceEvent(event),\n });\n }\n}\n\nfunction post(message: WorkerOutboundMessage): void {\n self.postMessage(message);\n}\n\nfunction expectParams<T extends unknown[]>(params: unknown[]): T {\n return params as T;\n}\n"],"mappings":"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"}