@ifc-lite/sdk 1.7.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 +373 -0
- package/dist/context.d.ts +76 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +106 -0
- package/dist/context.js.map +1 -0
- package/dist/host.d.ts +29 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +91 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/namespaces/bcf.d.ts +36 -0
- package/dist/namespaces/bcf.d.ts.map +1 -0
- package/dist/namespaces/bcf.js +42 -0
- package/dist/namespaces/bcf.js.map +1 -0
- package/dist/namespaces/drawing.d.ts +30 -0
- package/dist/namespaces/drawing.d.ts.map +1 -0
- package/dist/namespaces/drawing.js +33 -0
- package/dist/namespaces/drawing.js.map +1 -0
- package/dist/namespaces/events.d.ts +14 -0
- package/dist/namespaces/events.d.ts.map +1 -0
- package/dist/namespaces/events.js +30 -0
- package/dist/namespaces/events.js.map +1 -0
- package/dist/namespaces/export.d.ts +38 -0
- package/dist/namespaces/export.d.ts.map +1 -0
- package/dist/namespaces/export.js +136 -0
- package/dist/namespaces/export.js.map +1 -0
- package/dist/namespaces/ids.d.ts +28 -0
- package/dist/namespaces/ids.d.ts.map +1 -0
- package/dist/namespaces/ids.js +40 -0
- package/dist/namespaces/ids.js.map +1 -0
- package/dist/namespaces/lens.d.ts +15 -0
- package/dist/namespaces/lens.d.ts.map +1 -0
- package/dist/namespaces/lens.js +25 -0
- package/dist/namespaces/lens.js.map +1 -0
- package/dist/namespaces/list.d.ts +19 -0
- package/dist/namespaces/list.d.ts.map +1 -0
- package/dist/namespaces/list.js +19 -0
- package/dist/namespaces/list.js.map +1 -0
- package/dist/namespaces/model.d.ts +15 -0
- package/dist/namespaces/model.d.ts.map +1 -0
- package/dist/namespaces/model.js +30 -0
- package/dist/namespaces/model.js.map +1 -0
- package/dist/namespaces/mutate.d.ts +21 -0
- package/dist/namespaces/mutate.d.ts.map +1 -0
- package/dist/namespaces/mutate.js +41 -0
- package/dist/namespaces/mutate.js.map +1 -0
- package/dist/namespaces/query.d.ts +60 -0
- package/dist/namespaces/query.d.ts.map +1 -0
- package/dist/namespaces/query.js +158 -0
- package/dist/namespaces/query.js.map +1 -0
- package/dist/namespaces/spatial.d.ts +20 -0
- package/dist/namespaces/spatial.d.ts.map +1 -0
- package/dist/namespaces/spatial.js +28 -0
- package/dist/namespaces/spatial.js.map +1 -0
- package/dist/namespaces/viewer.d.ts +46 -0
- package/dist/namespaces/viewer.d.ts.map +1 -0
- package/dist/namespaces/viewer.js +91 -0
- package/dist/namespaces/viewer.js.map +1 -0
- package/dist/transport/broadcast.d.ts +23 -0
- package/dist/transport/broadcast.d.ts.map +1 -0
- package/dist/transport/broadcast.js +59 -0
- package/dist/transport/broadcast.js.map +1 -0
- package/dist/transport/message-port.d.ts +20 -0
- package/dist/transport/message-port.d.ts.map +1 -0
- package/dist/transport/message-port.js +57 -0
- package/dist/transport/message-port.js.map +1 -0
- package/dist/transport/remote-backend.d.ts +23 -0
- package/dist/transport/remote-backend.d.ts.map +1 -0
- package/dist/transport/remote-backend.js +36 -0
- package/dist/transport/remote-backend.js.map +1 -0
- package/dist/transport/types.d.ts +10 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +5 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/types.d.ts +236 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +33 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { hexToRgba } from '@ifc-lite/lens';
|
|
5
|
+
/** bim.viewer — Renderer control, camera, section planes */
|
|
6
|
+
export class ViewerNamespace {
|
|
7
|
+
backend;
|
|
8
|
+
constructor(backend) {
|
|
9
|
+
this.backend = backend;
|
|
10
|
+
}
|
|
11
|
+
// ── Color overlays ─────────────────────────────────────────
|
|
12
|
+
/** Colorize entities with a hex color string */
|
|
13
|
+
colorize(refs, color) {
|
|
14
|
+
const rgba = hexToRgba(color, 1.0);
|
|
15
|
+
this.backend.viewer.colorize(refs, rgba);
|
|
16
|
+
}
|
|
17
|
+
/** Colorize with RGBA tuple [0-1] */
|
|
18
|
+
colorizeRgba(refs, color) {
|
|
19
|
+
this.backend.viewer.colorize(refs, color);
|
|
20
|
+
}
|
|
21
|
+
/** Batch colorize: apply multiple entity-color pairs in a single call */
|
|
22
|
+
colorizeAll(batches) {
|
|
23
|
+
const resolved = batches.map(b => ({ refs: b.refs, color: hexToRgba(b.color, 1.0) }));
|
|
24
|
+
this.backend.viewer.colorizeAll(resolved);
|
|
25
|
+
}
|
|
26
|
+
/** Reset color overrides */
|
|
27
|
+
resetColors(refs) {
|
|
28
|
+
this.backend.viewer.resetColors(refs);
|
|
29
|
+
}
|
|
30
|
+
// ── Visibility ─────────────────────────────────────────────
|
|
31
|
+
/** Hide entities */
|
|
32
|
+
hide(refs) {
|
|
33
|
+
this.backend.visibility.hide(refs);
|
|
34
|
+
}
|
|
35
|
+
/** Show previously hidden entities */
|
|
36
|
+
show(refs) {
|
|
37
|
+
this.backend.visibility.show(refs);
|
|
38
|
+
}
|
|
39
|
+
/** Isolate entities (hide everything else) */
|
|
40
|
+
isolate(refs) {
|
|
41
|
+
this.backend.visibility.isolate(refs);
|
|
42
|
+
}
|
|
43
|
+
/** Reset all visibility to default */
|
|
44
|
+
resetVisibility() {
|
|
45
|
+
this.backend.visibility.reset();
|
|
46
|
+
}
|
|
47
|
+
// ── Selection ──────────────────────────────────────────────
|
|
48
|
+
/** Set the selection to given entities */
|
|
49
|
+
select(refs) {
|
|
50
|
+
this.backend.selection.set(refs);
|
|
51
|
+
}
|
|
52
|
+
/** Clear selection */
|
|
53
|
+
deselect() {
|
|
54
|
+
this.backend.selection.set([]);
|
|
55
|
+
}
|
|
56
|
+
/** Get current selection */
|
|
57
|
+
getSelection() {
|
|
58
|
+
return this.backend.selection.get();
|
|
59
|
+
}
|
|
60
|
+
// ── Camera ─────────────────────────────────────────────────
|
|
61
|
+
/** Fly camera to frame the given entities */
|
|
62
|
+
flyTo(refs) {
|
|
63
|
+
this.backend.viewer.flyTo(refs);
|
|
64
|
+
}
|
|
65
|
+
/** Set camera state */
|
|
66
|
+
setCamera(state) {
|
|
67
|
+
this.backend.viewer.setCamera(state);
|
|
68
|
+
}
|
|
69
|
+
/** Get current camera state */
|
|
70
|
+
getCamera() {
|
|
71
|
+
return this.backend.viewer.getCamera();
|
|
72
|
+
}
|
|
73
|
+
/** Switch projection mode */
|
|
74
|
+
setProjection(mode) {
|
|
75
|
+
this.backend.viewer.setCamera({ mode });
|
|
76
|
+
}
|
|
77
|
+
// ── Section planes ─────────────────────────────────────────
|
|
78
|
+
/** Set a section plane */
|
|
79
|
+
setSection(section) {
|
|
80
|
+
this.backend.viewer.setSection(section);
|
|
81
|
+
}
|
|
82
|
+
/** Get current section plane */
|
|
83
|
+
getSection() {
|
|
84
|
+
return this.backend.viewer.getSection();
|
|
85
|
+
}
|
|
86
|
+
/** Remove section plane */
|
|
87
|
+
clearSection() {
|
|
88
|
+
this.backend.viewer.setSection(null);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=viewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/namespaces/viewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BroadcastTransport — connects to a BimHost in another tab via BroadcastChannel.
|
|
3
|
+
*
|
|
4
|
+
* Usage (script IDE side):
|
|
5
|
+
* const transport = new BroadcastTransport('ifc-lite')
|
|
6
|
+
* const bim = createBimContext({ transport })
|
|
7
|
+
*
|
|
8
|
+
* The viewer (host side) listens on the same channel name via BimHost.
|
|
9
|
+
*/
|
|
10
|
+
import type { SdkRequest, SdkResponse, SdkEvent, Transport } from '../types.js';
|
|
11
|
+
export declare class BroadcastTransport implements Transport {
|
|
12
|
+
private channel;
|
|
13
|
+
private pending;
|
|
14
|
+
private eventHandlers;
|
|
15
|
+
private timeoutMs;
|
|
16
|
+
constructor(channelName: string, options?: {
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
});
|
|
19
|
+
send(request: SdkRequest): Promise<SdkResponse>;
|
|
20
|
+
subscribe(handler: (event: SdkEvent) => void): () => void;
|
|
21
|
+
close(): void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=broadcast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../src/transport/broadcast.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhF,qBAAa,kBAAmB,YAAW,SAAS;IAClD,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,OAAO,CAIV;IACL,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAS;gBAEd,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IA6B3D,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAYrD,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD,KAAK,IAAI,IAAI;CAUd"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export class BroadcastTransport {
|
|
5
|
+
channel;
|
|
6
|
+
pending = new Map();
|
|
7
|
+
eventHandlers = new Set();
|
|
8
|
+
timeoutMs;
|
|
9
|
+
constructor(channelName, options) {
|
|
10
|
+
this.channel = new BroadcastChannel(channelName);
|
|
11
|
+
this.timeoutMs = options?.timeoutMs ?? 30_000;
|
|
12
|
+
this.channel.onmessage = (event) => {
|
|
13
|
+
const data = event.data;
|
|
14
|
+
// Response to a request
|
|
15
|
+
if (data && typeof data === 'object' && 'id' in data && ('result' in data || 'error' in data)) {
|
|
16
|
+
const response = data;
|
|
17
|
+
const entry = this.pending.get(response.id);
|
|
18
|
+
if (entry) {
|
|
19
|
+
clearTimeout(entry.timer);
|
|
20
|
+
this.pending.delete(response.id);
|
|
21
|
+
entry.resolve(response);
|
|
22
|
+
}
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
// Event from host
|
|
26
|
+
if (data && typeof data === 'object' && 'type' in data && 'data' in data) {
|
|
27
|
+
const sdkEvent = data;
|
|
28
|
+
for (const handler of this.eventHandlers) {
|
|
29
|
+
handler(sdkEvent);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async send(request) {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const timer = setTimeout(() => {
|
|
37
|
+
this.pending.delete(request.id);
|
|
38
|
+
reject(new Error(`BroadcastTransport: Request ${request.id} timed out after ${this.timeoutMs}ms`));
|
|
39
|
+
}, this.timeoutMs);
|
|
40
|
+
this.pending.set(request.id, { resolve, reject, timer });
|
|
41
|
+
this.channel.postMessage(request);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
subscribe(handler) {
|
|
45
|
+
this.eventHandlers.add(handler);
|
|
46
|
+
return () => { this.eventHandlers.delete(handler); };
|
|
47
|
+
}
|
|
48
|
+
close() {
|
|
49
|
+
const closeError = new Error('BroadcastTransport: Transport closed');
|
|
50
|
+
for (const entry of this.pending.values()) {
|
|
51
|
+
clearTimeout(entry.timer);
|
|
52
|
+
entry.reject(closeError);
|
|
53
|
+
}
|
|
54
|
+
this.pending.clear();
|
|
55
|
+
this.eventHandlers.clear();
|
|
56
|
+
this.channel.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=broadcast.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broadcast.js","sourceRoot":"","sources":["../../src/transport/broadcast.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessagePortTransport — connects to a BimHost via a MessagePort.
|
|
3
|
+
*
|
|
4
|
+
* Useful for iframe ↔ parent or worker ↔ main thread communication.
|
|
5
|
+
* Uses structured clone for data transfer (supports ArrayBuffer, Blob).
|
|
6
|
+
*/
|
|
7
|
+
import type { SdkRequest, SdkResponse, SdkEvent, Transport } from '../types.js';
|
|
8
|
+
export declare class MessagePortTransport implements Transport {
|
|
9
|
+
private port;
|
|
10
|
+
private pending;
|
|
11
|
+
private eventHandlers;
|
|
12
|
+
private timeoutMs;
|
|
13
|
+
constructor(port: MessagePort, options?: {
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
});
|
|
16
|
+
send(request: SdkRequest): Promise<SdkResponse>;
|
|
17
|
+
subscribe(handler: (event: SdkEvent) => void): () => void;
|
|
18
|
+
close(): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=message-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-port.d.ts","sourceRoot":"","sources":["../../src/transport/message-port.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhF,qBAAa,oBAAqB,YAAW,SAAS;IASxC,OAAO,CAAC,IAAI;IARxB,OAAO,CAAC,OAAO,CAIV;IACL,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAS;gBAEN,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IA0BjE,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAYrD,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD,KAAK,IAAI,IAAI;CAUd"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export class MessagePortTransport {
|
|
5
|
+
port;
|
|
6
|
+
pending = new Map();
|
|
7
|
+
eventHandlers = new Set();
|
|
8
|
+
timeoutMs;
|
|
9
|
+
constructor(port, options) {
|
|
10
|
+
this.port = port;
|
|
11
|
+
this.timeoutMs = options?.timeoutMs ?? 30_000;
|
|
12
|
+
this.port.onmessage = (event) => {
|
|
13
|
+
const data = event.data;
|
|
14
|
+
if (data && typeof data === 'object' && 'id' in data && ('result' in data || 'error' in data)) {
|
|
15
|
+
const response = data;
|
|
16
|
+
const entry = this.pending.get(response.id);
|
|
17
|
+
if (entry) {
|
|
18
|
+
clearTimeout(entry.timer);
|
|
19
|
+
this.pending.delete(response.id);
|
|
20
|
+
entry.resolve(response);
|
|
21
|
+
}
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (data && typeof data === 'object' && 'type' in data && 'data' in data) {
|
|
25
|
+
const sdkEvent = data;
|
|
26
|
+
for (const handler of this.eventHandlers) {
|
|
27
|
+
handler(sdkEvent);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
async send(request) {
|
|
33
|
+
return new Promise((resolve, reject) => {
|
|
34
|
+
const timer = setTimeout(() => {
|
|
35
|
+
this.pending.delete(request.id);
|
|
36
|
+
reject(new Error(`MessagePortTransport: Request ${request.id} timed out after ${this.timeoutMs}ms`));
|
|
37
|
+
}, this.timeoutMs);
|
|
38
|
+
this.pending.set(request.id, { resolve, reject, timer });
|
|
39
|
+
this.port.postMessage(request);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
subscribe(handler) {
|
|
43
|
+
this.eventHandlers.add(handler);
|
|
44
|
+
return () => { this.eventHandlers.delete(handler); };
|
|
45
|
+
}
|
|
46
|
+
close() {
|
|
47
|
+
const closeError = new Error('MessagePortTransport: Transport closed');
|
|
48
|
+
for (const entry of this.pending.values()) {
|
|
49
|
+
clearTimeout(entry.timer);
|
|
50
|
+
entry.reject(closeError);
|
|
51
|
+
}
|
|
52
|
+
this.pending.clear();
|
|
53
|
+
this.eventHandlers.clear();
|
|
54
|
+
this.port.close();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=message-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-port.js","sourceRoot":"","sources":["../../src/transport/message-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RemoteBackend — implements BimBackend by proxying all calls over a Transport.
|
|
3
|
+
*
|
|
4
|
+
* Used when the SDK is in a different context than the viewer (cross-tab, iframe, etc).
|
|
5
|
+
* Each typed namespace is a Proxy that throws synchronously, since the remote transport
|
|
6
|
+
* requires async implementation (future iteration).
|
|
7
|
+
*/
|
|
8
|
+
import type { BimBackend, Transport, BimEventType, ModelBackendMethods, QueryBackendMethods, SelectionBackendMethods, VisibilityBackendMethods, ViewerBackendMethods, MutateBackendMethods, SpatialBackendMethods, ExportBackendMethods, LensBackendMethods } from '../types.js';
|
|
9
|
+
export declare class RemoteBackend implements BimBackend {
|
|
10
|
+
private transport;
|
|
11
|
+
readonly model: ModelBackendMethods;
|
|
12
|
+
readonly query: QueryBackendMethods;
|
|
13
|
+
readonly selection: SelectionBackendMethods;
|
|
14
|
+
readonly visibility: VisibilityBackendMethods;
|
|
15
|
+
readonly viewer: ViewerBackendMethods;
|
|
16
|
+
readonly mutate: MutateBackendMethods;
|
|
17
|
+
readonly spatial: SpatialBackendMethods;
|
|
18
|
+
readonly export: ExportBackendMethods;
|
|
19
|
+
readonly lens: LensBackendMethods;
|
|
20
|
+
constructor(transport: Transport);
|
|
21
|
+
subscribe(event: BimEventType, handler: (data: unknown) => void): () => void;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=remote-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-backend.d.ts","sourceRoot":"","sources":["../../src/transport/remote-backend.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAerB,qBAAa,aAAc,YAAW,UAAU;IAWlC,OAAO,CAAC,SAAS;IAV7B,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAA4B;IAC/D,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAA4B;IAC/D,QAAQ,CAAC,SAAS,EAAE,uBAAuB,CAAgC;IAC3E,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAiC;IAC9E,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAA6B;IAClE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAA6B;IAClE,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAA8B;IACrE,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAA6B;IAClE,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAA2B;gBAExC,SAAS,EAAE,SAAS;IAExC,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI;CAO7E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
function makeRemoteProxy(namespace) {
|
|
5
|
+
return new Proxy(Object.create(null), {
|
|
6
|
+
get(_, method) {
|
|
7
|
+
return (..._args) => {
|
|
8
|
+
throw new Error(`RemoteBackend: Cannot call ${namespace}.${method}() synchronously. ` +
|
|
9
|
+
`Remote transport requires async implementation.`);
|
|
10
|
+
};
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export class RemoteBackend {
|
|
15
|
+
transport;
|
|
16
|
+
model = makeRemoteProxy('model');
|
|
17
|
+
query = makeRemoteProxy('query');
|
|
18
|
+
selection = makeRemoteProxy('selection');
|
|
19
|
+
visibility = makeRemoteProxy('visibility');
|
|
20
|
+
viewer = makeRemoteProxy('viewer');
|
|
21
|
+
mutate = makeRemoteProxy('mutate');
|
|
22
|
+
spatial = makeRemoteProxy('spatial');
|
|
23
|
+
export = makeRemoteProxy('export');
|
|
24
|
+
lens = makeRemoteProxy('lens');
|
|
25
|
+
constructor(transport) {
|
|
26
|
+
this.transport = transport;
|
|
27
|
+
}
|
|
28
|
+
subscribe(event, handler) {
|
|
29
|
+
return this.transport.subscribe((sdkEvent) => {
|
|
30
|
+
if (sdkEvent.type === event) {
|
|
31
|
+
handler(sdkEvent.data);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=remote-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-backend.js","sourceRoot":"","sources":["../../src/transport/remote-backend.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAyB/D,SAAS,eAAe,CAAmB,SAAiB;IAC1D,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAM,EAAE;QACzC,GAAG,CAAC,CAAC,EAAE,MAAc;YACnB,OAAO,CAAC,GAAG,KAAgB,EAAS,EAAE;gBACpC,MAAM,IAAI,KAAK,CACb,8BAA8B,SAAS,IAAI,MAAM,oBAAoB;oBACrE,iDAAiD,CAClD,CAAC;YACJ,CAAC,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,aAAa;IAWJ;IAVX,KAAK,GAAwB,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,KAAK,GAAwB,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,SAAS,GAA4B,eAAe,CAAC,WAAW,CAAC,CAAC;IAClE,UAAU,GAA6B,eAAe,CAAC,YAAY,CAAC,CAAC;IACrE,MAAM,GAAyB,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzD,MAAM,GAAyB,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzD,OAAO,GAA0B,eAAe,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,GAAyB,eAAe,CAAC,QAAQ,CAAC,CAAC;IACzD,IAAI,GAAuB,eAAe,CAAC,MAAM,CAAC,CAAC;IAE5D,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,SAAS,CAAC,KAAmB,EAAE,OAAgC;QAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC3C,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transport layer types — how SDK commands cross context boundaries.
|
|
3
|
+
*
|
|
4
|
+
* LocalTransport: direct function calls (zero overhead)
|
|
5
|
+
* BroadcastTransport: BroadcastChannel API (cross-tab)
|
|
6
|
+
* MessagePortTransport: MessagePort (iframe / worker)
|
|
7
|
+
* WebSocketTransport: WebSocket (cross-process, Tauri, server)
|
|
8
|
+
*/
|
|
9
|
+
export type { SdkRequest, SdkResponse, SdkEvent, Transport } from '../types.js';
|
|
10
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAGH,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core types for @ifc-lite/sdk
|
|
3
|
+
*
|
|
4
|
+
* These types define the public API surface of the SDK.
|
|
5
|
+
* External tools (ifc-scripts, ifc-flow) depend on these types.
|
|
6
|
+
*/
|
|
7
|
+
/** Reference to a specific entity within a federated model set */
|
|
8
|
+
export interface EntityRef {
|
|
9
|
+
modelId: string;
|
|
10
|
+
expressId: number;
|
|
11
|
+
}
|
|
12
|
+
/** Serialized entity ref for transport (e.g., "arch:42") */
|
|
13
|
+
export type EntityRefString = string;
|
|
14
|
+
export declare function entityRefToString(ref: EntityRef): EntityRefString;
|
|
15
|
+
export declare function stringToEntityRef(s: EntityRefString): EntityRef;
|
|
16
|
+
export type SchemaVersion = 'IFC2X3' | 'IFC4' | 'IFC4X3' | 'IFC5';
|
|
17
|
+
export interface ModelInfo {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
schemaVersion: SchemaVersion;
|
|
21
|
+
entityCount: number;
|
|
22
|
+
fileSize: number;
|
|
23
|
+
loadedAt: number;
|
|
24
|
+
}
|
|
25
|
+
export interface EntityData {
|
|
26
|
+
ref: EntityRef;
|
|
27
|
+
globalId: string;
|
|
28
|
+
name: string;
|
|
29
|
+
type: string;
|
|
30
|
+
description: string;
|
|
31
|
+
objectType: string;
|
|
32
|
+
}
|
|
33
|
+
export interface PropertySetData {
|
|
34
|
+
name: string;
|
|
35
|
+
globalId?: string;
|
|
36
|
+
properties: PropertyData[];
|
|
37
|
+
}
|
|
38
|
+
export interface PropertyData {
|
|
39
|
+
name: string;
|
|
40
|
+
type: number;
|
|
41
|
+
value: string | number | boolean | null;
|
|
42
|
+
}
|
|
43
|
+
export interface QuantitySetData {
|
|
44
|
+
name: string;
|
|
45
|
+
quantities: QuantityData[];
|
|
46
|
+
}
|
|
47
|
+
export interface QuantityData {
|
|
48
|
+
name: string;
|
|
49
|
+
type: number;
|
|
50
|
+
value: number;
|
|
51
|
+
}
|
|
52
|
+
export type ComparisonOp = '=' | '!=' | '>' | '<' | '>=' | '<=' | 'contains' | 'exists';
|
|
53
|
+
export interface QueryFilter {
|
|
54
|
+
psetName: string;
|
|
55
|
+
propName: string;
|
|
56
|
+
operator: ComparisonOp;
|
|
57
|
+
value?: string | number | boolean;
|
|
58
|
+
}
|
|
59
|
+
export interface QueryDescriptor {
|
|
60
|
+
modelId?: string;
|
|
61
|
+
types?: string[];
|
|
62
|
+
filters?: QueryFilter[];
|
|
63
|
+
limit?: number;
|
|
64
|
+
offset?: number;
|
|
65
|
+
}
|
|
66
|
+
export type ProjectionMode = 'perspective' | 'orthographic';
|
|
67
|
+
export interface CameraState {
|
|
68
|
+
mode: ProjectionMode;
|
|
69
|
+
position?: [number, number, number];
|
|
70
|
+
target?: [number, number, number];
|
|
71
|
+
up?: [number, number, number];
|
|
72
|
+
}
|
|
73
|
+
export interface SectionPlane {
|
|
74
|
+
axis: 'x' | 'y' | 'z';
|
|
75
|
+
position: number;
|
|
76
|
+
enabled: boolean;
|
|
77
|
+
flipped: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface AABB {
|
|
80
|
+
min: [number, number, number];
|
|
81
|
+
max: [number, number, number];
|
|
82
|
+
}
|
|
83
|
+
export interface SpatialPlane {
|
|
84
|
+
normal: [number, number, number];
|
|
85
|
+
distance: number;
|
|
86
|
+
}
|
|
87
|
+
export interface SpatialFrustum {
|
|
88
|
+
planes: SpatialPlane[];
|
|
89
|
+
}
|
|
90
|
+
import type { Lens, LensRule, LensCriteria, RGBAColor } from '@ifc-lite/lens';
|
|
91
|
+
export type { Lens, LensRule, LensCriteria, RGBAColor };
|
|
92
|
+
export interface MutationRecord {
|
|
93
|
+
entityRef: EntityRef;
|
|
94
|
+
psetName: string;
|
|
95
|
+
propName: string;
|
|
96
|
+
oldValue: string | number | boolean | null;
|
|
97
|
+
newValue: string | number | boolean | null;
|
|
98
|
+
timestamp: number;
|
|
99
|
+
}
|
|
100
|
+
export type BimEventType = 'selection:changed' | 'visibility:changed' | 'model:loaded' | 'model:removed' | 'mutation:changed' | 'lens:changed';
|
|
101
|
+
export type BimEventData = {
|
|
102
|
+
'selection:changed': {
|
|
103
|
+
refs: EntityRef[];
|
|
104
|
+
};
|
|
105
|
+
'visibility:changed': Record<string, never>;
|
|
106
|
+
'model:loaded': {
|
|
107
|
+
model: ModelInfo;
|
|
108
|
+
};
|
|
109
|
+
'model:removed': {
|
|
110
|
+
modelId: string;
|
|
111
|
+
};
|
|
112
|
+
'mutation:changed': {
|
|
113
|
+
modelId: string;
|
|
114
|
+
count: number;
|
|
115
|
+
};
|
|
116
|
+
'lens:changed': {
|
|
117
|
+
lensId: string | null;
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
export type BimEventHandler<T extends BimEventType> = (data: BimEventData[T]) => void;
|
|
121
|
+
export interface SdkRequest {
|
|
122
|
+
id: string;
|
|
123
|
+
namespace: string;
|
|
124
|
+
method: string;
|
|
125
|
+
args: unknown[];
|
|
126
|
+
}
|
|
127
|
+
export interface SdkResponse {
|
|
128
|
+
id: string;
|
|
129
|
+
result?: unknown;
|
|
130
|
+
error?: {
|
|
131
|
+
message: string;
|
|
132
|
+
stack?: string;
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export interface SdkEvent {
|
|
136
|
+
type: BimEventType;
|
|
137
|
+
data: unknown;
|
|
138
|
+
}
|
|
139
|
+
export interface ModelBackendMethods {
|
|
140
|
+
list(): ModelInfo[];
|
|
141
|
+
activeId(): string | null;
|
|
142
|
+
}
|
|
143
|
+
export interface QueryBackendMethods {
|
|
144
|
+
entities(descriptor: QueryDescriptor): EntityData[];
|
|
145
|
+
entityData(ref: EntityRef): EntityData | null;
|
|
146
|
+
properties(ref: EntityRef): PropertySetData[];
|
|
147
|
+
quantities(ref: EntityRef): QuantitySetData[];
|
|
148
|
+
related(ref: EntityRef, relType: string, direction: 'forward' | 'inverse'): EntityRef[];
|
|
149
|
+
}
|
|
150
|
+
export interface SelectionBackendMethods {
|
|
151
|
+
get(): EntityRef[];
|
|
152
|
+
set(refs: EntityRef[]): void;
|
|
153
|
+
}
|
|
154
|
+
export interface VisibilityBackendMethods {
|
|
155
|
+
hide(refs: EntityRef[]): void;
|
|
156
|
+
show(refs: EntityRef[]): void;
|
|
157
|
+
isolate(refs: EntityRef[]): void;
|
|
158
|
+
reset(): void;
|
|
159
|
+
}
|
|
160
|
+
export interface ViewerBackendMethods {
|
|
161
|
+
colorize(refs: EntityRef[], color: RGBAColor): void;
|
|
162
|
+
colorizeAll(batches: Array<{
|
|
163
|
+
refs: EntityRef[];
|
|
164
|
+
color: RGBAColor;
|
|
165
|
+
}>): void;
|
|
166
|
+
resetColors(refs?: EntityRef[]): void;
|
|
167
|
+
flyTo(refs: EntityRef[]): void;
|
|
168
|
+
setSection(section: SectionPlane | null): void;
|
|
169
|
+
getSection(): SectionPlane | null;
|
|
170
|
+
setCamera(state: Partial<CameraState>): void;
|
|
171
|
+
getCamera(): CameraState;
|
|
172
|
+
}
|
|
173
|
+
export interface MutateBackendMethods {
|
|
174
|
+
setProperty(ref: EntityRef, psetName: string, propName: string, value: string | number | boolean): void;
|
|
175
|
+
deleteProperty(ref: EntityRef, psetName: string, propName: string): void;
|
|
176
|
+
batchBegin(label: string): void;
|
|
177
|
+
batchEnd(label: string): void;
|
|
178
|
+
undo(modelId: string): boolean;
|
|
179
|
+
redo(modelId: string): boolean;
|
|
180
|
+
}
|
|
181
|
+
export interface SpatialBackendMethods {
|
|
182
|
+
queryBounds(modelId: string, bounds: AABB): EntityRef[];
|
|
183
|
+
raycast(modelId: string, origin: [number, number, number], direction: [number, number, number]): EntityRef[];
|
|
184
|
+
queryFrustum(modelId: string, frustum: SpatialFrustum): EntityRef[];
|
|
185
|
+
}
|
|
186
|
+
export interface ExportBackendMethods {
|
|
187
|
+
csv(refs: unknown, options: unknown): string;
|
|
188
|
+
json(refs: unknown, columns: unknown): Record<string, unknown>[];
|
|
189
|
+
download(content: string, filename: string, mimeType: string): void;
|
|
190
|
+
}
|
|
191
|
+
export interface LensBackendMethods {
|
|
192
|
+
presets(): unknown[];
|
|
193
|
+
create(config: unknown): unknown;
|
|
194
|
+
activate(lensId: string): void;
|
|
195
|
+
deactivate(): void;
|
|
196
|
+
getActive(): string | null;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Abstraction over the viewer's internal state — SDK namespaces use this.
|
|
200
|
+
*
|
|
201
|
+
* Each namespace is a typed property with methods matching the adapter contract.
|
|
202
|
+
* SDK namespace classes call backend.query.entities(...) instead of dispatch().
|
|
203
|
+
*
|
|
204
|
+
* BimHost (wire protocol) uses dispatchToBackend() to route string-based
|
|
205
|
+
* SdkRequests to the typed namespace methods.
|
|
206
|
+
*/
|
|
207
|
+
export interface BimBackend {
|
|
208
|
+
readonly model: ModelBackendMethods;
|
|
209
|
+
readonly query: QueryBackendMethods;
|
|
210
|
+
readonly selection: SelectionBackendMethods;
|
|
211
|
+
readonly visibility: VisibilityBackendMethods;
|
|
212
|
+
readonly viewer: ViewerBackendMethods;
|
|
213
|
+
readonly mutate: MutateBackendMethods;
|
|
214
|
+
readonly spatial: SpatialBackendMethods;
|
|
215
|
+
readonly export: ExportBackendMethods;
|
|
216
|
+
readonly lens: LensBackendMethods;
|
|
217
|
+
/** Subscribe to viewer events */
|
|
218
|
+
subscribe(event: BimEventType, handler: (data: unknown) => void): () => void;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Route a string-based SdkRequest to the appropriate typed method on a BimBackend.
|
|
222
|
+
* Used by BimHost for wire protocol compatibility.
|
|
223
|
+
*/
|
|
224
|
+
export declare function dispatchToBackend(backend: BimBackend, namespace: string, method: string, args: unknown[]): unknown;
|
|
225
|
+
export interface BimContextOptions {
|
|
226
|
+
/** Direct backend for local (embedded) mode */
|
|
227
|
+
backend?: BimBackend;
|
|
228
|
+
/** Transport for remote (connected) mode */
|
|
229
|
+
transport?: Transport;
|
|
230
|
+
}
|
|
231
|
+
export interface Transport {
|
|
232
|
+
send(request: SdkRequest): Promise<SdkResponse>;
|
|
233
|
+
subscribe(handler: (event: SdkEvent) => void): () => void;
|
|
234
|
+
close(): void;
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|