okgeometry-api 1.1.11 → 1.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-base64.js","sourceRoot":"","sources":["../src/wasm-base64.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,0s3wDAA0s3wD,CAAC"}
1
+ {"version":3,"file":"wasm-base64.js","sourceRoot":"","sources":["../src/wasm-base64.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,MAAM,CAAC,MAAM,QAAQ,GAAG,sthyDAAsthyD,CAAC"}
@@ -1688,7 +1688,7 @@ export function version() {
1688
1688
  function __wbg_get_imports() {
1689
1689
  const import0 = {
1690
1690
  __proto__: null,
1691
- __wbg___okgeometry_boolean_should_cancel_172c0bc0a108e762: function () {
1691
+ __wbg___okgeometry_boolean_should_cancel_9b2919fd8513410f: function () {
1692
1692
  const ret = globalThis.__okgeometry_boolean_should_cancel();
1693
1693
  return ret;
1694
1694
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okgeometry-api",
3
- "version": "1.1.11",
3
+ "version": "1.1.13",
4
4
  "description": "Geometry engine API for AEC applications — NURBS, meshes, booleans, intersections. Powered by Rust/WASM.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/Mesh.ts CHANGED
@@ -17,24 +17,24 @@ import {
17
17
  disposeMeshBooleanWorkerPools,
18
18
  runMeshBooleanInWorkerPool,
19
19
  } from "./mesh-boolean.pool.js";
20
- import { MeshBooleanExecutionError } from "./mesh-boolean.protocol.js";
21
- import type {
22
- MeshBooleanAsyncOptions,
23
- MeshBooleanLimits,
24
- MeshBooleanOptions,
25
- } from "./mesh-boolean.protocol.js";
20
+ import { MeshBooleanExecutionError } from "./mesh-boolean.protocol.js";
21
+ import type {
22
+ MeshBooleanAsyncOptions,
23
+ MeshBooleanLimits,
24
+ MeshBooleanOptions,
25
+ } from "./mesh-boolean.protocol.js";
26
26
  import * as wasm from "./wasm-bindings.js";
27
27
  import { mesh_topology_metrics } from "./wasm-bindings.js";
28
28
 
29
29
  export { MeshBooleanExecutionError };
30
- export type {
31
- MeshBooleanAsyncOptions,
32
- MeshBooleanLimits,
33
- MeshBooleanOptions,
34
- MeshBooleanErrorCode,
35
- MeshBooleanErrorPayload,
36
- MeshBooleanProgressEvent,
37
- } from "./mesh-boolean.protocol.js";
30
+ export type {
31
+ MeshBooleanAsyncOptions,
32
+ MeshBooleanLimits,
33
+ MeshBooleanOptions,
34
+ MeshBooleanErrorCode,
35
+ MeshBooleanErrorPayload,
36
+ MeshBooleanProgressEvent,
37
+ } from "./mesh-boolean.protocol.js";
38
38
 
39
39
  export interface PlanarRectangle {
40
40
  corners: [Point, Point, Point, Point];
@@ -1,36 +1,36 @@
1
- import {
2
- MeshBooleanExecutionError,
3
- type MeshBooleanAsyncOptions,
4
- type MeshBooleanErrorPayload,
5
- type MeshBooleanOperation,
6
- type MeshBooleanOptions,
7
- type MeshBooleanProgressEvent,
8
- type MeshBooleanWorkerRequest,
9
- type MeshBooleanWorkerResponse,
10
- } from "./mesh-boolean.protocol.js";
1
+ import {
2
+ MeshBooleanExecutionError,
3
+ type MeshBooleanAsyncOptions,
4
+ type MeshBooleanErrorPayload,
5
+ type MeshBooleanOperation,
6
+ type MeshBooleanOptions,
7
+ type MeshBooleanProgressEvent,
8
+ type MeshBooleanWorkerRequest,
9
+ type MeshBooleanWorkerResponse,
10
+ } from "./mesh-boolean.protocol.js";
11
11
 
12
12
  interface PoolAcquireOptions {
13
13
  size?: number;
14
14
  workerFactory?: () => Worker;
15
15
  }
16
16
 
17
- interface BooleanJob {
18
- id: number;
19
- operation: MeshBooleanOperation;
20
- options: MeshBooleanOptions;
21
- onProgress?: (event: MeshBooleanProgressEvent) => void;
22
- signal?: AbortSignal;
23
- timeoutMs?: number;
24
- bufferA: ArrayBuffer;
17
+ interface BooleanJob {
18
+ id: number;
19
+ operation: MeshBooleanOperation;
20
+ options: MeshBooleanOptions;
21
+ onProgress?: (event: MeshBooleanProgressEvent) => void;
22
+ signal?: AbortSignal;
23
+ timeoutMs?: number;
24
+ bufferA: ArrayBuffer;
25
25
  bufferB: ArrayBuffer;
26
26
  trustedInputA: boolean;
27
27
  trustedInputB: boolean;
28
28
  cancelView?: Int32Array;
29
- timeoutToken?: number;
30
- abortHandler?: () => void;
31
- resolve: (value: Float64Array) => void;
32
- reject: (reason: Error) => void;
33
- }
29
+ timeoutToken?: number;
30
+ abortHandler?: () => void;
31
+ resolve: (value: Float64Array) => void;
32
+ reject: (reason: Error) => void;
33
+ }
34
34
 
35
35
  interface WorkerSlot {
36
36
  id: number;
@@ -127,22 +127,22 @@ export class MeshBooleanWorkerPool {
127
127
  const job: BooleanJob = {
128
128
  id: jobId,
129
129
  operation,
130
- options: {
131
- allowUnsafe: options?.allowUnsafe ?? true,
132
- limits: options?.limits,
133
- debugForceFaceID: options?.debugForceFaceID,
134
- },
135
- onProgress: options?.onProgress,
136
- signal: options?.signal,
137
- timeoutMs: options?.timeoutMs,
138
- bufferA: new Float64Array(bufferA).buffer,
130
+ options: {
131
+ allowUnsafe: options?.allowUnsafe ?? true,
132
+ limits: options?.limits,
133
+ debugForceFaceID: options?.debugForceFaceID,
134
+ },
135
+ onProgress: options?.onProgress,
136
+ signal: options?.signal,
137
+ timeoutMs: options?.timeoutMs,
138
+ bufferA: new Float64Array(bufferA).buffer,
139
139
  bufferB: new Float64Array(bufferB).buffer,
140
- trustedInputA,
141
- trustedInputB,
142
- cancelView: createCancellationView(),
143
- resolve,
144
- reject,
145
- };
140
+ trustedInputA,
141
+ trustedInputB,
142
+ cancelView: createCancellationView(),
143
+ resolve,
144
+ reject,
145
+ };
146
146
 
147
147
  if (job.signal?.aborted) {
148
148
  this.rejectJob(job, rejectPayload("worker_aborted", `Boolean ${operation} aborted.`));
@@ -239,9 +239,9 @@ export class MeshBooleanWorkerPool {
239
239
  continue;
240
240
  }
241
241
 
242
- slot.currentJobId = job.id;
243
- this.running.set(job.id, job);
244
- this.emitProgress(job, "running", slot.id);
242
+ slot.currentJobId = job.id;
243
+ this.running.set(job.id, job);
244
+ this.emitProgress(job, "running", slot.id);
245
245
 
246
246
  if (job.timeoutMs !== undefined && Number.isFinite(job.timeoutMs) && job.timeoutMs > 0) {
247
247
  job.timeoutToken = setTimeout(() => {
@@ -300,18 +300,18 @@ export class MeshBooleanWorkerPool {
300
300
  return;
301
301
  }
302
302
 
303
- if (data.ok) {
304
- this.finishRunningJob(slot, job, undefined, new Float64Array(data.buffer));
305
- return;
306
- }
307
-
308
- this.finishRunningJob(
309
- slot,
310
- job,
311
- new MeshBooleanExecutionError(data.error),
312
- undefined,
313
- );
314
- }
303
+ if (data.ok) {
304
+ this.finishRunningJob(slot, job, undefined, new Float64Array(data.buffer));
305
+ return;
306
+ }
307
+
308
+ this.finishRunningJob(
309
+ slot,
310
+ job,
311
+ new MeshBooleanExecutionError(data.error),
312
+ undefined,
313
+ );
314
+ }
315
315
 
316
316
  private failWorker(slot: WorkerSlot, payload: MeshBooleanErrorPayload): void {
317
317
  const jobId = slot.currentJobId;
@@ -371,18 +371,18 @@ export class MeshBooleanWorkerPool {
371
371
  this.dispatch();
372
372
  }
373
373
 
374
- private finishRunningJob(
375
- slot: WorkerSlot,
376
- job: BooleanJob,
377
- error: Error | undefined,
378
- result: Float64Array | undefined,
379
- ): void {
380
- this.running.delete(job.id);
381
- slot.currentJobId = null;
382
- this.cleanupJob(job);
383
-
384
- if (error) {
385
- job.reject(error);
374
+ private finishRunningJob(
375
+ slot: WorkerSlot,
376
+ job: BooleanJob,
377
+ error: Error | undefined,
378
+ result: Float64Array | undefined,
379
+ ): void {
380
+ this.running.delete(job.id);
381
+ slot.currentJobId = null;
382
+ this.cleanupJob(job);
383
+
384
+ if (error) {
385
+ job.reject(error);
386
386
  } else if (result) {
387
387
  job.resolve(result);
388
388
  } else {
@@ -410,15 +410,15 @@ export class MeshBooleanWorkerPool {
410
410
  }
411
411
 
412
412
  private emitProgress(job: BooleanJob, stage: MeshBooleanProgressEvent["stage"], workerId?: number): void {
413
- if (!job.onProgress) return;
414
- job.onProgress({
415
- stage,
416
- jobId: job.id,
417
- workerId,
418
- queueSize: this.queue.length,
419
- });
420
- }
421
- }
413
+ if (!job.onProgress) return;
414
+ job.onProgress({
415
+ stage,
416
+ jobId: job.id,
417
+ workerId,
418
+ queueSize: this.queue.length,
419
+ });
420
+ }
421
+ }
422
422
 
423
423
  let defaultPoolSizeOverride: number | undefined;
424
424
  const defaultPools = new Map<number, MeshBooleanWorkerPool>();
@@ -36,14 +36,14 @@ export interface MeshBooleanErrorPayload {
36
36
  details?: string;
37
37
  }
38
38
 
39
- export type MeshBooleanJobStage = "queued" | "running" | "completed";
40
-
41
- export interface MeshBooleanProgressEvent {
42
- stage: MeshBooleanJobStage;
43
- jobId: number;
44
- workerId?: number;
45
- queueSize: number;
46
- }
39
+ export type MeshBooleanJobStage = "queued" | "running" | "completed";
40
+
41
+ export interface MeshBooleanProgressEvent {
42
+ stage: MeshBooleanJobStage;
43
+ jobId: number;
44
+ workerId?: number;
45
+ queueSize: number;
46
+ }
47
47
 
48
48
  export interface MeshBooleanAsyncOptions extends MeshBooleanOptions {
49
49
  /**
@@ -62,11 +62,11 @@ export interface MeshBooleanAsyncOptions extends MeshBooleanOptions {
62
62
  * Override worker pool size for this call.
63
63
  */
64
64
  poolSize?: number;
65
- /**
66
- * Observe coarse-grained job stage changes.
67
- */
68
- onProgress?: (event: MeshBooleanProgressEvent) => void;
69
- }
65
+ /**
66
+ * Observe coarse-grained job stage changes.
67
+ */
68
+ onProgress?: (event: MeshBooleanProgressEvent) => void;
69
+ }
70
70
 
71
71
  export interface MeshBooleanWorkerRequest {
72
72
  kind: "mesh-boolean-request";
@@ -92,21 +92,19 @@ export interface MeshBooleanWorkerCancel {
92
92
 
93
93
  export type MeshBooleanWorkerInbound = MeshBooleanWorkerRequest | MeshBooleanWorkerCancel;
94
94
 
95
- export interface MeshBooleanWorkerSuccessResponse {
96
- kind: "mesh-boolean-result";
97
- jobId: number;
98
- ok: true;
99
- buffer: ArrayBuffer;
100
- elapsedMs: number;
101
- }
95
+ export interface MeshBooleanWorkerSuccessResponse {
96
+ kind: "mesh-boolean-result";
97
+ jobId: number;
98
+ ok: true;
99
+ buffer: ArrayBuffer;
100
+ }
102
101
 
103
- export interface MeshBooleanWorkerErrorResponse {
104
- kind: "mesh-boolean-result";
105
- jobId: number;
106
- ok: false;
107
- error: MeshBooleanErrorPayload;
108
- elapsedMs: number;
109
- }
102
+ export interface MeshBooleanWorkerErrorResponse {
103
+ kind: "mesh-boolean-result";
104
+ jobId: number;
105
+ ok: false;
106
+ error: MeshBooleanErrorPayload;
107
+ }
110
108
 
111
109
  export type MeshBooleanWorkerResponse = MeshBooleanWorkerSuccessResponse | MeshBooleanWorkerErrorResponse;
112
110
 
@@ -33,15 +33,8 @@ function isCancelled(jobId: number, cancelView: Int32Array | undefined): boolean
33
33
  return cancelledJobs.has(jobId) || readCancelRequested(cancelView);
34
34
  }
35
35
 
36
- workerGlobal.__okgeometry_boolean_should_cancel = () =>
37
- readCancelRequested(workerGlobal.__okgeometryBooleanCancelFlag ?? undefined);
38
-
39
- function nowMs(): number {
40
- if (typeof performance !== "undefined" && typeof performance.now === "function") {
41
- return performance.now();
42
- }
43
- return Date.now();
44
- }
36
+ workerGlobal.__okgeometry_boolean_should_cancel = () =>
37
+ readCancelRequested(workerGlobal.__okgeometryBooleanCancelFlag ?? undefined);
45
38
 
46
39
  function toErrorMessage(error: unknown): string {
47
40
  if (error instanceof Error) return error.message;
@@ -53,27 +46,25 @@ function makeError(code: MeshBooleanErrorPayload["code"], message: string, detai
53
46
  return { code, message, details };
54
47
  }
55
48
 
56
- function postError(jobId: number, startedAt: number, payload: MeshBooleanErrorPayload): void {
57
- const response: MeshBooleanWorkerErrorResponse = {
58
- kind: "mesh-boolean-result",
59
- jobId,
60
- ok: false,
61
- error: payload,
62
- elapsedMs: Math.max(0, nowMs() - startedAt),
63
- };
64
- workerScope.postMessage(response);
65
- }
66
-
67
- function postSuccess(jobId: number, startedAt: number, buffer: ArrayBuffer): void {
68
- const response: MeshBooleanWorkerSuccessResponse = {
69
- kind: "mesh-boolean-result",
70
- jobId,
71
- ok: true,
72
- buffer,
73
- elapsedMs: Math.max(0, nowMs() - startedAt),
74
- };
75
- workerScope.postMessage(response, [buffer]);
76
- }
49
+ function postError(jobId: number, payload: MeshBooleanErrorPayload): void {
50
+ const response: MeshBooleanWorkerErrorResponse = {
51
+ kind: "mesh-boolean-result",
52
+ jobId,
53
+ ok: false,
54
+ error: payload,
55
+ };
56
+ workerScope.postMessage(response);
57
+ }
58
+
59
+ function postSuccess(jobId: number, buffer: ArrayBuffer): void {
60
+ const response: MeshBooleanWorkerSuccessResponse = {
61
+ kind: "mesh-boolean-result",
62
+ jobId,
63
+ ok: true,
64
+ buffer,
65
+ };
66
+ workerScope.postMessage(response, [buffer]);
67
+ }
77
68
 
78
69
  async function ensureWorkerInit(): Promise<void> {
79
70
  if (isInitialized()) return;
@@ -91,26 +82,25 @@ workerScope.addEventListener("message", async (event: MessageEvent<MeshBooleanWo
91
82
  cancelledJobs.add(message.jobId);
92
83
  return;
93
84
  }
94
-
95
- if (message.kind !== "mesh-boolean-request") return;
96
- const startedAt = nowMs();
97
- const jobId = message.jobId;
98
- const cancelView = message.cancelBuffer ? new Int32Array(message.cancelBuffer) : undefined;
99
-
100
- if (isCancelled(jobId, cancelView)) {
101
- postError(jobId, startedAt, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
102
- cancelledJobs.delete(jobId);
103
- return;
104
- }
85
+
86
+ if (message.kind !== "mesh-boolean-request") return;
87
+ const jobId = message.jobId;
88
+ const cancelView = message.cancelBuffer ? new Int32Array(message.cancelBuffer) : undefined;
89
+
90
+ if (isCancelled(jobId, cancelView)) {
91
+ postError(jobId, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
92
+ cancelledJobs.delete(jobId);
93
+ return;
94
+ }
105
95
 
106
96
  try {
107
- await ensureWorkerInit();
108
-
109
- if (isCancelled(jobId, cancelView)) {
110
- postError(jobId, startedAt, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
111
- cancelledJobs.delete(jobId);
112
- return;
113
- }
97
+ await ensureWorkerInit();
98
+
99
+ if (isCancelled(jobId, cancelView)) {
100
+ postError(jobId, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
101
+ cancelledJobs.delete(jobId);
102
+ return;
103
+ }
114
104
 
115
105
  workerGlobal.__okgeometryBooleanCancelFlag = cancelView ?? null;
116
106
 
@@ -134,24 +124,23 @@ workerScope.addEventListener("message", async (event: MessageEvent<MeshBooleanWo
134
124
  } else {
135
125
  result = meshA.intersect(meshB, options);
136
126
  }
137
-
138
- if (isCancelled(jobId, cancelView)) {
139
- postError(jobId, startedAt, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
140
- cancelledJobs.delete(jobId);
141
- return;
142
- }
143
-
144
- const payload = new Float64Array(result.rawBuffer);
145
- postSuccess(jobId, startedAt, payload.buffer);
146
- } catch (error) {
147
- const details = toErrorMessage(error);
148
- const cancelled = isCancelled(jobId, cancelView) || details.toLowerCase().includes("cancel");
149
- postError(
150
- jobId,
151
- startedAt,
152
- makeError(
153
- cancelled ? "worker_aborted" : "kernel_error",
154
- cancelled ? `Boolean ${message.operation} aborted.` : `Boolean ${message.operation} failed.`,
127
+
128
+ if (isCancelled(jobId, cancelView)) {
129
+ postError(jobId, makeError("worker_aborted", `Boolean ${message.operation} aborted.`));
130
+ cancelledJobs.delete(jobId);
131
+ return;
132
+ }
133
+
134
+ const payload = new Float64Array(result.rawBuffer);
135
+ postSuccess(jobId, payload.buffer);
136
+ } catch (error) {
137
+ const details = toErrorMessage(error);
138
+ const cancelled = isCancelled(jobId, cancelView) || details.toLowerCase().includes("cancel");
139
+ postError(
140
+ jobId,
141
+ makeError(
142
+ cancelled ? "worker_aborted" : "kernel_error",
143
+ cancelled ? `Boolean ${message.operation} aborted.` : `Boolean ${message.operation} failed.`,
155
144
  cancelled ? undefined : details,
156
145
  ),
157
146
  );