@ifc-lite/flow-nodes 0.2.0 → 0.5.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.
Files changed (107) hide show
  1. package/README.md +1 -0
  2. package/dist/apply-table-node.d.ts.map +1 -1
  3. package/dist/apply-table-node.js +7 -6
  4. package/dist/apply-table-node.js.map +1 -1
  5. package/dist/aps-client.d.ts +55 -0
  6. package/dist/aps-client.d.ts.map +1 -0
  7. package/dist/aps-client.js +194 -0
  8. package/dist/aps-client.js.map +1 -0
  9. package/dist/aps-nodes.d.ts +3 -0
  10. package/dist/aps-nodes.d.ts.map +1 -0
  11. package/dist/aps-nodes.js +192 -0
  12. package/dist/aps-nodes.js.map +1 -0
  13. package/dist/aps-table.d.ts +24 -0
  14. package/dist/aps-table.d.ts.map +1 -0
  15. package/dist/aps-table.js +123 -0
  16. package/dist/aps-table.js.map +1 -0
  17. package/dist/base64.d.ts +8 -0
  18. package/dist/base64.d.ts.map +1 -0
  19. package/dist/base64.js +59 -0
  20. package/dist/base64.js.map +1 -0
  21. package/dist/bcf-client.d.ts +36 -0
  22. package/dist/bcf-client.d.ts.map +1 -0
  23. package/dist/bcf-client.js +108 -0
  24. package/dist/bcf-client.js.map +1 -0
  25. package/dist/bcf-nodes.d.ts +3 -0
  26. package/dist/bcf-nodes.d.ts.map +1 -0
  27. package/dist/bcf-nodes.js +181 -0
  28. package/dist/bcf-nodes.js.map +1 -0
  29. package/dist/csv-nodes.d.ts.map +1 -1
  30. package/dist/csv-nodes.js +3 -4
  31. package/dist/csv-nodes.js.map +1 -1
  32. package/dist/documents-fetch.d.ts +23 -0
  33. package/dist/documents-fetch.d.ts.map +1 -0
  34. package/dist/documents-fetch.js +48 -0
  35. package/dist/documents-fetch.js.map +1 -0
  36. package/dist/documents-nodes.d.ts +5 -0
  37. package/dist/documents-nodes.d.ts.map +1 -0
  38. package/dist/documents-nodes.js +167 -0
  39. package/dist/documents-nodes.js.map +1 -0
  40. package/dist/host.d.ts +28 -0
  41. package/dist/host.d.ts.map +1 -1
  42. package/dist/host.js.map +1 -1
  43. package/dist/http-request-node.d.ts +9 -0
  44. package/dist/http-request-node.d.ts.map +1 -0
  45. package/dist/http-request-node.js +109 -0
  46. package/dist/http-request-node.js.map +1 -0
  47. package/dist/index.d.ts +20 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +34 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist/model-nodes.d.ts.map +1 -1
  52. package/dist/model-nodes.js +11 -6
  53. package/dist/model-nodes.js.map +1 -1
  54. package/dist/open-model-node.d.ts +3 -0
  55. package/dist/open-model-node.d.ts.map +1 -0
  56. package/dist/open-model-node.js +47 -0
  57. package/dist/open-model-node.js.map +1 -0
  58. package/dist/script-node.d.ts.map +1 -1
  59. package/dist/script-node.js +55 -21
  60. package/dist/script-node.js.map +1 -1
  61. package/dist/secrets.d.ts +88 -0
  62. package/dist/secrets.d.ts.map +1 -0
  63. package/dist/secrets.js +202 -0
  64. package/dist/secrets.js.map +1 -0
  65. package/dist/speckle/client.d.ts +52 -0
  66. package/dist/speckle/client.d.ts.map +1 -0
  67. package/dist/speckle/client.js +153 -0
  68. package/dist/speckle/client.js.map +1 -0
  69. package/dist/speckle/geometry.d.ts +37 -0
  70. package/dist/speckle/geometry.d.ts.map +1 -0
  71. package/dist/speckle/geometry.js +126 -0
  72. package/dist/speckle/geometry.js.map +1 -0
  73. package/dist/speckle/mapping.d.ts +62 -0
  74. package/dist/speckle/mapping.d.ts.map +1 -0
  75. package/dist/speckle/mapping.js +208 -0
  76. package/dist/speckle/mapping.js.map +1 -0
  77. package/dist/speckle/parameters.d.ts +49 -0
  78. package/dist/speckle/parameters.d.ts.map +1 -0
  79. package/dist/speckle/parameters.js +95 -0
  80. package/dist/speckle/parameters.js.map +1 -0
  81. package/dist/speckle/refusals.d.ts +45 -0
  82. package/dist/speckle/refusals.d.ts.map +1 -0
  83. package/dist/speckle/refusals.js +40 -0
  84. package/dist/speckle/refusals.js.map +1 -0
  85. package/dist/speckle/units.d.ts +13 -0
  86. package/dist/speckle/units.d.ts.map +1 -0
  87. package/dist/speckle/units.js +59 -0
  88. package/dist/speckle/units.js.map +1 -0
  89. package/dist/speckle/url.d.ts +35 -0
  90. package/dist/speckle/url.d.ts.map +1 -0
  91. package/dist/speckle/url.js +48 -0
  92. package/dist/speckle/url.js.map +1 -0
  93. package/dist/speckle-receive-node.d.ts +9 -0
  94. package/dist/speckle-receive-node.d.ts.map +1 -0
  95. package/dist/speckle-receive-node.js +180 -0
  96. package/dist/speckle-receive-node.js.map +1 -0
  97. package/dist/xlsx-io.d.ts.map +1 -1
  98. package/dist/xlsx-io.js +3 -3
  99. package/dist/xlsx-io.js.map +1 -1
  100. package/dist/xlsx-nodes.d.ts.map +1 -1
  101. package/dist/xlsx-nodes.js +1 -40
  102. package/dist/xlsx-nodes.js.map +1 -1
  103. package/package.json +11 -9
  104. package/dist/strict-cell.d.ts +0 -20
  105. package/dist/strict-cell.d.ts.map +0 -1
  106. package/dist/strict-cell.js +0 -33
  107. package/dist/strict-cell.js.map +0 -1
@@ -0,0 +1,202 @@
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
+ /**
5
+ * Secrets from the host environment (#5167 phase 3.5).
6
+ *
7
+ * A node param references a secret with `{{secret:NAME}}` inside a
8
+ * string value (or a string nested inside a `json`-kind param, e.g. a
9
+ * header map). The grammar itself is recognised by `@ifc-lite/flow`'s
10
+ * `referencedSecrets` (availability needs it too); this module is the one
11
+ * place declared-vs-referenced is cross-checked and `process.env` is read —
12
+ * shared by `packages/cli/src/commands/flow.ts` (`flow run`) and
13
+ * `packages/mcp/src/tools/flow.ts` (`run_flow`), the only two callers
14
+ * allowed to read `process.env` for a flow graph. The viewer never calls
15
+ * this module: `HostFeatures.secrets` is always the empty set there, so
16
+ * a graph referencing a secret shows `unavailable` before it runs (see
17
+ * `availability.ts`), not this module's validation error.
18
+ *
19
+ * Two checks run BEFORE any node executes:
20
+ * 1. every `{{secret:NAME}}` reference must be covered by a declared
21
+ * `secret.read:NAME` capability in the graph — an undeclared
22
+ * reference is a validation error, not a silently-empty string;
23
+ * 2. every declared-and-referenced secret must actually be set in the
24
+ * environment — a referenced-but-unset secret is also a validation
25
+ * error, not an empty string interpolated into a request.
26
+ *
27
+ * Redaction (`buildRedactionMap` / `redactDeep`) is a separate, later
28
+ * step the caller applies at the OUTER boundary — right before writing
29
+ * to stdout, an MCP response, or a log sink — so a secret value that
30
+ * reaches a remote response body (a server echoing back an Authorization
31
+ * header) and comes back into the run's own output is still caught, not
32
+ * just the point where `{{secret:NAME}}` was first substituted. See the
33
+ * module doc trade-offs below on the minimum-length cutoff.
34
+ */
35
+ import { referencedSecrets, replaceSecretRefs } from '@ifc-lite/flow';
36
+ export { referencedSecrets };
37
+ import { parseCapabilities } from '@ifc-lite/extensions';
38
+ /** Every `secret:NAME` the graph's capabilities declare (from `secret.read:<NAME>` grants). */
39
+ export function declaredSecrets(doc) {
40
+ const parsed = parseCapabilities(doc.capabilities);
41
+ const names = new Set();
42
+ if (!parsed.ok)
43
+ return names;
44
+ for (const cap of parsed.value) {
45
+ if (cap.scope === 'secret' && cap.action === 'read' && cap.target?.segments.length === 1) {
46
+ const seg = cap.target.segments[0];
47
+ if (seg.kind === 'literal')
48
+ names.add(seg.value);
49
+ }
50
+ }
51
+ return names;
52
+ }
53
+ /**
54
+ * Validate every `{{secret:NAME}}` reference against the graph's declared
55
+ * capabilities AND the environment, before any node runs. Returns an empty
56
+ * array when the graph is clean (including "no secrets used at all").
57
+ */
58
+ export function validateSecretReferences(doc, env) {
59
+ const declared = declaredSecrets(doc);
60
+ const errors = [];
61
+ for (const ref of referencedSecrets(doc)) {
62
+ if (!declared.has(ref.name)) {
63
+ errors.push({
64
+ nodeId: ref.nodeId,
65
+ param: ref.param,
66
+ name: ref.name,
67
+ reason: 'undeclared',
68
+ message: `node "${ref.nodeId}" param "${ref.param}" references {{secret:${ref.name}}}, but the graph does not declare "secret.read:${ref.name}"`,
69
+ });
70
+ continue;
71
+ }
72
+ if (env[ref.name] === undefined) {
73
+ errors.push({
74
+ nodeId: ref.nodeId,
75
+ param: ref.param,
76
+ name: ref.name,
77
+ reason: 'unset',
78
+ message: `node "${ref.nodeId}" param "${ref.param}" references {{secret:${ref.name}}}, which is declared but not set in the environment`,
79
+ });
80
+ }
81
+ }
82
+ return errors;
83
+ }
84
+ /** Resolve every declared-and-referenced secret's value from `env`. Call only after `validateSecretReferences` returns no errors. */
85
+ export function resolveSecretValues(doc, env) {
86
+ const values = new Map();
87
+ for (const ref of referencedSecrets(doc)) {
88
+ const v = env[ref.name];
89
+ if (v === undefined)
90
+ continue;
91
+ // Redaction is a substring scrub, and a very short value cannot be
92
+ // scrubbed without mangling ordinary output — so rather than resolve a
93
+ // secret that would then travel unredacted, refuse it. The message names
94
+ // the variable, never the value.
95
+ if (v.length < MIN_REDACTED_SECRET_LENGTH) {
96
+ throw new Error(`secret ${ref.name} is shorter than ${MIN_REDACTED_SECRET_LENGTH} characters, so it could not be `
97
+ + 'redacted from run output; refusing to use it');
98
+ }
99
+ values.set(ref.name, v);
100
+ }
101
+ return values;
102
+ }
103
+ function substitute(value, values) {
104
+ if (typeof value === 'string') {
105
+ return replaceSecretRefs(value, (name, whole) => values.get(name) ?? whole);
106
+ }
107
+ if (Array.isArray(value))
108
+ return value.map((v) => substitute(v, values));
109
+ if (value && typeof value === 'object') {
110
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, substitute(v, values)]));
111
+ }
112
+ return value;
113
+ }
114
+ /** Return a new document with every `{{secret:NAME}}` reference in node params replaced by its resolved value. The input document is never mutated. */
115
+ export function interpolateSecrets(doc, values) {
116
+ if (values.size === 0)
117
+ return doc;
118
+ const nodes = doc.nodes.map((node) => {
119
+ if (!node.params)
120
+ return node;
121
+ const params = Object.fromEntries(Object.entries(node.params).map(([k, v]) => [k, substitute(v, values)]));
122
+ return { ...node, params };
123
+ });
124
+ return { ...doc, nodes };
125
+ }
126
+ /** Minimum secret length worth redacting (see module doc): shorter values risk mass-redacting incidental substrings of ordinary text. */
127
+ export const MIN_REDACTED_SECRET_LENGTH = 6;
128
+ /**
129
+ * Reverse map (value → marker) for every resolved secret at least
130
+ * `MIN_REDACTED_SECRET_LENGTH` characters long. A secret shorter than
131
+ * that is a real gap (documented, not silently accepted): a 4-character
132
+ * token could coincide with ordinary text often enough that scrubbing it
133
+ * everywhere would make legitimate output unreadable, so this module
134
+ * accepts that a very short secret is not redactable by substring match
135
+ * at all.
136
+ */
137
+ export function buildRedactionMap(values) {
138
+ // Secrets sharing one value share one marker naming all of them, rather
139
+ // than the last silently taking the value over (#5446 review).
140
+ const names = new Map();
141
+ for (const [name, value] of values) {
142
+ if (value.length < MIN_REDACTED_SECRET_LENGTH)
143
+ continue;
144
+ names.set(value, [...(names.get(value) ?? []), name]);
145
+ }
146
+ // Longest value first, so a secret containing another is matched whole.
147
+ const ordered = [...names].sort(([a], [b]) => b.length - a.length);
148
+ return new Map(ordered.map(([value, owners]) => [value, `<secret:${[...owners].sort().join('|')}>`]));
149
+ }
150
+ function escapeRegExp(text) {
151
+ return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
152
+ }
153
+ /**
154
+ * Replace every occurrence of a redacted secret value with its marker, in ONE
155
+ * pass, trying the longest value first at each position. Sequential
156
+ * replacement let a shorter secret inside a longer one match first
157
+ * (`abcdef` inside `abcdefghi` left `<secret:A>ghi`, exposing B's suffix),
158
+ * and could match inside a marker already written (#5446 review).
159
+ */
160
+ export function redactText(text, redaction) {
161
+ if (redaction.size === 0)
162
+ return text;
163
+ const values = [...redaction.keys()].sort((a, b) => b.length - a.length);
164
+ const pattern = new RegExp(values.map(escapeRegExp).join('|'), 'g');
165
+ return text.replace(pattern, (match) => redaction.get(match) ?? match);
166
+ }
167
+ /**
168
+ * Walk an arbitrary JSON-ish value (a run summary, a log entry, a thrown
169
+ * error's message) and redact every string found, at any depth — this is
170
+ * what catches a secret that travelled through a response body and back
171
+ * into the run's own output, not just the literal param it was
172
+ * interpolated into.
173
+ */
174
+ /**
175
+ * The env names a host may report as available secrets: set, and long
176
+ * enough to be redacted. `resolveSecretValues` refuses a shorter value, so
177
+ * counting it as available made `flow validate` pass a graph the run then
178
+ * refused (#5446 review).
179
+ */
180
+ export function usableSecretNames(env) {
181
+ return Object.entries(env)
182
+ .filter(([, value]) => typeof value === 'string' && value.length >= MIN_REDACTED_SECRET_LENGTH)
183
+ .map(([name]) => name);
184
+ }
185
+ export function redactDeep(value, redaction) {
186
+ if (redaction.size === 0)
187
+ return value;
188
+ if (typeof value === 'string')
189
+ return redactText(value, redaction);
190
+ if (Array.isArray(value))
191
+ return value.map((v) => redactDeep(v, redaction));
192
+ // Keys too: a script can return an object keyed by a secret, and
193
+ // `core.groupBy` can group by one (#5446 review).
194
+ if (value instanceof Map) {
195
+ return new Map([...value.entries()].map(([k, v]) => [redactDeep(k, redaction), redactDeep(v, redaction)]));
196
+ }
197
+ if (value && typeof value === 'object') {
198
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [redactText(k, redaction), redactDeep(v, redaction)]));
199
+ }
200
+ return value;
201
+ }
202
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * The Speckle wire protocol, spoken ONLY through `coreNetworkRequest` (the
3
+ * gated, https-only, exact-host-grant request function every flow node
4
+ * uses). Nothing here calls `fetch`: the transport comes from the host, and
5
+ * the grant check runs before any byte moves.
6
+ *
7
+ * Three requests, the same three Speckle's own object loader makes:
8
+ *
9
+ * POST /graphql version → `referencedObject` (root object id)
10
+ * GET /objects/<project>/<object>/single the root object alone
11
+ * POST /api/getobjects/<project> a batch of objects by id, one `id\tjson` per line
12
+ *
13
+ * The walk is lazy and iterative: a round fetches only the ids the previous
14
+ * round referenced and has not yet seen, so display meshes and their data
15
+ * chunks (the bulk of any commit) are never downloaded — `speckle.receive`
16
+ * does not write them (see `mapping.ts`). A visited set stops cycles and
17
+ * revisits, and `maxObjects` bounds the total, failing loudly when reached.
18
+ */
19
+ import { type FetchTransport } from '@ifc-lite/sandbox';
20
+ import type { Capability } from '@ifc-lite/extensions';
21
+ import type { SpeckleTarget } from './url.js';
22
+ export type SpeckleObject = Readonly<Record<string, unknown>> & {
23
+ readonly id: string;
24
+ };
25
+ export interface SpeckleClientOptions {
26
+ readonly grants: readonly Capability[];
27
+ readonly transport?: FetchTransport;
28
+ /** Personal access token; sent as `Authorization: Bearer`. Empty = anonymous (public projects). */
29
+ readonly token?: string;
30
+ readonly timeoutMs: number;
31
+ /** Per-response byte cap. A response that hits it fails the receive: a truncated batch is missing objects. */
32
+ readonly maxBytes: number;
33
+ /** Upper bound on the number of objects fetched. */
34
+ readonly maxObjects: number;
35
+ readonly signal?: AbortSignal;
36
+ }
37
+ /** Keys whose values are display geometry: never followed, never fetched. */
38
+ export declare const DISPLAY_KEYS: ReadonlySet<string>;
39
+ /** The root object id a target points at, and the version it came from (if any). */
40
+ export declare function resolveRoot(opts: SpeckleClientOptions, target: SpeckleTarget): Promise<{
41
+ objectId: string;
42
+ versionId?: string;
43
+ }>;
44
+ /** Every `referencedId` in an object's own JSON tree, except under display keys. */
45
+ export declare function referencedIds(value: unknown, out?: Set<string>): Set<string>;
46
+ /**
47
+ * Fetch the root object and everything it references (display geometry
48
+ * excepted), keyed by id. Throws when an id the graph references is not
49
+ * returned by the server, or when `maxObjects` is reached.
50
+ */
51
+ export declare function fetchObjectGraph(opts: SpeckleClientOptions, target: SpeckleTarget, rootId: string): Promise<Map<string, SpeckleObject>>;
52
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/speckle/client.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAChG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,mGAAmG;IACnG,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8GAA8G;IAC9G,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B;AAED,6EAA6E;AAC7E,eAAO,MAAM,YAAY,EAAE,WAAW,CAAC,MAAM,CAA6E,CAAC;AA4C3H,oFAAoF;AACpF,wBAAsB,WAAW,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBtI;AAOD,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBvF;AA0BD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CA0B7I"}
@@ -0,0 +1,153 @@
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
+ /**
5
+ * The Speckle wire protocol, spoken ONLY through `coreNetworkRequest` (the
6
+ * gated, https-only, exact-host-grant request function every flow node
7
+ * uses). Nothing here calls `fetch`: the transport comes from the host, and
8
+ * the grant check runs before any byte moves.
9
+ *
10
+ * Three requests, the same three Speckle's own object loader makes:
11
+ *
12
+ * POST /graphql version → `referencedObject` (root object id)
13
+ * GET /objects/<project>/<object>/single the root object alone
14
+ * POST /api/getobjects/<project> a batch of objects by id, one `id\tjson` per line
15
+ *
16
+ * The walk is lazy and iterative: a round fetches only the ids the previous
17
+ * round referenced and has not yet seen, so display meshes and their data
18
+ * chunks (the bulk of any commit) are never downloaded — `speckle.receive`
19
+ * does not write them (see `mapping.ts`). A visited set stops cycles and
20
+ * revisits, and `maxObjects` bounds the total, failing loudly when reached.
21
+ */
22
+ import { coreNetworkRequest, NetworkDeniedError } from '@ifc-lite/sandbox';
23
+ /** Keys whose values are display geometry: never followed, never fetched. */
24
+ export const DISPLAY_KEYS = new Set(['displayValue', '@displayValue', 'displayMesh', '@displayMesh']);
25
+ const BATCH_SIZE = 500;
26
+ function headers(opts, extra) {
27
+ const h = { ...extra };
28
+ if (opts.token && opts.token.length > 0)
29
+ h.Authorization = `Bearer ${opts.token}`;
30
+ return h;
31
+ }
32
+ async function request(opts, url, method, extra, body) {
33
+ let res;
34
+ try {
35
+ res = await coreNetworkRequest({ url, method, headers: headers(opts, extra), body, timeoutMs: opts.timeoutMs, maxBytes: opts.maxBytes, signal: opts.signal }, opts.grants, opts.transport);
36
+ }
37
+ catch (err) {
38
+ if (err instanceof NetworkDeniedError)
39
+ throw new Error(`speckle.receive: ${err.message}`);
40
+ throw err;
41
+ }
42
+ if (res.status === 401 || res.status === 403) {
43
+ throw new Error(`speckle.receive: ${method} ${url} was refused (${res.status}); the project is private or the token lacks access`);
44
+ }
45
+ if (res.status < 200 || res.status >= 300)
46
+ throw new Error(`speckle.receive: ${method} ${url} failed with status ${res.status}`);
47
+ if (res.truncated)
48
+ throw new Error(`speckle.receive: the response from ${url} exceeded maxBytes (${opts.maxBytes}); raise maxBytes to receive this model`);
49
+ return res.body;
50
+ }
51
+ function parseJson(text, what) {
52
+ try {
53
+ return JSON.parse(text);
54
+ }
55
+ catch {
56
+ throw new Error(`speckle.receive: ${what} is not valid JSON`);
57
+ }
58
+ }
59
+ const VERSION_QUERY = 'query ($projectId: String!, $versionId: String!) { project(id: $projectId) { version(id: $versionId) { id referencedObject } } }';
60
+ const LATEST_QUERY = 'query ($projectId: String!, $modelId: String!) { project(id: $projectId) { model(id: $modelId) { versions(limit: 1) { items { id referencedObject } } } } }';
61
+ /** The root object id a target points at, and the version it came from (if any). */
62
+ export async function resolveRoot(opts, target) {
63
+ if (target.kind === 'object')
64
+ return { objectId: target.objectId };
65
+ const pinned = target.versionId !== undefined;
66
+ const body = JSON.stringify(pinned
67
+ ? { query: VERSION_QUERY, variables: { projectId: target.projectId, versionId: target.versionId } }
68
+ : { query: LATEST_QUERY, variables: { projectId: target.projectId, modelId: target.modelId } });
69
+ const text = await request(opts, `${target.server}/graphql`, 'POST', { 'Content-Type': 'application/json', Accept: 'application/json' }, body);
70
+ const res = parseJson(text, 'the GraphQL response');
71
+ if (res.errors && res.errors.length > 0) {
72
+ throw new Error(`speckle.receive: the server answered the version query with an error: ${res.errors.map((e) => e.message ?? '?').join('; ')}`);
73
+ }
74
+ const version = pinned ? res.data?.project?.version : res.data?.project?.model?.versions?.items?.[0];
75
+ if (!version) {
76
+ throw new Error(pinned ? `speckle.receive: version ${target.versionId} was not found in project ${target.projectId}` : `speckle.receive: model ${target.modelId} has no versions`);
77
+ }
78
+ if (typeof version.referencedObject !== 'string' || version.referencedObject.length === 0) {
79
+ throw new Error(`speckle.receive: version ${version.id} carries no referencedObject`);
80
+ }
81
+ return { objectId: version.referencedObject, versionId: version.id };
82
+ }
83
+ /** Every `referencedId` in an object's own JSON tree, except under display keys. */
84
+ export function referencedIds(value, out = new Set()) {
85
+ const stack = [value];
86
+ while (stack.length > 0) {
87
+ const v = stack.pop();
88
+ if (Array.isArray(v)) {
89
+ for (const x of v)
90
+ stack.push(x);
91
+ }
92
+ else if (v !== null && typeof v === 'object') {
93
+ const o = v;
94
+ if (typeof o.referencedId === 'string')
95
+ out.add(o.referencedId);
96
+ for (const [k, child] of Object.entries(o)) {
97
+ if (k === '__closure' || DISPLAY_KEYS.has(k))
98
+ continue;
99
+ if (child !== null && typeof child === 'object')
100
+ stack.push(child);
101
+ }
102
+ }
103
+ }
104
+ return out;
105
+ }
106
+ function asObject(value, what) {
107
+ if (value === null || typeof value !== 'object' || Array.isArray(value) || typeof value.id !== 'string') {
108
+ throw new Error(`speckle.receive: ${what} is not a Speckle object`);
109
+ }
110
+ return value;
111
+ }
112
+ async function fetchBatch(opts, target, ids) {
113
+ const text = await request(opts, `${target.server}/api/getobjects/${encodeURIComponent(target.projectId)}`, 'POST', { 'Content-Type': 'application/json', Accept: 'text/plain' }, JSON.stringify({ objects: JSON.stringify(ids) }));
114
+ const out = [];
115
+ for (const line of text.split('\n')) {
116
+ if (line.trim().length === 0)
117
+ continue;
118
+ const tab = line.indexOf('\t');
119
+ out.push(asObject(parseJson(tab >= 0 ? line.slice(tab + 1) : line, `object line "${line.slice(0, 40)}"`), 'a batch line'));
120
+ }
121
+ return out;
122
+ }
123
+ /**
124
+ * Fetch the root object and everything it references (display geometry
125
+ * excepted), keyed by id. Throws when an id the graph references is not
126
+ * returned by the server, or when `maxObjects` is reached.
127
+ */
128
+ export async function fetchObjectGraph(opts, target, rootId) {
129
+ const objects = new Map();
130
+ const rootText = await request(opts, `${target.server}/objects/${encodeURIComponent(target.projectId)}/${encodeURIComponent(rootId)}/single`, 'GET', { Accept: 'text/plain' });
131
+ const root = asObject(parseJson(rootText, `root object ${rootId}`), `root object ${rootId}`);
132
+ objects.set(rootId, root);
133
+ let frontier = [...referencedIds(root)].filter((id) => !objects.has(id));
134
+ while (frontier.length > 0) {
135
+ if (objects.size + frontier.length > opts.maxObjects) {
136
+ throw new Error(`speckle.receive: the model references more than maxObjects (${opts.maxObjects}) objects; raise maxObjects to receive it`);
137
+ }
138
+ const next = new Set();
139
+ for (let i = 0; i < frontier.length; i += BATCH_SIZE) {
140
+ const ids = frontier.slice(i, i + BATCH_SIZE);
141
+ for (const obj of await fetchBatch(opts, target, ids))
142
+ objects.set(obj.id, obj);
143
+ const missing = ids.filter((id) => !objects.has(id));
144
+ if (missing.length > 0)
145
+ throw new Error(`speckle.receive: the server did not return ${missing.length} referenced object(s), e.g. ${missing[0]}`);
146
+ for (const id of ids)
147
+ referencedIds(objects.get(id), next);
148
+ }
149
+ frontier = [...next].filter((id) => !objects.has(id));
150
+ }
151
+ return objects;
152
+ }
153
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/speckle/client.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAmBhG,6EAA6E;AAC7E,MAAM,CAAC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;AAE3H,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,SAAS,OAAO,CAAC,IAA0B,EAAE,KAA6B;IACxE,MAAM,CAAC,GAA2B,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,CAAC,CAAC,aAAa,GAAG,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;IAClF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,IAA0B,EAAE,GAAW,EAAE,MAAsB,EAAE,KAA6B,EAAE,IAAa;IAE7G,IAAI,GAAG,CAAC;IACR,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,kBAAkB,CAC5B,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,EAC7H,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,SAAS,CACf,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,IAAI,GAAG,iBAAiB,GAAG,CAAC,MAAM,qDAAqD,CAAC,CAAC;IACrI,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,IAAI,GAAG,uBAAuB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACjI,IAAI,GAAG,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,GAAG,uBAAuB,IAAI,CAAC,QAAQ,yCAAyC,CAAC,CAAC;IAC3J,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,IAAY;IAC3C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,oBAAoB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,kIAAkI,CAAC;AACzJ,MAAM,YAAY,GAChB,6JAA6J,CAAC;AAEhK,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAA0B,EAAE,MAAqB;IACjF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CACzB,MAAM;QACJ,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE;QACnG,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,CACjG,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,UAAU,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/I,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,sBAAsB,CAGjD,CAAC;IACF,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,yEAAyE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjJ,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,4BAA4B,MAAM,CAAC,SAAS,6BAA6B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,0BAA0B,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC;IACrL,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,gBAAgB,KAAK,QAAQ,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,KAAK,CAAC,4BAA4B,OAAO,CAAC,EAAE,8BAA8B,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,gBAAgB,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;AACvE,CAAC;AAOD,oFAAoF;AACpF,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,MAAmB,IAAI,GAAG,EAAE;IACxE,MAAM,KAAK,GAAc,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,CAA4B,CAAC;YACvC,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;gBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YAChE,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,WAAW,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;oBAAE,SAAS;gBACvD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,IAAY;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAQ,KAA0B,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC9H,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,0BAA0B,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,KAAsB,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAA0B,EAAE,MAAqB,EAAE,GAAsB;IACjG,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,IAAI,EACJ,GAAG,MAAM,CAAC,MAAM,mBAAmB,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EACzE,MAAM,EACN,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,YAAY,EAAE,EAC5D,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CACjD,CAAC;IACF,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAA0B,EAAE,MAAqB,EAAE,MAAc;IACtG,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAC5B,IAAI,EACJ,GAAG,MAAM,CAAC,MAAM,YAAY,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,SAAS,EACvG,KAAK,EACL,EAAE,MAAM,EAAE,YAAY,EAAE,CACzB,CAAC;IACF,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,eAAe,MAAM,EAAE,CAAC,EAAE,eAAe,MAAM,EAAE,CAAC,CAAC;IAC7F,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC1B,IAAI,QAAQ,GAAG,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACzE,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,CAAC,UAAU,2CAA2C,CAAC,CAAC;QAC7I,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAChF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,CAAC,MAAM,+BAA+B,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACjJ,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QACD,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Reading Speckle geometry primitives into metres: points, straight lines,
3
+ * and polygonal outlines. Anything that is not exactly one of those (an
4
+ * arc, a NURBS curve, a gap between polycurve segments) is reported as
5
+ * `undefined` with a reason, so the caller refuses the element rather than
6
+ * approximating its shape.
7
+ */
8
+ import type { SpeckleObject } from './client.js';
9
+ export type Vec3 = [number, number, number];
10
+ export type Resolver = (value: unknown) => Record<string, unknown> | undefined;
11
+ /** Resolve a detached `{ speckle_type: 'reference', referencedId }` against the fetched graph; inline objects pass through. */
12
+ export declare function resolverFor(objects: ReadonlyMap<string, SpeckleObject>): Resolver;
13
+ /** `speckle_type` is a `:`-joined inheritance chain; true when `base` is one of its links. */
14
+ export declare function isA(obj: Record<string, unknown> | undefined, base: string): boolean;
15
+ /** The most-derived link of the chain, the name refusals use. */
16
+ export declare function leafType(obj: Record<string, unknown>): string;
17
+ /** A Speckle point in metres; its own `units` win over the owner's. */
18
+ export declare function pointOf(resolve: Resolver, value: unknown, ownerUnits: unknown): Vec3 | undefined;
19
+ /** Start/end of an `Objects.Geometry.Line`, in metres. */
20
+ export declare function lineOf(resolve: Resolver, value: unknown, ownerUnits: unknown): {
21
+ start: Vec3;
22
+ end: Vec3;
23
+ } | {
24
+ reason: string;
25
+ };
26
+ /**
27
+ * The vertices of a closed, planar-horizontal outline (a `Polycurve` of
28
+ * `Line` segments, or a closed `Polyline`), in metres, without the closing
29
+ * duplicate. Everything else — arcs, open or gapped outlines, outlines whose
30
+ * vertices do not share one elevation — returns a reason.
31
+ */
32
+ export declare function outlineOf(resolve: Resolver, value: unknown, ownerUnits: unknown): {
33
+ points: Vec3[];
34
+ } | {
35
+ reason: string;
36
+ };
37
+ //# sourceMappingURL=geometry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/speckle/geometry.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC5C,MAAM,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;AAE/E,+HAA+H;AAC/H,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,QAAQ,CAOjF;AAED,8FAA8F;AAC9F,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAK7D;AAOD,uEAAuE;AACvE,wBAAgB,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,CAMhG;AAED,0DAA0D;AAC1D,wBAAgB,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAS9H;AAuBD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,IAAI,EAAE,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAgCzH"}
@@ -0,0 +1,126 @@
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 { lengthScale } from './units.js';
5
+ /** Resolve a detached `{ speckle_type: 'reference', referencedId }` against the fetched graph; inline objects pass through. */
6
+ export function resolverFor(objects) {
7
+ return (value) => {
8
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
9
+ return undefined;
10
+ const o = value;
11
+ if (typeof o.referencedId === 'string')
12
+ return objects.get(o.referencedId);
13
+ return o;
14
+ };
15
+ }
16
+ /** `speckle_type` is a `:`-joined inheritance chain; true when `base` is one of its links. */
17
+ export function isA(obj, base) {
18
+ return typeof obj?.speckle_type === 'string' && obj.speckle_type.split(':').includes(base);
19
+ }
20
+ /** The most-derived link of the chain, the name refusals use. */
21
+ export function leafType(obj) {
22
+ const t = typeof obj.speckle_type === 'string' ? obj.speckle_type : 'Base';
23
+ const chain = t.split(':');
24
+ const leaf = chain[chain.length - 1];
25
+ return leaf.slice(leaf.lastIndexOf('.') + 1);
26
+ }
27
+ /** `a Line`, `an Arc`. */
28
+ const withArticle = (word) => `${/^[AEIOU]/i.test(word) ? 'an' : 'a'} ${word}`;
29
+ const finite = (v) => typeof v === 'number' && Number.isFinite(v);
30
+ /** A Speckle point in metres; its own `units` win over the owner's. */
31
+ export function pointOf(resolve, value, ownerUnits) {
32
+ const p = resolve(value);
33
+ if (!p || !finite(p.x) || !finite(p.y) || !finite(p.z))
34
+ return undefined;
35
+ const s = lengthScale(p.units) ?? lengthScale(ownerUnits);
36
+ if (s === undefined)
37
+ return undefined;
38
+ return [p.x * s, p.y * s, p.z * s];
39
+ }
40
+ /** Start/end of an `Objects.Geometry.Line`, in metres. */
41
+ export function lineOf(resolve, value, ownerUnits) {
42
+ const line = resolve(value);
43
+ if (!line)
44
+ return { reason: 'has no location line' };
45
+ if (!isA(line, 'Objects.Geometry.Line'))
46
+ return { reason: `has ${withArticle(leafType(line))} location, not a straight line` };
47
+ const units = line.units ?? ownerUnits;
48
+ const start = pointOf(resolve, line.start, units);
49
+ const end = pointOf(resolve, line.end, units);
50
+ if (!start || !end)
51
+ return { reason: 'has a location line without numeric points in a length unit' };
52
+ return { start, end };
53
+ }
54
+ /** A flat number list, possibly chunked into `DataChunk` references. */
55
+ function numbers(resolve, value) {
56
+ if (!Array.isArray(value))
57
+ return undefined;
58
+ const out = [];
59
+ for (const item of value) {
60
+ if (finite(item))
61
+ out.push(item);
62
+ else {
63
+ const chunk = resolve(item);
64
+ if (!chunk || !Array.isArray(chunk.data) || !chunk.data.every(finite))
65
+ return undefined;
66
+ out.push(...chunk.data);
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+ const TOL = 1e-4; // metres: 0.1 mm
72
+ function near(a, b) {
73
+ return Math.abs(a[0] - b[0]) <= TOL && Math.abs(a[1] - b[1]) <= TOL && Math.abs(a[2] - b[2]) <= TOL;
74
+ }
75
+ /**
76
+ * The vertices of a closed, planar-horizontal outline (a `Polycurve` of
77
+ * `Line` segments, or a closed `Polyline`), in metres, without the closing
78
+ * duplicate. Everything else — arcs, open or gapped outlines, outlines whose
79
+ * vertices do not share one elevation — returns a reason.
80
+ */
81
+ export function outlineOf(resolve, value, ownerUnits) {
82
+ const curve = resolve(value);
83
+ if (!curve)
84
+ return { reason: 'has no outline' };
85
+ const units = curve.units ?? ownerUnits;
86
+ let points = [];
87
+ if (isA(curve, 'Objects.Geometry.Polycurve')) {
88
+ const segments = Array.isArray(curve.segments) ? curve.segments : [];
89
+ for (const [i, seg] of segments.entries()) {
90
+ const line = lineOf(resolve, seg, units);
91
+ if ('reason' in line) {
92
+ const s = resolve(seg);
93
+ return { reason: `has an outline with ${withArticle(s ? leafType(s) : 'missing')} segment, not only straight lines` };
94
+ }
95
+ if (i > 0 && !near(points[points.length - 1], line.start))
96
+ return { reason: 'has an outline with a gap between segments' };
97
+ if (i === 0)
98
+ points.push(line.start);
99
+ points.push(line.end);
100
+ }
101
+ }
102
+ else if (isA(curve, 'Objects.Geometry.Polyline')) {
103
+ const flat = numbers(resolve, curve.value);
104
+ const s = lengthScale(units);
105
+ if (!flat || flat.length % 3 !== 0 || s === undefined)
106
+ return { reason: 'has a polyline outline without numeric coordinates in a length unit' };
107
+ for (let i = 0; i < flat.length; i += 3)
108
+ points.push([flat[i] * s, flat[i + 1] * s, flat[i + 2] * s]);
109
+ if (curve.closed !== true && !(points.length > 1 && near(points[0], points[points.length - 1])))
110
+ return { reason: 'has an open polyline outline' };
111
+ if (curve.closed === true)
112
+ points.push(points[0]);
113
+ }
114
+ else {
115
+ return { reason: `has ${withArticle(leafType(curve))} outline, not line segments` };
116
+ }
117
+ if (points.length < 2 || !near(points[0], points[points.length - 1]))
118
+ return { reason: 'has an outline that does not close' };
119
+ points = points.slice(0, -1);
120
+ if (points.length < 3)
121
+ return { reason: 'has an outline with fewer than three vertices' };
122
+ if (points.some((p) => Math.abs(p[2] - points[0][2]) > TOL))
123
+ return { reason: 'has an outline that is not horizontal (sloped)' };
124
+ return { points };
125
+ }
126
+ //# sourceMappingURL=geometry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../src/speckle/geometry.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAW/D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKzC,+HAA+H;AAC/H,MAAM,UAAU,WAAW,CAAC,OAA2C;IACrE,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1F,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,GAAG,CAAC,GAAwC,EAAE,IAAY;IACxE,OAAO,OAAO,GAAG,EAAE,YAAY,KAAK,QAAQ,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,QAAQ,CAAC,GAA4B;IACnD,MAAM,CAAC,GAAG,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3E,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,0BAA0B;AAC1B,MAAM,WAAW,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;AAE/F,MAAM,MAAM,GAAG,CAAC,CAAU,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAExF,uEAAuE;AACvE,MAAM,UAAU,OAAO,CAAC,OAAiB,EAAE,KAAc,EAAE,UAAmB;IAC5E,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACrC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,MAAM,CAAC,OAAiB,EAAE,KAAc,EAAE,UAAmB;IAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACrD,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,gCAAgC,EAAE,CAAC;IAC/H,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;IACrG,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,wEAAwE;AACxE,SAAS,OAAO,CAAC,OAAiB,EAAE,KAAc;IAChD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC5B,CAAC;YACJ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;gBAAE,OAAO,SAAS,CAAC;YACxF,GAAG,CAAC,IAAI,CAAC,GAAI,KAAK,CAAC,IAAiB,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,iBAAiB;AAEnC,SAAS,IAAI,CAAC,CAAO,EAAE,CAAO;IAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;AACtG,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,OAAiB,EAAE,KAAc,EAAE,UAAmB;IAC9E,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,UAAU,CAAC;IACxC,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,IAAI,GAAG,CAAC,KAAK,EAAE,4BAA4B,CAAC,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,uBAAuB,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,mCAAmC,EAAE,CAAC;YACxH,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAC;YAC3H,IAAI,CAAC,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;SAAM,IAAI,GAAG,CAAC,KAAK,EAAE,2BAA2B,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,OAAO,EAAE,MAAM,EAAE,qEAAqE,EAAE,CAAC;QAChJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtG,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;QACnJ,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,EAAE,MAAM,EAAE,OAAO,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,6BAA6B,EAAE,CAAC;IACtF,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,oCAAoC,EAAE,CAAC;IAC9H,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC;IAC1F,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,gDAAgD,EAAE,CAAC;IACjI,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}