@vuu-ui/vuu-data-remote 0.13.9 → 0.13.10
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/cjs/ConnectionManager.js +169 -0
- package/cjs/ConnectionManager.js.map +1 -0
- package/cjs/DedicatedWorker.js +61 -0
- package/cjs/DedicatedWorker.js.map +1 -0
- package/cjs/VuuDataSource.js +447 -0
- package/cjs/VuuDataSource.js.map +1 -0
- package/cjs/WebSocketConnection.js +23 -0
- package/cjs/WebSocketConnection.js.map +1 -0
- package/cjs/authenticate.js +28 -0
- package/cjs/authenticate.js.map +1 -0
- package/cjs/constants.js +50 -0
- package/cjs/constants.js.map +1 -0
- package/cjs/data-source.js +48 -0
- package/cjs/data-source.js.map +1 -0
- package/cjs/index.js +26 -3977
- package/cjs/index.js.map +1 -1
- package/cjs/inlined-worker.js +2828 -0
- package/cjs/inlined-worker.js.map +1 -0
- package/cjs/message-utils.js +87 -0
- package/cjs/message-utils.js.map +1 -0
- package/cjs/rest-data/RestDataSource.js +172 -0
- package/cjs/rest-data/RestDataSource.js.map +1 -0
- package/cjs/rest-data/moving-window.js +66 -0
- package/cjs/rest-data/moving-window.js.map +1 -0
- package/cjs/rest-data/rest-utils.js +60 -0
- package/cjs/rest-data/rest-utils.js.map +1 -0
- package/esm/ConnectionManager.js +167 -0
- package/esm/ConnectionManager.js.map +1 -0
- package/esm/DedicatedWorker.js +59 -0
- package/esm/DedicatedWorker.js.map +1 -0
- package/esm/VuuDataSource.js +445 -0
- package/esm/VuuDataSource.js.map +1 -0
- package/esm/WebSocketConnection.js +21 -0
- package/esm/WebSocketConnection.js.map +1 -0
- package/esm/authenticate.js +26 -0
- package/esm/authenticate.js.map +1 -0
- package/esm/constants.js +47 -0
- package/esm/constants.js.map +1 -0
- package/esm/data-source.js +43 -0
- package/esm/data-source.js.map +1 -0
- package/esm/index.js +7 -3962
- package/esm/index.js.map +1 -1
- package/esm/inlined-worker.js +2826 -0
- package/esm/inlined-worker.js.map +1 -0
- package/esm/message-utils.js +80 -0
- package/esm/message-utils.js.map +1 -0
- package/esm/rest-data/RestDataSource.js +170 -0
- package/esm/rest-data/RestDataSource.js.map +1 -0
- package/esm/rest-data/moving-window.js +64 -0
- package/esm/rest-data/moving-window.js.map +1 -0
- package/esm/rest-data/rest-utils.js +55 -0
- package/esm/rest-data/rest-utils.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moving-window.js","sources":["../../src/rest-data/moving-window.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n isRowSelectedLast,\n metadataKeys,\n WindowRange,\n} from \"@vuu-ui/vuu-utils\";\nimport { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\n\nconst { SELECTED } = metadataKeys;\n\nexport class MovingWindow {\n public data: DataSourceRow[];\n public rowCount = 0;\n private range: WindowRange;\n\n constructor({ from, to }: VuuRange) {\n this.range = new WindowRange(from, to);\n //internal data is always 0 based, we add range.from to determine an offset\n this.data = new Array(Math.max(0, to - from));\n this.rowCount = 0;\n }\n\n setRowCount = (rowCount: number) => {\n if (rowCount < this.data.length) {\n this.data.length = rowCount;\n }\n\n this.rowCount = rowCount;\n };\n\n add(data: DataSourceRow) {\n const [index] = data;\n if (this.isWithinRange(index)) {\n const internalIndex = index - this.range.from;\n this.data[internalIndex] = data;\n\n // Hack until we can deal with this more elegantly. When we have a block\n // select operation, first row is selected (and updated via server), then\n // remaining rows are selected when we select the block-end row. We get an\n // update for all rows except first. Because we're extending the select status\n // on the client, we have to adjust the first row selected (its still selected\n // but is no longer the 'last selected row in block')\n // Maybe answer is to apply ALL the selection status code here, not in Viewport\n if (data[SELECTED]) {\n const previousRow = this.data[internalIndex - 1];\n if (isRowSelectedLast(previousRow)) {\n this.data[internalIndex - 1] = previousRow.slice() as DataSourceRow;\n this.data[internalIndex - 1][SELECTED] -= 4;\n }\n }\n }\n }\n\n getAtIndex(index: number) {\n return this.range.isWithin(index) &&\n this.data[index - this.range.from] != null\n ? this.data[index - this.range.from]\n : undefined;\n }\n\n isWithinRange(index: number) {\n return this.range.isWithin(index);\n }\n\n setRange({ from, to }: VuuRange) {\n if (from !== this.range.from || to !== this.range.to) {\n const [overlapFrom, overlapTo] = this.range.overlap(from, to);\n const newData = new Array(Math.max(0, to - from));\n for (let i = overlapFrom; i < overlapTo; i++) {\n const data = this.getAtIndex(i);\n if (data) {\n const index = i - from;\n newData[index] = data;\n }\n }\n this.data = newData;\n this.range.from = from;\n this.range.to = to;\n }\n }\n\n getSelectedRows() {\n return this.data.filter((row) => row[SELECTED] !== 0);\n }\n}\n"],"names":["metadataKeys","WindowRange","isRowSelectedLast"],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const NDJsonReader = (startIndex, jsonHandler, onEnd) => (response) => {
|
|
4
|
+
if (response.ok && response.body) {
|
|
5
|
+
const stream = response.body.getReader();
|
|
6
|
+
const decoder = new TextDecoder();
|
|
7
|
+
const matcher = /\r?\n/;
|
|
8
|
+
let buf = "";
|
|
9
|
+
let index = startIndex;
|
|
10
|
+
const loop = () => stream.read().then(({ done, value }) => {
|
|
11
|
+
if (done) {
|
|
12
|
+
if (buf.length > 0) jsonHandler(index, JSON.parse(buf));
|
|
13
|
+
onEnd();
|
|
14
|
+
} else {
|
|
15
|
+
const chunk = decoder.decode(value, {
|
|
16
|
+
stream: true
|
|
17
|
+
});
|
|
18
|
+
buf += chunk;
|
|
19
|
+
const jsonFragments = buf.split(matcher);
|
|
20
|
+
buf = jsonFragments.pop() ?? "";
|
|
21
|
+
for (const jsonFragment of jsonFragments) {
|
|
22
|
+
jsonHandler(index, JSON.parse(jsonFragment));
|
|
23
|
+
index += 1;
|
|
24
|
+
}
|
|
25
|
+
return loop();
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return loop();
|
|
29
|
+
} else {
|
|
30
|
+
throw Error(`response invalid ${response.status} ${response.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const jsonToDataSourceRow = (rowIndex, json, columnMap) => {
|
|
34
|
+
const dataSourceRow = [
|
|
35
|
+
rowIndex,
|
|
36
|
+
rowIndex,
|
|
37
|
+
true,
|
|
38
|
+
false,
|
|
39
|
+
0,
|
|
40
|
+
0,
|
|
41
|
+
json.ric,
|
|
42
|
+
0
|
|
43
|
+
];
|
|
44
|
+
for (const [column, colIdx] of Object.entries(columnMap)) {
|
|
45
|
+
dataSourceRow[colIdx] = json[column];
|
|
46
|
+
}
|
|
47
|
+
return dataSourceRow;
|
|
48
|
+
};
|
|
49
|
+
const sortParamsToList = (sortDefs) => sortDefs.reduce(
|
|
50
|
+
(list, { column, sortType }) => list.concat([column, sortType]),
|
|
51
|
+
[]
|
|
52
|
+
);
|
|
53
|
+
const sortToQueryString = (sort) => `&sort=[${sortParamsToList(sort.sortDefs)}]`;
|
|
54
|
+
const filterToQueryString = (vuuFilter) => `&filter=[${vuuFilter.filter}]`;
|
|
55
|
+
|
|
56
|
+
exports.NDJsonReader = NDJsonReader;
|
|
57
|
+
exports.filterToQueryString = filterToQueryString;
|
|
58
|
+
exports.jsonToDataSourceRow = jsonToDataSourceRow;
|
|
59
|
+
exports.sortToQueryString = sortToQueryString;
|
|
60
|
+
//# sourceMappingURL=rest-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest-utils.js","sources":["../../src/rest-data/rest-utils.ts"],"sourcesContent":["import { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuFilter,\n VuuRowDataItemType,\n VuuSort,\n VuuSortCol,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonArray = Json[];\nexport type JsonObject = { [key: string]: Json };\nexport type Json = JsonPrimitive | JsonArray | JsonObject;\nexport type JsonHandler = (rowIndex: number, json: JsonObject) => void;\n\nexport const NDJsonReader =\n (startIndex: number, jsonHandler: JsonHandler, onEnd: () => void) =>\n (response: Response) => {\n if (response.ok && response.body) {\n const stream = response.body.getReader();\n const decoder = new TextDecoder();\n const matcher = /\\r?\\n/;\n let buf = \"\";\n let index = startIndex;\n\n const loop: () => void = () =>\n stream.read().then(({ done, value }) => {\n if (done) {\n if (buf.length > 0) jsonHandler(index, JSON.parse(buf));\n onEnd();\n } else {\n const chunk = decoder.decode(value, {\n stream: true,\n });\n buf += chunk;\n\n const jsonFragments = buf.split(matcher);\n buf = jsonFragments.pop() ?? \"\";\n for (const jsonFragment of jsonFragments) {\n jsonHandler(index, JSON.parse(jsonFragment));\n index += 1;\n }\n return loop();\n }\n });\n return loop();\n } else {\n throw Error(`response invalid ${response.status} ${response.statusText}`);\n }\n };\n\nexport const jsonToDataSourceRow = (\n rowIndex: number,\n json: JsonObject,\n columnMap: ColumnMap,\n): DataSourceRow => {\n const dataSourceRow: DataSourceRow = [\n rowIndex,\n rowIndex,\n true,\n false,\n 0,\n 0,\n json.ric as string,\n 0,\n ];\n for (const [column, colIdx] of Object.entries(columnMap)) {\n dataSourceRow[colIdx] = json[column] as VuuRowDataItemType;\n }\n return dataSourceRow;\n};\n\nconst sortParamsToList = (sortDefs: VuuSortCol[]) =>\n sortDefs.reduce<string[]>(\n (list, { column, sortType }) => list.concat([column, sortType]),\n [],\n );\n\nexport const sortToQueryString = (sort: VuuSort) =>\n `&sort=[${sortParamsToList(sort.sortDefs)}]`;\n\nexport const filterToQueryString = (vuuFilter: VuuFilter) =>\n `&filter=[${vuuFilter.filter}]`;\n"],"names":[],"mappings":";;AAeO,MAAM,eACX,CAAC,UAAA,EAAoB,WAA0B,EAAA,KAAA,KAC/C,CAAC,QAAuB,KAAA;AACtB,EAAI,IAAA,QAAA,CAAS,EAAM,IAAA,QAAA,CAAS,IAAM,EAAA;AAChC,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,IAAA,CAAK,SAAU,EAAA;AACvC,IAAM,MAAA,OAAA,GAAU,IAAI,WAAY,EAAA;AAChC,IAAA,MAAM,OAAU,GAAA,OAAA;AAChB,IAAA,IAAI,GAAM,GAAA,EAAA;AACV,IAAA,IAAI,KAAQ,GAAA,UAAA;AAEZ,IAAM,MAAA,IAAA,GAAmB,MACvB,MAAA,CAAO,IAAK,EAAA,CAAE,KAAK,CAAC,EAAE,IAAM,EAAA,KAAA,EAAY,KAAA;AACtC,MAAA,IAAI,IAAM,EAAA;AACR,QAAI,IAAA,GAAA,CAAI,SAAS,CAAG,EAAA,WAAA,CAAY,OAAO,IAAK,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA;AACtD,QAAM,KAAA,EAAA;AAAA,OACD,MAAA;AACL,QAAM,MAAA,KAAA,GAAQ,OAAQ,CAAA,MAAA,CAAO,KAAO,EAAA;AAAA,UAClC,MAAQ,EAAA;AAAA,SACT,CAAA;AACD,QAAO,GAAA,IAAA,KAAA;AAEP,QAAM,MAAA,aAAA,GAAgB,GAAI,CAAA,KAAA,CAAM,OAAO,CAAA;AACvC,QAAM,GAAA,GAAA,aAAA,CAAc,KAAS,IAAA,EAAA;AAC7B,QAAA,KAAA,MAAW,gBAAgB,aAAe,EAAA;AACxC,UAAA,WAAA,CAAY,KAAO,EAAA,IAAA,CAAK,KAAM,CAAA,YAAY,CAAC,CAAA;AAC3C,UAAS,KAAA,IAAA,CAAA;AAAA;AAEX,QAAA,OAAO,IAAK,EAAA;AAAA;AACd,KACD,CAAA;AACH,IAAA,OAAO,IAAK,EAAA;AAAA,GACP,MAAA;AACL,IAAA,MAAM,MAAM,CAAoB,iBAAA,EAAA,QAAA,CAAS,MAAM,CAAI,CAAA,EAAA,QAAA,CAAS,UAAU,CAAE,CAAA,CAAA;AAAA;AAE5E;AAEK,MAAM,mBAAsB,GAAA,CACjC,QACA,EAAA,IAAA,EACA,SACkB,KAAA;AAClB,EAAA,MAAM,aAA+B,GAAA;AAAA,IACnC,QAAA;AAAA,IACA,QAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,CAAA;AAAA,IACA,CAAA;AAAA,IACA,IAAK,CAAA,GAAA;AAAA,IACL;AAAA,GACF;AACA,EAAA,KAAA,MAAW,CAAC,MAAQ,EAAA,MAAM,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AACxD,IAAc,aAAA,CAAA,MAAM,CAAI,GAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAErC,EAAO,OAAA,aAAA;AACT;AAEA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KACxB,QAAS,CAAA,MAAA;AAAA,EACP,CAAC,IAAM,EAAA,EAAE,MAAQ,EAAA,QAAA,EAAe,KAAA,IAAA,CAAK,MAAO,CAAA,CAAC,MAAQ,EAAA,QAAQ,CAAC,CAAA;AAAA,EAC9D;AACF,CAAA;AAEK,MAAM,oBAAoB,CAAC,IAAA,KAChC,UAAU,gBAAiB,CAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AAEpC,MAAM,mBAAsB,GAAA,CAAC,SAClC,KAAA,CAAA,SAAA,EAAY,UAAU,MAAM,CAAA,CAAA;;;;;;;"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { EventEmitter, DeferredPromise, isConnectionQualityMetrics, isRequestResponse, messageHasResult, isTableSchemaMessage, uuid } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import { isWebSocketConnectionMessage } from './WebSocketConnection.js';
|
|
3
|
+
import { DedicatedWorker } from './DedicatedWorker.js';
|
|
4
|
+
import { shouldMessageBeRoutedToDataSource } from './data-source.js';
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __typeError = (msg) => {
|
|
8
|
+
throw TypeError(msg);
|
|
9
|
+
};
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
12
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
13
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
14
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
15
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
16
|
+
var _connectionState, _instance, _deferredServerAPI, _pendingRequests, _viewports, _worker;
|
|
17
|
+
const _ConnectionManager = class _ConnectionManager extends EventEmitter {
|
|
18
|
+
constructor() {
|
|
19
|
+
super();
|
|
20
|
+
__privateAdd(this, _connectionState, {
|
|
21
|
+
connectionPhase: "connecting",
|
|
22
|
+
connectionStatus: "closed",
|
|
23
|
+
retryAttemptsTotal: -1,
|
|
24
|
+
retryAttemptsRemaining: -1,
|
|
25
|
+
secondsToNextRetry: -1
|
|
26
|
+
});
|
|
27
|
+
__privateAdd(this, _deferredServerAPI, new DeferredPromise());
|
|
28
|
+
__privateAdd(this, _pendingRequests, /* @__PURE__ */ new Map());
|
|
29
|
+
__privateAdd(this, _viewports, /* @__PURE__ */ new Map());
|
|
30
|
+
// #worker?: Worker;
|
|
31
|
+
__privateAdd(this, _worker);
|
|
32
|
+
__publicField(this, "handleMessageFromWorker", (message) => {
|
|
33
|
+
if (shouldMessageBeRoutedToDataSource(message)) {
|
|
34
|
+
const viewport = __privateGet(this, _viewports).get(message.clientViewportId);
|
|
35
|
+
if (viewport) {
|
|
36
|
+
viewport.postMessageToClientDataSource(message);
|
|
37
|
+
} else {
|
|
38
|
+
console.error(
|
|
39
|
+
`[ConnectionManager] ${message.type} message received, viewport not found`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
} else if (isWebSocketConnectionMessage(message)) {
|
|
43
|
+
__privateSet(this, _connectionState, message);
|
|
44
|
+
this.emit("connection-status", message);
|
|
45
|
+
} else if (isConnectionQualityMetrics(message)) {
|
|
46
|
+
this.emit("connection-metrics", message);
|
|
47
|
+
} else if (isRequestResponse(message)) {
|
|
48
|
+
const { requestId } = message;
|
|
49
|
+
if (__privateGet(this, _pendingRequests).has(requestId)) {
|
|
50
|
+
const { resolve } = __privateGet(this, _pendingRequests).get(requestId);
|
|
51
|
+
__privateGet(this, _pendingRequests).delete(requestId);
|
|
52
|
+
const { requestId: _, ...messageWithoutRequestId } = message;
|
|
53
|
+
if (messageHasResult(message)) {
|
|
54
|
+
resolve(message.result);
|
|
55
|
+
} else if (message.type === "VP_EDIT_RPC_RESPONSE" || message.type === "VP_EDIT_RPC_REJECT") {
|
|
56
|
+
resolve(message);
|
|
57
|
+
} else if (isTableSchemaMessage(message)) {
|
|
58
|
+
resolve(message.tableSchema);
|
|
59
|
+
} else {
|
|
60
|
+
resolve(messageWithoutRequestId);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
console.warn(
|
|
64
|
+
"%cConnectionManager Unexpected message from the worker",
|
|
65
|
+
"color:red;font-weight:bold;"
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
__publicField(this, "connectedServerAPI", {
|
|
71
|
+
subscribe: (message, callback) => {
|
|
72
|
+
if (__privateGet(this, _viewports).get(message.viewport)) {
|
|
73
|
+
throw Error(
|
|
74
|
+
`ConnectionManager attempting to subscribe with an existing viewport id`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
__privateGet(this, _viewports).set(message.viewport, {
|
|
78
|
+
status: "subscribing",
|
|
79
|
+
request: message,
|
|
80
|
+
postMessageToClientDataSource: callback
|
|
81
|
+
});
|
|
82
|
+
__privateGet(this, _worker).send({ type: "subscribe", ...message });
|
|
83
|
+
},
|
|
84
|
+
unsubscribe: (viewport) => {
|
|
85
|
+
__privateGet(this, _worker).send({ type: "unsubscribe", viewport });
|
|
86
|
+
},
|
|
87
|
+
send: (message) => {
|
|
88
|
+
__privateGet(this, _worker).send(message);
|
|
89
|
+
},
|
|
90
|
+
destroy: (viewportId) => {
|
|
91
|
+
if (viewportId && __privateGet(this, _viewports).has(viewportId)) {
|
|
92
|
+
__privateGet(this, _viewports).delete(viewportId);
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
rpcCall: async (message) => this.asyncRequest(message),
|
|
96
|
+
getTableList: async () => this.asyncRequest({ type: "GET_TABLE_LIST" }),
|
|
97
|
+
getTableSchema: async (table) => this.asyncRequest({
|
|
98
|
+
type: "GET_TABLE_META",
|
|
99
|
+
table
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
__publicField(this, "asyncRequest", (msg) => {
|
|
103
|
+
const requestId = uuid();
|
|
104
|
+
__privateGet(this, _worker).send({
|
|
105
|
+
requestId,
|
|
106
|
+
...msg
|
|
107
|
+
});
|
|
108
|
+
return new Promise((resolve, reject) => {
|
|
109
|
+
__privateGet(this, _pendingRequests).set(requestId, { resolve, reject });
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
__privateSet(this, _worker, new DedicatedWorker(this.handleMessageFromWorker));
|
|
113
|
+
}
|
|
114
|
+
static get instance() {
|
|
115
|
+
if (!__privateGet(_ConnectionManager, _instance)) {
|
|
116
|
+
__privateSet(_ConnectionManager, _instance, new _ConnectionManager());
|
|
117
|
+
}
|
|
118
|
+
return __privateGet(_ConnectionManager, _instance);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Open a connection to the VuuServer. This method opens the websocket connection
|
|
122
|
+
* and logs in. It can be called from whichever client code has access to the auth
|
|
123
|
+
* token (eg. the login page, or just a hardcoded login script in a sample).
|
|
124
|
+
* This will unblock any DataSources which may have already tried to subscribe to data,
|
|
125
|
+
* but lacked access to the auth token.
|
|
126
|
+
*
|
|
127
|
+
* @param serverUrl
|
|
128
|
+
* @param token
|
|
129
|
+
*/
|
|
130
|
+
async connect(options) {
|
|
131
|
+
const result = await __privateGet(this, _worker).connect(options);
|
|
132
|
+
if (result === "connected") {
|
|
133
|
+
__privateGet(this, _deferredServerAPI).resolve(this.connectedServerAPI);
|
|
134
|
+
}
|
|
135
|
+
return result;
|
|
136
|
+
}
|
|
137
|
+
get connectionStatus() {
|
|
138
|
+
return __privateGet(this, _connectionState).connectionStatus;
|
|
139
|
+
}
|
|
140
|
+
get serverAPI() {
|
|
141
|
+
return __privateGet(this, _deferredServerAPI).promise;
|
|
142
|
+
}
|
|
143
|
+
async disconnect() {
|
|
144
|
+
try {
|
|
145
|
+
__privateGet(this, _worker).send({ type: "disconnect" });
|
|
146
|
+
__privateSet(this, _deferredServerAPI, new DeferredPromise());
|
|
147
|
+
return "disconnected";
|
|
148
|
+
} catch (err) {
|
|
149
|
+
return "rejected";
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
destroy() {
|
|
153
|
+
__privateGet(this, _worker).terminate();
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
_connectionState = new WeakMap();
|
|
157
|
+
_instance = new WeakMap();
|
|
158
|
+
_deferredServerAPI = new WeakMap();
|
|
159
|
+
_pendingRequests = new WeakMap();
|
|
160
|
+
_viewports = new WeakMap();
|
|
161
|
+
_worker = new WeakMap();
|
|
162
|
+
__privateAdd(_ConnectionManager, _instance);
|
|
163
|
+
let ConnectionManager = _ConnectionManager;
|
|
164
|
+
var ConnectionManager$1 = ConnectionManager.instance;
|
|
165
|
+
|
|
166
|
+
export { ConnectionManager$1 as default };
|
|
167
|
+
//# sourceMappingURL=ConnectionManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConnectionManager.js","sources":["../src/ConnectionManager.ts"],"sourcesContent":["import {\n ConnectOptions,\n DataSourceCallbackMessage,\n ServerAPI,\n ServerProxySubscribeMessage,\n TableSchema,\n VuuUIMessageIn,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\n VuuRpcViewportRequest,\n VuuTableList,\n VuuTableListRequest,\n VuuTableMetaRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DeferredPromise,\n EventEmitter,\n isConnectionQualityMetrics,\n isRequestResponse,\n isTableSchemaMessage,\n messageHasResult,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n WebSocketConnectionEvents,\n WebSocketConnectionState,\n isWebSocketConnectionMessage,\n} from \"./WebSocketConnection\";\nimport { DedicatedWorker } from \"./DedicatedWorker\";\nimport { shouldMessageBeRoutedToDataSource } from \"./data-source\";\n\nimport { ConnectionQualityMetrics } from \"@vuu-ui/vuu-data-types\";\n\nexport type PostMessageToClientCallback = (\n msg: DataSourceCallbackMessage,\n) => void;\n\nexport type ConnectionEvents = WebSocketConnectionEvents & {\n \"connection-metrics\": (message: ConnectionQualityMetrics) => void;\n};\n\ntype RegisteredViewport = {\n postMessageToClientDataSource: PostMessageToClientCallback;\n request: ServerProxySubscribeMessage;\n status: \"subscribing\";\n};\n\nclass ConnectionManager extends EventEmitter<ConnectionEvents> {\n #connectionState: WebSocketConnectionState = {\n connectionPhase: \"connecting\",\n connectionStatus: \"closed\",\n retryAttemptsTotal: -1,\n retryAttemptsRemaining: -1,\n secondsToNextRetry: -1,\n };\n static #instance: ConnectionManager;\n #deferredServerAPI = new DeferredPromise<ServerAPI>();\n #pendingRequests = new Map();\n #viewports = new Map<string, RegisteredViewport>();\n // #worker?: Worker;\n #worker: DedicatedWorker;\n\n private constructor() {\n super();\n this.#worker = new DedicatedWorker(this.handleMessageFromWorker);\n }\n\n public static get instance(): ConnectionManager {\n if (!ConnectionManager.#instance) {\n ConnectionManager.#instance = new ConnectionManager();\n }\n return ConnectionManager.#instance;\n }\n\n /**\n * Open a connection to the VuuServer. This method opens the websocket connection\n * and logs in. It can be called from whichever client code has access to the auth\n * token (eg. the login page, or just a hardcoded login script in a sample).\n * This will unblock any DataSources which may have already tried to subscribe to data,\n * but lacked access to the auth token.\n *\n * @param serverUrl\n * @param token\n */\n async connect(options: ConnectOptions) {\n const result = await this.#worker.connect(options);\n if (result === \"connected\") {\n this.#deferredServerAPI.resolve(this.connectedServerAPI);\n }\n return result;\n }\n\n private handleMessageFromWorker = (\n message: VuuUIMessageIn | DataSourceCallbackMessage,\n ) => {\n if (shouldMessageBeRoutedToDataSource(message)) {\n const viewport = this.#viewports.get(message.clientViewportId);\n if (viewport) {\n viewport.postMessageToClientDataSource(message);\n } else {\n console.error(\n `[ConnectionManager] ${message.type} message received, viewport not found`,\n );\n }\n } else if (isWebSocketConnectionMessage(message)) {\n this.#connectionState = message;\n this.emit(\"connection-status\", message);\n } else if (isConnectionQualityMetrics(message)) {\n this.emit(\"connection-metrics\", message);\n } else if (isRequestResponse(message)) {\n const { requestId } = message;\n if (this.#pendingRequests.has(requestId)) {\n const { resolve } = this.#pendingRequests.get(requestId);\n this.#pendingRequests.delete(requestId);\n const { requestId: _, ...messageWithoutRequestId } = message;\n\n if (messageHasResult(message)) {\n resolve(message.result);\n } else if (\n message.type === \"VP_EDIT_RPC_RESPONSE\" ||\n message.type === \"VP_EDIT_RPC_REJECT\"\n ) {\n resolve(message);\n } else if (isTableSchemaMessage(message)) {\n resolve(message.tableSchema);\n } else {\n resolve(messageWithoutRequestId);\n }\n } else {\n console.warn(\n \"%cConnectionManager Unexpected message from the worker\",\n \"color:red;font-weight:bold;\",\n );\n }\n }\n };\n\n get connectionStatus() {\n return this.#connectionState.connectionStatus;\n }\n\n get serverAPI() {\n return this.#deferredServerAPI.promise;\n }\n\n private connectedServerAPI: ServerAPI = {\n subscribe: (message, callback) => {\n if (this.#viewports.get(message.viewport)) {\n throw Error(\n `ConnectionManager attempting to subscribe with an existing viewport id`,\n );\n }\n // TODO we never use this status\n this.#viewports.set(message.viewport, {\n status: \"subscribing\",\n request: message,\n postMessageToClientDataSource: callback,\n });\n this.#worker.send({ type: \"subscribe\", ...message });\n },\n\n unsubscribe: (viewport) => {\n this.#worker.send({ type: \"unsubscribe\", viewport });\n },\n\n send: (message) => {\n this.#worker.send(message);\n },\n\n destroy: (viewportId?: string) => {\n if (viewportId && this.#viewports.has(viewportId)) {\n this.#viewports.delete(viewportId);\n }\n },\n\n rpcCall: async <T = unknown>(\n message:\n | VuuRpcServiceRequest\n | VuuRpcMenuRequest\n | VuuRpcViewportRequest\n | VuuCreateVisualLink\n | VuuRemoveVisualLink,\n ) => this.asyncRequest<T>(message),\n\n getTableList: async () =>\n this.asyncRequest<VuuTableList>({ type: \"GET_TABLE_LIST\" }),\n\n getTableSchema: async (table) =>\n this.asyncRequest<TableSchema>({\n type: \"GET_TABLE_META\",\n table,\n }),\n };\n\n private asyncRequest = <T = unknown>(\n msg:\n | VuuRpcServiceRequest\n | VuuRpcMenuRequest\n | VuuTableListRequest\n | VuuTableMetaRequest\n | VuuRpcViewportRequest\n | VuuCreateVisualLink\n | VuuRemoveVisualLink,\n ): Promise<T> => {\n const requestId = uuid();\n this.#worker.send({\n requestId,\n ...msg,\n });\n return new Promise((resolve, reject) => {\n this.#pendingRequests.set(requestId, { resolve, reject });\n });\n };\n\n async disconnect() {\n try {\n this.#worker.send({ type: \"disconnect\" });\n this.#deferredServerAPI = new DeferredPromise<ServerAPI>();\n return \"disconnected\";\n } catch (err: unknown) {\n return \"rejected\";\n }\n }\n\n destroy() {\n this.#worker.terminate();\n }\n}\n\nexport default ConnectionManager.instance;\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getLoggingConfigForWorker, DeferredPromise } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import { workerSourceCode } from './inlined-worker.js';
|
|
3
|
+
|
|
4
|
+
var __typeError = (msg) => {
|
|
5
|
+
throw TypeError(msg);
|
|
6
|
+
};
|
|
7
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
8
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
9
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
11
|
+
var _deferredConnection, _worker;
|
|
12
|
+
const workerBlob = new Blob([getLoggingConfigForWorker() + workerSourceCode], {
|
|
13
|
+
type: "text/javascript"
|
|
14
|
+
});
|
|
15
|
+
const workerBlobUrl = URL.createObjectURL(workerBlob);
|
|
16
|
+
class DedicatedWorker {
|
|
17
|
+
constructor(onMessage) {
|
|
18
|
+
__privateAdd(this, _deferredConnection);
|
|
19
|
+
__privateAdd(this, _worker);
|
|
20
|
+
const deferredWorker = new DeferredPromise();
|
|
21
|
+
__privateSet(this, _worker, deferredWorker.promise);
|
|
22
|
+
const worker = new Worker(workerBlobUrl);
|
|
23
|
+
const timer = window.setTimeout(() => {
|
|
24
|
+
console.warn("timed out waiting for worker to load");
|
|
25
|
+
}, 1e3);
|
|
26
|
+
worker.onmessage = (msg) => {
|
|
27
|
+
const { data: message } = msg;
|
|
28
|
+
if (message.type === "ready") {
|
|
29
|
+
window.clearTimeout(timer);
|
|
30
|
+
deferredWorker.resolve(worker);
|
|
31
|
+
} else if (message.type === "connected") {
|
|
32
|
+
__privateGet(this, _deferredConnection)?.resolve("connected");
|
|
33
|
+
} else if (message.type === "connection-failed") {
|
|
34
|
+
__privateGet(this, _deferredConnection)?.resolve("rejected");
|
|
35
|
+
} else {
|
|
36
|
+
onMessage(message);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async connect(options) {
|
|
41
|
+
__privateSet(this, _deferredConnection, new DeferredPromise());
|
|
42
|
+
this.send({
|
|
43
|
+
...options,
|
|
44
|
+
type: "connect"
|
|
45
|
+
});
|
|
46
|
+
return __privateGet(this, _deferredConnection).promise;
|
|
47
|
+
}
|
|
48
|
+
async send(message) {
|
|
49
|
+
(await __privateGet(this, _worker)).postMessage(message);
|
|
50
|
+
}
|
|
51
|
+
async terminate() {
|
|
52
|
+
(await __privateGet(this, _worker)).terminate();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
_deferredConnection = new WeakMap();
|
|
56
|
+
_worker = new WeakMap();
|
|
57
|
+
|
|
58
|
+
export { DedicatedWorker };
|
|
59
|
+
//# sourceMappingURL=DedicatedWorker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DedicatedWorker.js","sources":["../src/DedicatedWorker.ts"],"sourcesContent":["import {\n ConnectOptions,\n VuuUIMessageIn,\n VuuUIMessageOut,\n WithRequestId,\n} from \"@vuu-ui/vuu-data-types\";\nimport { DeferredPromise, getLoggingConfigForWorker } from \"@vuu-ui/vuu-utils\";\n\n// Note: inlined-worker is a generated file, it must be built\nimport { workerSourceCode } from \"./inlined-worker\";\nimport {\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\n VuuRpcViewportRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nconst workerBlob = new Blob([getLoggingConfigForWorker() + workerSourceCode], {\n type: \"text/javascript\",\n});\nconst workerBlobUrl = URL.createObjectURL(workerBlob);\n\nexport class DedicatedWorker {\n #deferredConnection?: DeferredPromise<\n \"connected\" | \"reconnected\" | \"rejected\"\n >;\n #worker: Promise<Worker>;\n\n constructor(onMessage: (msg: VuuUIMessageIn) => void) {\n const deferredWorker = new DeferredPromise<Worker>();\n this.#worker = deferredWorker.promise;\n const worker = new Worker(workerBlobUrl);\n const timer: number | null = window.setTimeout(() => {\n console.warn(\"timed out waiting for worker to load\");\n }, 1000);\n worker.onmessage = (msg: MessageEvent<VuuUIMessageIn>) => {\n const { data: message } = msg;\n if (message.type === \"ready\") {\n window.clearTimeout(timer);\n deferredWorker.resolve(worker);\n } else if (message.type === \"connected\") {\n // how do we detect reconnected\n this.#deferredConnection?.resolve(\"connected\");\n } else if (message.type === \"connection-failed\") {\n this.#deferredConnection?.resolve(\"rejected\");\n // this.#deferredConnection?.reject(message.reason);\n } else {\n onMessage(message);\n }\n };\n }\n\n async connect(options: ConnectOptions) {\n this.#deferredConnection = new DeferredPromise<\n \"connected\" | \"reconnected\" | \"rejected\"\n >();\n this.send({\n ...options,\n type: \"connect\",\n });\n return this.#deferredConnection.promise;\n }\n\n async send(\n message:\n | VuuUIMessageOut\n | WithRequestId<\n | VuuRpcViewportRequest\n | VuuCreateVisualLink\n | VuuRemoveVisualLink\n | VuuRpcServiceRequest\n | VuuRpcMenuRequest\n >,\n ) {\n (await this.#worker).postMessage(message);\n }\n\n async terminate() {\n (await this.#worker).terminate();\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAAA,IAAA,mBAAA,EAAA,OAAA;AAkBA,MAAM,aAAa,IAAI,IAAA,CAAK,CAAC,yBAA0B,EAAA,GAAI,gBAAgB,CAAG,EAAA;AAAA,EAC5E,IAAM,EAAA;AACR,CAAC,CAAA;AACD,MAAM,aAAA,GAAgB,GAAI,CAAA,eAAA,CAAgB,UAAU,CAAA;AAE7C,MAAM,eAAgB,CAAA;AAAA,EAM3B,YAAY,SAA0C,EAAA;AALtD,IAAA,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;AAGA,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAGE,IAAM,MAAA,cAAA,GAAiB,IAAI,eAAwB,EAAA;AACnD,IAAA,YAAA,CAAA,IAAA,EAAK,SAAU,cAAe,CAAA,OAAA,CAAA;AAC9B,IAAM,MAAA,MAAA,GAAS,IAAI,MAAA,CAAO,aAAa,CAAA;AACvC,IAAM,MAAA,KAAA,GAAuB,MAAO,CAAA,UAAA,CAAW,MAAM;AACnD,MAAA,OAAA,CAAQ,KAAK,sCAAsC,CAAA;AAAA,OAClD,GAAI,CAAA;AACP,IAAO,MAAA,CAAA,SAAA,GAAY,CAAC,GAAsC,KAAA;AACxD,MAAM,MAAA,EAAE,IAAM,EAAA,OAAA,EAAY,GAAA,GAAA;AAC1B,MAAI,IAAA,OAAA,CAAQ,SAAS,OAAS,EAAA;AAC5B,QAAA,MAAA,CAAO,aAAa,KAAK,CAAA;AACzB,QAAA,cAAA,CAAe,QAAQ,MAAM,CAAA;AAAA,OAC/B,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,WAAa,EAAA;AAEvC,QAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,EAAqB,QAAQ,WAAW,CAAA;AAAA,OAC/C,MAAA,IAAW,OAAQ,CAAA,IAAA,KAAS,mBAAqB,EAAA;AAC/C,QAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,EAAqB,QAAQ,UAAU,CAAA;AAAA,OAEvC,MAAA;AACL,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA;AACnB,KACF;AAAA;AACF,EAEA,MAAM,QAAQ,OAAyB,EAAA;AACrC,IAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAsB,IAAI,eAE7B,EAAA,CAAA;AACF,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACR,GAAG,OAAA;AAAA,MACH,IAAM,EAAA;AAAA,KACP,CAAA;AACD,IAAA,OAAO,mBAAK,mBAAoB,CAAA,CAAA,OAAA;AAAA;AAClC,EAEA,MAAM,KACJ,OASA,EAAA;AACA,IAAA,CAAC,MAAM,YAAA,CAAA,IAAA,EAAK,OAAS,CAAA,EAAA,WAAA,CAAY,OAAO,CAAA;AAAA;AAC1C,EAEA,MAAM,SAAY,GAAA;AAChB,IAAC,CAAA,MAAM,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,EAAS,SAAU,EAAA;AAAA;AAEnC;AAzDE,mBAAA,GAAA,IAAA,OAAA,EAAA;AAGA,OAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|