@formant/data-sdk 1.32.0 → 1.33.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.
@@ -8,6 +8,7 @@ import { ITransform } from "@formant/realtime-sdk/dist/model/ITransform";
8
8
  import { IBitset } from "../../model/IBitset";
9
9
  import { ITransformNode } from "../../model/ITransformNode";
10
10
  import { ILocation } from "../../model/ILocation";
11
+ import { QueryStore } from "./queryStore";
11
12
  export type DeviceId = string;
12
13
  export type DataSourceId = string;
13
14
  export type DataResult<T> = {
@@ -17,7 +18,9 @@ export type DataResult<T> = {
17
18
  };
18
19
  export declare class BasicUniverseDataConnector {
19
20
  pcdWorkerPool: Worker[];
21
+ dataFetchWorkerPool: Worker[];
20
22
  pcdWorkerPoolOccupancy: Boolean[];
23
+ dataFetchWorkerPoolOccupancy: Boolean[];
21
24
  subscriberSources: Map<string, Map<string, UniverseDataSource>>;
22
25
  subscriberLoaders: Map<DeviceId, Map<DataSourceId, (data: any) => Promise<DataResult<any>>>>;
23
26
  subscriberDistributorsLoaders: Map<DeviceId, Map<DataSourceId, ((data: any) => void)[]>>;
@@ -25,10 +28,13 @@ export declare class BasicUniverseDataConnector {
25
28
  lastQueriedHistoricTime: Date | undefined;
26
29
  time: Date | "live";
27
30
  timeChangeListeners: ((time: Date | "live") => void)[];
31
+ queryStore: QueryStore;
28
32
  setTime(time: Date | "live"): void;
29
33
  constructor();
30
- protected getAvailableWorker(): Worker | undefined;
31
- protected releaseWorker(worker: Worker): void;
34
+ protected getAvailablePCDWorker(): Worker | undefined;
35
+ protected getAvailableDataFetchWorker(): Worker | undefined;
36
+ protected releasePCDWorker(worker: Worker): void;
37
+ protected releaseDataFetchWorker(worker: Worker): void;
32
38
  clearWorkerPool(): void;
33
39
  private generateTelemetryFilter;
34
40
  protected sendRtcMessage(deviceId: string, msg: IRtcStreamMessage): Promise<void>;
@@ -1,3 +1,4 @@
1
+ import { IQuery } from "../../model/IQuery";
1
2
  import { IStreamData } from "../../model/IStreamData";
2
3
  import { IFilter } from "../../model/IFilter";
3
4
  import { StreamType } from "../../model/StreamType";
@@ -5,7 +6,7 @@ export declare class QueryStore {
5
6
  private queryStoreCache;
6
7
  private liveQueryStoreCache;
7
8
  moduleQuery<T extends StreamType>(filter: IFilter, name: string, type: T, start: Date, end: Date, latestOnly?: boolean): IStreamData<T>[] | "too much data" | undefined;
8
- query(filter: IFilter, start: Date, end: Date, latestOnly?: boolean): IStreamData[] | "too much data" | undefined;
9
+ query(q: IQuery): IStreamData[] | "too much data" | undefined;
9
10
  private queryCache;
10
11
  private liveQueryCache;
11
12
  }
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  }
25
25
  }
26
26
  },
27
- "version": "1.32.0",
27
+ "version": "1.33.0",
28
28
  "scripts": {
29
29
  "preversion": "npm run verify",
30
30
  "postversion": "make",
@@ -1 +0,0 @@
1
- {"version":3,"file":"PcdLoaderWorker-cb508551.js","sources":["../node_modules/lzfjs/lzf.js","../src/connector/data/range.ts","../src/connector/data/pcd.ts","../src/connector/data/PcdLoaderWorker.ts"],"sourcesContent":["/**\r\n * LZF compression/decompression module. Ported from the C\r\n * implementation of liblzf, specfically lzf_c.c and lzf_d.c\r\n * @license BSD-2-Clause\r\n */\r\n\r\n \"use strict\";\r\n\r\n/**\r\n * Decompress a TypedArray (in browser) or Buffer (in node)\r\n * containing LZF compressed data.\r\n * @param {(ArrayBuffer|TypedArray|Buffer)} data - the data to be decompressed\r\n * @returns {(Uint8Array|Buffer)} - decompressed data\r\n */\r\nfunction decompress(data) {\r\n var input = new Uint8Array(data);\r\n var output = [];\r\n\r\n var ip = 0;\r\n var op = 0;\r\n\r\n do {\r\n var ctrl = input[ip++];\r\n\r\n if (ctrl < (1 << 5)) { /* literal run */\r\n ctrl++;\r\n\r\n if (ip + ctrl > input.length) {\r\n throw new Error('Invalid input'); \r\n }\r\n\r\n while (ctrl--) {\r\n output[op++] = input[ip++];\r\n }\r\n } else { /* back reference */\r\n var len = ctrl >> 5;\r\n var ref = op - ((ctrl & 0x1f) << 8) - 1;\r\n\r\n if (ip >= input.length) {\r\n throw new Error('Invalid input');\r\n }\r\n\r\n if (len == 7) {\r\n len += input[ip++];\r\n\r\n if (ip >= input.length) {\r\n throw new Error('Invalid input');\r\n }\r\n }\r\n\r\n ref -= input[ip++];\r\n\r\n if (ref < 0) {\r\n throw new Error('Invalid input');\r\n }\r\n\r\n len += 2;\r\n\r\n do {\r\n output[op++] = output[ref++];\r\n } while (--len);\r\n }\r\n } while (ip < input.length);\r\n\r\n // Return a Buffer if it exists (say in node), otherwise just\r\n // use a normal Uint8Array.\r\n if (typeof Buffer !== 'undefined') {\r\n return new Buffer(output);\r\n } else {\r\n var res = new Uint8Array(output.length);\r\n res.set(output);\r\n return res;\r\n }\r\n}\r\n\r\n/**\r\n * Compress a buffer containing some data\r\n * @param {(ArrayBuffer|TypedArray|Buffer)} data - the data to be compressed\r\n * @returns {(Uint8Array|Buffer)} - compressed data\r\n */\r\nfunction compress(data) {\r\n var HLOG = 16;\r\n var HSIZE = (1 << HLOG);\r\n var LZF_MAX_OFF = (1 << 13);\r\n var LZF_MAX_REF = ((1 << 8) + (1 << 3));\r\n var LZF_MAX_LIT = (1 << 5);\r\n\r\n function FRST(data, p) {\r\n return (((data[p]) << 8) | data[p+1]);\r\n }\r\n\r\n function NEXT(v, data, p) {\r\n return (((v) << 8) | data[p+2]);\r\n }\r\n\r\n function IDX(h) {\r\n return (((h * 0x1e35a7bd) >> (32 - HLOG - 8)) & (HSIZE - 1));\r\n }\r\n\r\n var input = new Uint8Array(data);\r\n var output = [];\r\n var htab = new Uint32Array(HSIZE);\r\n\r\n var in_end = input.length, ip = 0, hval = FRST(input, ip);\r\n var op = 1, lit = 0; /* start run */\r\n\r\n while (ip < in_end - 2) {\r\n hval = NEXT(hval, data, ip);\r\n var hslot = IDX(hval);\r\n var ref = htab[hslot];\r\n htab[hslot] = ip;\r\n\r\n var off;\r\n\r\n if (ref < ip /* the next test will actually take care of this, but this is faster */\r\n && (off = ip - ref - 1) < LZF_MAX_OFF\r\n && ref > 0\r\n && input[ref + 2] == input[ip + 2]\r\n && input[ref + 1] == input[ip + 1]\r\n && input[ref] == input[ip]\r\n ) {\r\n /* match found at *ref++ */\r\n var len = 2;\r\n var maxlen = in_end - ip - len;\r\n maxlen = maxlen > LZF_MAX_REF ? LZF_MAX_REF : maxlen;\r\n\r\n output[op - lit - 1] = (lit - 1) & 255; /* stop run */\r\n if (lit == 0) {\r\n op -= 1; /* undo run if length is zero */\r\n }\r\n\r\n do {\r\n len++;\r\n }\r\n while (len < maxlen && input[ref + len] == input[ip + len]);\r\n\r\n len -= 2; /* len is now #octets - 1 */\r\n ip++;\r\n\r\n if (len < 7) {\r\n output[op++] = ((off >> 8) + (len << 5)) & 255;\r\n } else {\r\n output[op++] = ((off >> 8) + (7 << 5)) & 255;\r\n output[op++] = (len - 7) & 255;\r\n }\r\n\r\n output[op++] = off & 255;\r\n\r\n lit = 0; op++; /* start run */\r\n\r\n ip += len + 1;\r\n\r\n if (ip >= in_end - 2) {\r\n break;\r\n }\r\n\r\n --ip;\r\n --ip;\r\n hval = FRST(input, ip);\r\n\r\n hval = NEXT(hval, input, ip);\r\n htab[IDX(hval)] = ip++;\r\n\r\n hval = NEXT(hval, input, ip);\r\n htab[IDX(hval)] = ip++;\r\n } else {\r\n lit++;\r\n output[op++] = input[ip++];\r\n\r\n if (lit == LZF_MAX_LIT) {\r\n output[op - lit - 1] = (lit - 1) & 255; /* stop run */\r\n lit = 0; op++; /* start run */\r\n }\r\n }\r\n }\r\n\r\n while (ip < in_end) {\r\n lit++;\r\n output[op++] = input[ip++];\r\n\r\n if (lit == LZF_MAX_LIT) {\r\n output[op - lit - 1] = (lit - 1) & 255; /* stop run */\r\n lit = 0; op++; /* start run */\r\n }\r\n }\r\n\r\n if (lit != 0) {\r\n output[op - lit - 1] = (lit - 1) & 255; /* stop run */\r\n }\r\n\r\n // Return a Buffer if it exists (say in node), otherwise just\r\n // use a normal Uint8Array.\r\n if (typeof Buffer !== 'undefined') {\r\n return new Buffer(output);\r\n } else {\r\n var res = new Uint8Array(output.length);\r\n res.set(output);\r\n return res;\r\n }\r\n}\r\n\r\nmodule.exports = {\r\n decompress: decompress,\r\n compress: compress\r\n};\r\n","export const range = (start: number, end: number) =>\n end <= start ? [] : new Array(end - start).fill(0).map((_, i) => i + start);\n","// @ts-ignore-next-line\nimport * as lzfjs from \"lzfjs\";\nimport { range } from \"./range\";\n\nexport type Field = \"x\" | \"y\" | \"z\" | \"rgb\" | \"rgba\" | \"intensity\";\nexport type Type = \"i\" | \"u\" | \"f\";\nexport type Data = \"ascii\" | \"binary\" | \"binary_compressed\";\n\nexport interface IPcdHeader {\n version: string;\n fields: Field[];\n size: number[];\n type: Type[];\n count: number[];\n height: number;\n width: number;\n points: number;\n data: Data;\n}\n\ninterface IOffsets {\n x?: number;\n y?: number;\n z?: number;\n rgb?: number;\n rgba?: number;\n intensity?: number;\n}\n\nexport interface IPcd {\n header: IPcdHeader;\n positions?: Float32Array;\n colors?: Float32Array;\n intensity?: Float32Array;\n}\n\nconst littleEndian = true;\n\nfunction base64ToArrayBuffer(b: string) {\n const binaryString = atob(b);\n const len = binaryString.length;\n const bytes = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes.buffer;\n}\n\nfunction extractHeader(buffer: ArrayBuffer): {\n header: string;\n body: ArrayBuffer;\n} {\n const chars = new Uint8Array(buffer);\n let header = \"\";\n\n let i = 0;\n for (\n ;\n i < chars.length && header.search(/[\\r\\n]DATA\\s(\\S*)\\s/i) === -1;\n i += 1\n ) {\n header += String.fromCharCode(chars[i]);\n }\n return {\n body: buffer.slice(i),\n header: header.replace(/#.*/gi, \"\"),\n };\n}\n\nfunction decompress(data: ArrayBuffer): ArrayBufferLike {\n const sizes = new Uint32Array(data, 0, 2);\n const compressedSize = sizes[0];\n if (compressedSize === 0) {\n return new ArrayBuffer(0);\n }\n return lzfjs.decompress(new Uint8Array(data, 8, compressedSize)).buffer;\n}\n\nfunction parseHeader(buffer: ArrayBuffer): {\n header: IPcdHeader;\n body: ArrayBuffer;\n} {\n const { header, body } = extractHeader(buffer);\n\n const versionMatch = /VERSION (.*)/i.exec(header);\n if (versionMatch === null) {\n throw new Error(`Missing version. Header ${header}`);\n }\n const version = versionMatch[1];\n\n const fieldsMatch = /FIELDS (.*)/i.exec(header);\n if (!fieldsMatch) {\n throw new Error(\"Missing fields\");\n }\n const fields = fieldsMatch[1].split(\" \") as Field[];\n\n const sizeMatch = /SIZE (.*)/i.exec(header);\n if (!sizeMatch) {\n throw new Error(\"Missing size\");\n }\n const size = sizeMatch[1].split(\" \").map((_) => parseInt(_, 10));\n\n const typeMatch = /TYPE (.*)/i.exec(header);\n if (!typeMatch) {\n throw new Error(\"Missing type\");\n }\n const type = typeMatch[1].split(\" \") as Type[];\n\n const countMatch = /COUNT (.*)/i.exec(header);\n let optionalCount: number[] | undefined;\n if (countMatch) {\n optionalCount = countMatch[1].split(\" \").map((_) => parseInt(_, 10));\n }\n const count = optionalCount || fields.map((_) => 1);\n\n const widthMatch = /WIDTH (.*)/i.exec(header);\n if (!widthMatch) {\n throw new Error(\"Missing width\");\n }\n const width = parseInt(widthMatch[1], 10);\n\n const heightMatch = /HEIGHT (.*)/i.exec(header);\n if (!heightMatch) {\n throw new Error(\"Missing height\");\n }\n const height = parseInt(heightMatch[1], 10);\n\n const pointsMatch = /POINTS (.*)/i.exec(header);\n let optionalPoints: number | undefined;\n if (pointsMatch) {\n optionalPoints = parseInt(pointsMatch[1], 10);\n }\n const points = optionalPoints || width * height;\n\n const dataMatch = /DATA (.*)/i.exec(header);\n if (!dataMatch) {\n throw new Error(\"Missing data\");\n }\n const data = dataMatch[1] as Data;\n\n return {\n body,\n header: {\n count,\n data,\n fields,\n height,\n points,\n size,\n type,\n version,\n width,\n },\n };\n}\n\nfunction calculateOffsets(header: IPcdHeader): {\n offsets: IOffsets;\n size: number;\n} {\n const empty: IOffsets = {};\n return header.fields.reduce(\n ({ offsets, size }, field, i) => {\n let newSize = size;\n if (field === \"x\") {\n offsets.x = newSize;\n }\n if (field === \"y\") {\n offsets.y = newSize;\n }\n if (field === \"z\") {\n offsets.z = newSize;\n }\n if (field === \"rgb\") {\n offsets.rgb = newSize;\n }\n if (field === \"rgba\") {\n offsets.rgba = newSize;\n }\n if (field === \"intensity\") {\n offsets.intensity = newSize;\n }\n if (header.data === \"ascii\") {\n newSize += 1;\n } else if (header.data === \"binary\") {\n newSize += header.size[i] * header.count[i];\n } else if (header.data === \"binary_compressed\") {\n newSize += header.size[i] * header.count[i] * header.points;\n }\n return {\n offsets,\n size: newSize,\n };\n },\n {\n offsets: empty,\n size: 0,\n }\n );\n}\n\nexport function parse(buffer: ArrayBuffer): IPcd {\n const { header, body } = parseHeader(buffer);\n\n const { offsets, size } = calculateOffsets(header);\n\n let positions: Float32Array | undefined;\n if (\n offsets.x !== undefined &&\n offsets.y !== undefined &&\n offsets.z !== undefined\n ) {\n positions = new Float32Array(header.points * 3);\n }\n\n let colors: Float32Array | undefined;\n if (offsets.rgb !== undefined || offsets.rgba !== undefined) {\n colors = new Float32Array(header.points * 4);\n }\n let intensity: Float32Array | undefined;\n if (offsets.intensity !== undefined) {\n intensity = new Float32Array(header.points);\n }\n\n if (header.data === \"ascii\") {\n const dataString: string = String.fromCharCode(...new Uint8Array(body));\n\n const lines = dataString.split(\"\\n\");\n lines.forEach((line, i) => {\n const column = line.split(\" \");\n\n if (positions !== undefined) {\n positions[i * 3 + 0] = parseFloat(column[offsets.x || 0]);\n positions[i * 3 + 1] = parseFloat(column[offsets.y || 0]);\n positions[i * 3 + 2] = parseFloat(column[offsets.z || 0]);\n }\n\n if (colors !== undefined) {\n const intArray = new Int32Array([\n parseInt(column[offsets.rgb || offsets.rgba || 0], 10),\n ]);\n const view = new DataView(intArray.buffer, 0);\n colors[i * 3 + 0] = view.getUint8(2) / 255.0;\n colors[i * 3 + 1] = view.getUint8(1) / 255.0;\n colors[i * 3 + 2] = view.getUint8(0) / 255.0;\n }\n\n if (intensity !== undefined) {\n intensity[i] = parseFloat(column[offsets.intensity || 0]);\n }\n });\n } else if (header.data === \"binary\") {\n const view = new DataView(body);\n\n range(0, header.points).forEach((i) => {\n const row = size * i;\n\n if (positions !== undefined) {\n positions[i * 3 + 0] = view.getFloat32(\n row + (offsets.x || 0),\n littleEndian\n );\n positions[i * 3 + 1] = view.getFloat32(\n row + (offsets.y || 0),\n littleEndian\n );\n positions[i * 3 + 2] = view.getFloat32(\n row + (offsets.z || 0),\n littleEndian\n );\n }\n\n if (colors !== undefined) {\n const offset = row + (offsets.rgb || offsets.rgba || 0);\n if (offset + 2 <= view.byteLength) {\n colors[i * 4 + 0] = view.getUint8(offset + 2) / 255.0;\n colors[i * 4 + 1] = view.getUint8(offset + 1) / 255.0;\n colors[i * 4 + 2] = view.getUint8(offset + 0) / 255.0;\n colors[i * 4 + 3] = 1.0;\n }\n }\n\n if (intensity !== undefined) {\n intensity[i] = view.getFloat32(\n row + (offsets.intensity || 0),\n littleEndian\n );\n }\n });\n } else if (header.data === \"binary_compressed\") {\n const uncompressed = decompress(body);\n const view = new DataView(uncompressed);\n\n range(0, header.points).forEach((i) => {\n if (positions !== undefined) {\n positions[i * 3 + 0] = view.getFloat32(\n (offsets.x || 0) + i * 4,\n littleEndian\n );\n positions[i * 3 + 1] = view.getFloat32(\n (offsets.y || 0) + i * 4,\n littleEndian\n );\n positions[i * 3 + 2] = view.getFloat32(\n (offsets.z || 0) + i * 4,\n littleEndian\n );\n }\n\n if (colors !== undefined) {\n const offset = (offsets.rgb || offsets.rgba || 0) + i * 4;\n if (offset + 2 <= view.byteLength) {\n colors[i * 4 + 0] = view.getUint8(offset + 2) / 255.0;\n colors[i * 4 + 1] = view.getUint8(offset + 1) / 255.0;\n colors[i * 4 + 2] = view.getUint8(offset + 0) / 255.0;\n colors[i * 4 + 3] = 1.0;\n }\n }\n\n if (intensity !== undefined) {\n intensity[i] = view.getFloat32(\n (offsets.intensity || 0) + i * 4,\n littleEndian\n );\n }\n });\n }\n\n return {\n colors,\n header,\n intensity,\n positions,\n };\n}\n\nexport async function loadFromUrl(path: string): Promise<IPcd> {\n const response = await fetch(path, { mode: \"cors\" });\n return parse(await response.arrayBuffer());\n}\n\nexport function loadFromBase64(data: string): IPcd {\n return parse(base64ToArrayBuffer(data));\n}\n","import { parse, loadFromBase64 } from \"./pcd\";\n\nonmessage = (\n event: MessageEvent<{ id?: number; url?: string; pointCloud: string }>\n) => {\n const { url, id, pointCloud } = event.data;\n (async () => {\n if (url) {\n const pcd = parse(\n await fetch(url, { mode: \"cors\" }).then((r) => r.arrayBuffer())\n );\n postMessage({ url, pcd });\n }\n if (id && pointCloud) {\n const pcd = loadFromBase64(pointCloud);\n postMessage({ id, pcd });\n }\n })();\n};\n"],"names":["decompress","data","input","output","ip","op","ctrl","len","ref","res","compress","HLOG","HSIZE","LZF_MAX_OFF","LZF_MAX_REF","LZF_MAX_LIT","FRST","p","NEXT","v","IDX","h","htab","in_end","hval","lit","hslot","off","maxlen","lzf","range","start","end","_","i","littleEndian","base64ToArrayBuffer","b","binaryString","bytes","extractHeader","buffer","chars","header","compressedSize","lzfjs.decompress","parseHeader","body","versionMatch","version","fieldsMatch","fields","sizeMatch","size","typeMatch","type","countMatch","optionalCount","count","widthMatch","width","heightMatch","height","pointsMatch","optionalPoints","points","dataMatch","calculateOffsets","empty","offsets","field","newSize","parse","positions","colors","intensity","line","column","intArray","view","row","offset","uncompressed","loadFromBase64","event","url","id","pointCloud","pcd","r"],"mappings":"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","x_google_ignoreList":[0]}