@vuu-ui/vuu-data-remote 0.13.105 → 0.13.107
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 +23 -24
- package/cjs/ConnectionManager.js.map +1 -1
- package/cjs/DedicatedWorker.js +1 -6
- package/cjs/DedicatedWorker.js.map +1 -1
- package/cjs/LostConnectionHandler.js +80 -0
- package/cjs/LostConnectionHandler.js.map +1 -0
- package/cjs/VuuAuthProvider.js +87 -0
- package/cjs/VuuAuthProvider.js.map +1 -0
- package/cjs/VuuAuthenticator.js +50 -0
- package/cjs/VuuAuthenticator.js.map +1 -0
- package/cjs/WebSocketConnection.js +11 -17
- package/cjs/WebSocketConnection.js.map +1 -1
- package/cjs/authenticate.js +15 -0
- package/cjs/authenticate.js.map +1 -1
- package/cjs/index.js +9 -0
- package/cjs/index.js.map +1 -1
- package/cjs/inlined-worker.js +259 -343
- package/cjs/inlined-worker.js.map +1 -1
- package/esm/ConnectionManager.js +25 -26
- package/esm/ConnectionManager.js.map +1 -1
- package/esm/DedicatedWorker.js +1 -6
- package/esm/DedicatedWorker.js.map +1 -1
- package/esm/LostConnectionHandler.js +76 -0
- package/esm/LostConnectionHandler.js.map +1 -0
- package/esm/VuuAuthProvider.js +85 -0
- package/esm/VuuAuthProvider.js.map +1 -0
- package/esm/VuuAuthenticator.js +47 -0
- package/esm/VuuAuthenticator.js.map +1 -0
- package/esm/WebSocketConnection.js +11 -17
- package/esm/WebSocketConnection.js.map +1 -1
- package/esm/authenticate.js +15 -1
- package/esm/authenticate.js.map +1 -1
- package/esm/index.js +4 -1
- package/esm/index.js.map +1 -1
- package/esm/inlined-worker.js +259 -343
- package/esm/inlined-worker.js.map +1 -1
- package/package.json +7 -7
- package/types/ConnectionManager.d.ts +5 -6
- package/types/DedicatedWorker.d.ts +1 -2
- package/types/LostConnectionHandler.d.ts +28 -0
- package/types/VuuAuthProvider.d.ts +38 -0
- package/types/VuuAuthenticator.d.ts +21 -0
- package/types/WebSocketConnection.d.ts +19 -38
- package/types/authenticate.d.ts +4 -0
- package/types/index.d.ts +5 -2
- package/types/inlined-worker.d.ts +1 -1
- package/types/server-proxy/server-proxy.d.ts +2 -2
package/cjs/ConnectionManager.js
CHANGED
|
@@ -15,17 +15,11 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
15
15
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
16
16
|
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);
|
|
17
17
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
18
|
-
var
|
|
18
|
+
var _instance, _connectionStatus, _deferredServerAPI, _pendingRequests, _viewports, _worker;
|
|
19
19
|
const _ConnectionManager = class _ConnectionManager extends vuuUtils.EventEmitter {
|
|
20
20
|
constructor() {
|
|
21
21
|
super();
|
|
22
|
-
__privateAdd(this,
|
|
23
|
-
connectionPhase: "connecting",
|
|
24
|
-
connectionStatus: "closed",
|
|
25
|
-
retryAttemptsTotal: -1,
|
|
26
|
-
retryAttemptsRemaining: -1,
|
|
27
|
-
secondsToNextRetry: -1
|
|
28
|
-
});
|
|
22
|
+
__privateAdd(this, _connectionStatus, "closed");
|
|
29
23
|
__privateAdd(this, _deferredServerAPI, new vuuUtils.DeferredPromise());
|
|
30
24
|
__privateAdd(this, _pendingRequests, /* @__PURE__ */ new Map());
|
|
31
25
|
__privateAdd(this, _viewports, /* @__PURE__ */ new Map());
|
|
@@ -41,12 +35,8 @@ const _ConnectionManager = class _ConnectionManager extends vuuUtils.EventEmitte
|
|
|
41
35
|
`[ConnectionManager] ${message.type} message received, viewport not found`
|
|
42
36
|
);
|
|
43
37
|
}
|
|
44
|
-
} else if (message
|
|
45
|
-
this
|
|
46
|
-
} else if (vuuUtils.isLoginResponse(message)) {
|
|
47
|
-
this.emit("session-status", message);
|
|
48
|
-
} else if (WebSocketConnection.isWebSocketConnectionMessage(message)) {
|
|
49
|
-
__privateSet(this, _connectionState, message);
|
|
38
|
+
} else if (WebSocketConnection.isWebSocketConnectionStatus(message)) {
|
|
39
|
+
__privateSet(this, _connectionStatus, message);
|
|
50
40
|
this.emit("connection-status", message);
|
|
51
41
|
} else if (vuuUtils.isConnectionQualityMetrics(message)) {
|
|
52
42
|
this.emit("connection-metrics", message);
|
|
@@ -122,6 +112,12 @@ const _ConnectionManager = class _ConnectionManager extends vuuUtils.EventEmitte
|
|
|
122
112
|
}
|
|
123
113
|
return __privateGet(_ConnectionManager, _instance);
|
|
124
114
|
}
|
|
115
|
+
get connectionStatus() {
|
|
116
|
+
return __privateGet(this, _connectionStatus);
|
|
117
|
+
}
|
|
118
|
+
get connected() {
|
|
119
|
+
return __privateGet(this, _connectionStatus) === "connected" || __privateGet(this, _connectionStatus) === "reconnected";
|
|
120
|
+
}
|
|
125
121
|
/**
|
|
126
122
|
* Open a connection to the VuuServer. This method opens the websocket connection
|
|
127
123
|
* and logs in. It can be called from whichever client code has access to the auth
|
|
@@ -133,16 +129,19 @@ const _ConnectionManager = class _ConnectionManager extends vuuUtils.EventEmitte
|
|
|
133
129
|
* @param token
|
|
134
130
|
*/
|
|
135
131
|
async connect(options, throwOnRejected = false) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
try {
|
|
133
|
+
const result = await __privateGet(this, _worker).connect(options);
|
|
134
|
+
if (result === "connected") {
|
|
135
|
+
__privateGet(this, _deferredServerAPI).resolve(this.connectedServerAPI);
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
138
|
+
} catch (err) {
|
|
139
|
+
if (throwOnRejected) {
|
|
140
|
+
throw err;
|
|
141
|
+
} else {
|
|
142
|
+
return "connection-failed";
|
|
143
|
+
}
|
|
141
144
|
}
|
|
142
|
-
return result;
|
|
143
|
-
}
|
|
144
|
-
get connectionStatus() {
|
|
145
|
-
return __privateGet(this, _connectionState).connectionStatus;
|
|
146
145
|
}
|
|
147
146
|
get serverAPI() {
|
|
148
147
|
return __privateGet(this, _deferredServerAPI).promise;
|
|
@@ -160,8 +159,8 @@ const _ConnectionManager = class _ConnectionManager extends vuuUtils.EventEmitte
|
|
|
160
159
|
__privateGet(this, _worker).terminate();
|
|
161
160
|
}
|
|
162
161
|
};
|
|
163
|
-
_connectionState = new WeakMap();
|
|
164
162
|
_instance = new WeakMap();
|
|
163
|
+
_connectionStatus = new WeakMap();
|
|
165
164
|
_deferredServerAPI = new WeakMap();
|
|
166
165
|
_pendingRequests = new WeakMap();
|
|
167
166
|
_viewports = new WeakMap();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionManager.js","sources":["../../../packages/vuu-data-remote/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 SelectRequest,\n SelectResponse,\n VuuCreateVisualLink,\n VuuLoginResponse,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\n VuuTableList,\n VuuTableListRequest,\n VuuTableMetaRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DeferredPromise,\n EventEmitter,\n isConnectionQualityMetrics,\n isLoginResponse,\n isRequestResponse,\n isTableSchemaMessage,\n messageHasResult,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n WebSocketCloseMessage,\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 \"session-status\": (\n loginResponse: VuuLoginResponse | WebSocketCloseMessage,\n ) => 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, throwOnRejected = false) {\n const result = await this.#worker.connect(options);\n if (result === \"connected\") {\n this.#deferredServerAPI.resolve(this.connectedServerAPI);\n } else if (result === \"rejected\" && throwOnRejected) {\n throw Error(\"[ConnectionManager] connection rejected\");\n }\n return result;\n }\n\n private handleMessageFromWorker = (\n message: VuuUIMessageIn | DataSourceCallbackMessage | WebSocketCloseMessage,\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 (message.type === \"websocket-closed\") {\n this.emit(\"session-status\", message);\n } else if (isLoginResponse(message)) {\n this.emit(\"session-status\", message);\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 (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 | VuuCreateVisualLink\n | VuuRemoveVisualLink,\n ) => this.asyncRequest<T>(message),\n\n select: async (selectRequest: SelectRequest) =>\n this.asyncRequest<SelectResponse>(selectRequest),\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 | VuuCreateVisualLink\n | VuuRemoveVisualLink\n | SelectRequest,\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":["EventEmitter","DeferredPromise","shouldMessageBeRoutedToDataSource","isLoginResponse","isWebSocketConnectionMessage","isConnectionQualityMetrics","isRequestResponse","messageHasResult","isTableSchemaMessage","uuid","DedicatedWorker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConnectionManager.js","sources":["../../../packages/vuu-data-remote/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 SelectRequest,\n SelectResponse,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\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 ConnectionStatus,\n WebSocketConnectionEvents,\n isWebSocketConnectionStatus,\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 static #instance: ConnectionManager;\n #connectionStatus: ConnectionStatus = \"closed\";\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 get connectionStatus() {\n return this.#connectionStatus;\n }\n\n get connected() {\n return (\n this.#connectionStatus === \"connected\" ||\n this.#connectionStatus === \"reconnected\"\n );\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, throwOnRejected = false) {\n try {\n const result = await this.#worker.connect(options);\n if (result === \"connected\") {\n this.#deferredServerAPI.resolve(this.connectedServerAPI);\n }\n return result;\n } catch (err: unknown) {\n if (throwOnRejected) {\n throw err;\n } else {\n return \"connection-failed\";\n }\n }\n }\n\n private handleMessageFromWorker = (\n message: VuuUIMessageIn | DataSourceCallbackMessage | ConnectionStatus,\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 (isWebSocketConnectionStatus(message)) {\n this.#connectionStatus = 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 (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 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 | VuuCreateVisualLink\n | VuuRemoveVisualLink,\n ) => this.asyncRequest<T>(message),\n\n select: async (selectRequest: SelectRequest) =>\n this.asyncRequest<SelectResponse>(selectRequest),\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 | VuuCreateVisualLink\n | VuuRemoveVisualLink\n | SelectRequest,\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":["EventEmitter","DeferredPromise","shouldMessageBeRoutedToDataSource","isWebSocketConnectionStatus","isConnectionQualityMetrics","isRequestResponse","messageHasResult","isTableSchemaMessage","uuid","DedicatedWorker"],"mappings":"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"}
|
package/cjs/DedicatedWorker.js
CHANGED
|
@@ -33,12 +33,7 @@ class DedicatedWorker {
|
|
|
33
33
|
} else if (message.type === "connected") {
|
|
34
34
|
__privateGet(this, _deferredConnection)?.resolve("connected");
|
|
35
35
|
} else if (message.type === "connection-failed") {
|
|
36
|
-
__privateGet(this, _deferredConnection)?.
|
|
37
|
-
} else if (message.type === "websocket-closed") {
|
|
38
|
-
if (message.reason === "token-expired") {
|
|
39
|
-
console.log(`websocket closed ${message.reason}`);
|
|
40
|
-
onMessage(message);
|
|
41
|
-
}
|
|
36
|
+
__privateGet(this, _deferredConnection)?.reject(message.reason);
|
|
42
37
|
} else {
|
|
43
38
|
onMessage(message);
|
|
44
39
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DedicatedWorker.js","sources":["../../../packages/vuu-data-remote/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 SelectRequest,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\
|
|
1
|
+
{"version":3,"file":"DedicatedWorker.js","sources":["../../../packages/vuu-data-remote/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 SelectRequest,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcMenuRequest,\n VuuRpcServiceRequest,\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?.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 | VuuCreateVisualLink\n | VuuRemoveVisualLink\n | VuuRpcServiceRequest\n | VuuRpcMenuRequest\n | SelectRequest\n >,\n ) {\n (await this.#worker).postMessage(message);\n }\n\n async terminate() {\n (await this.#worker).terminate();\n }\n}\n"],"names":["getLoggingConfigForWorker","workerSourceCode","DeferredPromise"],"mappings":";;;;;;;;;;;;AAAA,IAAA,mBAAA,EAAA,OAAA;AAkBA,MAAM,aAAa,IAAI,IAAA,CAAK,CAACA,kCAA0B,EAAA,GAAIC,8BAAgB,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,IAAIC,wBAAwB,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,MAAO,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,OAC1C,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,IAAIA,wBAE7B,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;AAxDE,mBAAA,GAAA,IAAA,OAAA,EAAA;AAGA,OAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
+
class RetryOptionsImpl {
|
|
7
|
+
constructor(retryIntervals) {
|
|
8
|
+
this.retryIntervals = retryIntervals;
|
|
9
|
+
__publicField(this, "ind", 0);
|
|
10
|
+
console.log(`[RetryOptionsImpl] constructor`);
|
|
11
|
+
}
|
|
12
|
+
next() {
|
|
13
|
+
this.ind = Math.min(this.retryIntervals.length, this.ind + 1);
|
|
14
|
+
}
|
|
15
|
+
get remaining() {
|
|
16
|
+
return this.retryIntervals.length - this.ind;
|
|
17
|
+
}
|
|
18
|
+
get interval() {
|
|
19
|
+
if (this.ind === this.retryIntervals.length) {
|
|
20
|
+
return -1;
|
|
21
|
+
} else {
|
|
22
|
+
return this.retryIntervals[this.ind] * 1e3;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function RetryOptions(retryIntervals) {
|
|
27
|
+
if (Array.isArray(retryIntervals)) {
|
|
28
|
+
return new RetryOptionsImpl(retryIntervals);
|
|
29
|
+
} else {
|
|
30
|
+
throw Error("[lostConnectionHandler] RetryOptions, invalid retryIntervals");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const defaultRetryIntervals = [1, 2, 3, 5, 10, 30, 60, 120];
|
|
34
|
+
class RetryGenerator {
|
|
35
|
+
constructor(vuuAuth, options) {
|
|
36
|
+
this.vuuAuth = vuuAuth;
|
|
37
|
+
__publicField(this, "options");
|
|
38
|
+
this.options = options;
|
|
39
|
+
console.log("[RetryGenerator] constructor");
|
|
40
|
+
}
|
|
41
|
+
async *[Symbol.asyncIterator]() {
|
|
42
|
+
let connected = false;
|
|
43
|
+
do {
|
|
44
|
+
await new Promise(
|
|
45
|
+
(resolve) => setTimeout(resolve, this.options.interval)
|
|
46
|
+
);
|
|
47
|
+
try {
|
|
48
|
+
await this.vuuAuth.login();
|
|
49
|
+
connected = true;
|
|
50
|
+
yield "connected";
|
|
51
|
+
} catch (err) {
|
|
52
|
+
}
|
|
53
|
+
this.options.next();
|
|
54
|
+
} while (!connected && this.options.interval !== -1);
|
|
55
|
+
if (connected) {
|
|
56
|
+
return;
|
|
57
|
+
} else {
|
|
58
|
+
yield "connection-failed";
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class LostConnectionHandler {
|
|
63
|
+
constructor(vuuAuth, retryIntervals = defaultRetryIntervals) {
|
|
64
|
+
this.vuuAuth = vuuAuth;
|
|
65
|
+
this.retryIntervals = retryIntervals;
|
|
66
|
+
}
|
|
67
|
+
async reconnect() {
|
|
68
|
+
for await (const result of new RetryGenerator(
|
|
69
|
+
this.vuuAuth,
|
|
70
|
+
RetryOptions(this.retryIntervals)
|
|
71
|
+
)) {
|
|
72
|
+
console.log(` ... async iterator result = ${result}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
exports.LostConnectionHandler = LostConnectionHandler;
|
|
78
|
+
exports.RetryGenerator = RetryGenerator;
|
|
79
|
+
exports.RetryOptions = RetryOptions;
|
|
80
|
+
//# sourceMappingURL=LostConnectionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LostConnectionHandler.js","sources":["../../../packages/vuu-data-remote/src/LostConnectionHandler.ts"],"sourcesContent":["import { VuuAuthenticator } from \"./VuuAuthenticator\";\n\ninterface RetryOptions {\n interval: number;\n next: () => void;\n remaining: number;\n}\n\nclass RetryOptionsImpl implements RetryOptions {\n private ind = 0;\n constructor(private retryIntervals: number[]) {\n console.log(`[RetryOptionsImpl] constructor`);\n }\n next() {\n this.ind = Math.min(this.retryIntervals.length, this.ind + 1);\n }\n get remaining() {\n return this.retryIntervals.length - this.ind;\n }\n get interval() {\n if (this.ind === this.retryIntervals.length) {\n return -1;\n } else {\n return this.retryIntervals[this.ind] * 1000;\n }\n }\n}\n\nexport function RetryOptions(retryIntervals: number[]) {\n if (Array.isArray(retryIntervals)) {\n return new RetryOptionsImpl(retryIntervals);\n } else {\n throw Error(\"[lostConnectionHandler] RetryOptions, invalid retryIntervals\");\n }\n}\n\nconst defaultRetryIntervals = [1, 2, 3, 5, 10, 30, 60, 120];\n\nexport class RetryGenerator {\n private options: RetryOptions;\n\n constructor(\n private vuuAuth: VuuAuthenticator,\n options: RetryOptions,\n ) {\n this.options = options;\n console.log(\"[RetryGenerator] constructor\");\n }\n\n async *[Symbol.asyncIterator](): AsyncGenerator {\n let connected = false;\n do {\n await new Promise((resolve) =>\n setTimeout(resolve, this.options.interval),\n );\n try {\n await this.vuuAuth.login();\n connected = true;\n yield \"connected\";\n } catch (err) {\n // try again\n }\n this.options.next();\n } while (!connected && this.options.interval !== -1);\n if (connected) {\n return;\n } else {\n yield \"connection-failed\";\n }\n }\n}\n\nexport class LostConnectionHandler {\n constructor(\n private vuuAuth: VuuAuthenticator,\n private retryIntervals = defaultRetryIntervals,\n ) {}\n async reconnect() {\n for await (const result of new RetryGenerator(\n this.vuuAuth,\n RetryOptions(this.retryIntervals),\n )) {\n console.log(` ... async iterator result = ${result}`);\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAQA,MAAM,gBAAyC,CAAA;AAAA,EAE7C,YAAoB,cAA0B,EAAA;AAA1B,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AADpB,IAAA,aAAA,CAAA,IAAA,EAAQ,KAAM,EAAA,CAAA,CAAA;AAEZ,IAAA,OAAA,CAAQ,IAAI,CAAgC,8BAAA,CAAA,CAAA;AAAA;AAC9C,EACA,IAAO,GAAA;AACL,IAAK,IAAA,CAAA,GAAA,GAAM,KAAK,GAAI,CAAA,IAAA,CAAK,eAAe,MAAQ,EAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA;AAC9D,EACA,IAAI,SAAY,GAAA;AACd,IAAO,OAAA,IAAA,CAAK,cAAe,CAAA,MAAA,GAAS,IAAK,CAAA,GAAA;AAAA;AAC3C,EACA,IAAI,QAAW,GAAA;AACb,IAAA,IAAI,IAAK,CAAA,GAAA,KAAQ,IAAK,CAAA,cAAA,CAAe,MAAQ,EAAA;AAC3C,MAAO,OAAA,CAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,OAAO,IAAK,CAAA,cAAA,CAAe,IAAK,CAAA,GAAG,CAAI,GAAA,GAAA;AAAA;AACzC;AAEJ;AAEO,SAAS,aAAa,cAA0B,EAAA;AACrD,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,cAAc,CAAG,EAAA;AACjC,IAAO,OAAA,IAAI,iBAAiB,cAAc,CAAA;AAAA,GACrC,MAAA;AACL,IAAA,MAAM,MAAM,8DAA8D,CAAA;AAAA;AAE9E;AAEA,MAAM,qBAAA,GAAwB,CAAC,CAAG,EAAA,CAAA,EAAG,GAAG,CAAG,EAAA,EAAA,EAAI,EAAI,EAAA,EAAA,EAAI,GAAG,CAAA;AAEnD,MAAM,cAAe,CAAA;AAAA,EAG1B,WAAA,CACU,SACR,OACA,EAAA;AAFQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAHV,IAAQ,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAMN,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA;AACf,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAAA;AAC5C,EAEA,QAAQ,MAAO,CAAA,aAAa,CAAoB,GAAA;AAC9C,IAAA,IAAI,SAAY,GAAA,KAAA;AAChB,IAAG,GAAA;AACD,MAAA,MAAM,IAAI,OAAA;AAAA,QAAQ,CAAC,OACjB,KAAA,UAAA,CAAW,OAAS,EAAA,IAAA,CAAK,QAAQ,QAAQ;AAAA,OAC3C;AACA,MAAI,IAAA;AACF,QAAM,MAAA,IAAA,CAAK,QAAQ,KAAM,EAAA;AACzB,QAAY,SAAA,GAAA,IAAA;AACZ,QAAM,MAAA,WAAA;AAAA,eACC,GAAK,EAAA;AAAA;AAGd,MAAA,IAAA,CAAK,QAAQ,IAAK,EAAA;AAAA,KACX,QAAA,CAAC,SAAa,IAAA,IAAA,CAAK,QAAQ,QAAa,KAAA,CAAA,CAAA;AACjD,IAAA,IAAI,SAAW,EAAA;AACb,MAAA;AAAA,KACK,MAAA;AACL,MAAM,MAAA,mBAAA;AAAA;AACR;AAEJ;AAEO,MAAM,qBAAsB,CAAA;AAAA,EACjC,WAAA,CACU,OACA,EAAA,cAAA,GAAiB,qBACzB,EAAA;AAFQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AAAA;AACP,EACH,MAAM,SAAY,GAAA;AAChB,IAAA,WAAA,MAAiB,UAAU,IAAI,cAAA;AAAA,MAC7B,IAAK,CAAA,OAAA;AAAA,MACL,YAAA,CAAa,KAAK,cAAc;AAAA,KAC/B,EAAA;AACD,MAAQ,OAAA,CAAA,GAAA,CAAI,CAAiC,8BAAA,EAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AACvD;AAEJ;;;;;;"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
+
var authenticate = require('./authenticate.js');
|
|
5
|
+
|
|
6
|
+
var __defProp = Object.defineProperty;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
|
|
9
|
+
class VuuAuthProvider {
|
|
10
|
+
constructor(authEndpoint) {
|
|
11
|
+
this.authEndpoint = authEndpoint;
|
|
12
|
+
__publicField(this, "login", async (username, password) => {
|
|
13
|
+
const date = /* @__PURE__ */ new Date();
|
|
14
|
+
const days = 1;
|
|
15
|
+
date.setTime(date.getTime() + days * 24 * 60 * 60 * 1e3);
|
|
16
|
+
if (username && password) {
|
|
17
|
+
const { token } = await this.getVuuTokenWithUsernameAndPassword(
|
|
18
|
+
username,
|
|
19
|
+
password
|
|
20
|
+
);
|
|
21
|
+
document.cookie = `vuu-auth-user=${username};expires=${date.toUTCString()};path=/`;
|
|
22
|
+
document.cookie = `vuu-auth-password=${password};expires=${date.toUTCString()};path=/`;
|
|
23
|
+
document.cookie = `vuu-auth-token=${token};expires=${date.toUTCString()};path=/`;
|
|
24
|
+
return this.redirectToApplication();
|
|
25
|
+
} else {
|
|
26
|
+
const userName = vuuUtils.getCookieValue("vuu-auth-user");
|
|
27
|
+
const password2 = vuuUtils.getCookieValue("vuu-auth-password");
|
|
28
|
+
if (userName && password2) {
|
|
29
|
+
const { authorizations, token } = await this.getVuuTokenWithUsernameAndPassword(userName, password2);
|
|
30
|
+
document.cookie = `vuu-auth-token=${token};expires=${date.toUTCString()};path=/`;
|
|
31
|
+
return {
|
|
32
|
+
authorizations,
|
|
33
|
+
user: {
|
|
34
|
+
userName
|
|
35
|
+
},
|
|
36
|
+
token
|
|
37
|
+
};
|
|
38
|
+
} else {
|
|
39
|
+
return this.redirectToLoginPage();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async getVuuTokenWithUsernameAndPassword(username, password) {
|
|
45
|
+
const response = await fetch(this.authEndpoint, {
|
|
46
|
+
method: "POST",
|
|
47
|
+
credentials: "include",
|
|
48
|
+
headers: {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
"access-control-allow-origin": location.host
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
username,
|
|
54
|
+
password
|
|
55
|
+
})
|
|
56
|
+
});
|
|
57
|
+
if (response.ok) {
|
|
58
|
+
const vuuAuthToken = response.headers.get("vuu-auth-token");
|
|
59
|
+
if (typeof vuuAuthToken === "string" && vuuAuthToken.length > 0) {
|
|
60
|
+
const { authorizations } = authenticate.parseVuuUserFromToken(vuuAuthToken);
|
|
61
|
+
return { authorizations, token: vuuAuthToken };
|
|
62
|
+
} else {
|
|
63
|
+
throw Error(`Authentication failed auth token not returned by server`);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
throw Error(`Authentication failed, ${response.status}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
clear() {
|
|
70
|
+
document.cookie = "vuu-auth-user= ; expires = Thu, 01 Jan 1970 00:00:00 GMT";
|
|
71
|
+
document.cookie = "vuu-auth-password= ; expires = Thu, 01 Jan 1970 00:00:00 GMT";
|
|
72
|
+
document.cookie = "vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT";
|
|
73
|
+
}
|
|
74
|
+
redirectToLoginPage() {
|
|
75
|
+
window.location.href = "login.html";
|
|
76
|
+
}
|
|
77
|
+
redirectToApplication() {
|
|
78
|
+
window.location.href = "index.html";
|
|
79
|
+
}
|
|
80
|
+
logout() {
|
|
81
|
+
this.clear();
|
|
82
|
+
this.redirectToLoginPage();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
exports.VuuAuthProvider = VuuAuthProvider;
|
|
87
|
+
//# sourceMappingURL=VuuAuthProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VuuAuthProvider.js","sources":["../../../packages/vuu-data-remote/src/VuuAuthProvider.ts"],"sourcesContent":["import { getCookieValue } from \"@vuu-ui/vuu-utils\";\nimport { parseVuuUserFromToken } from \"./authenticate\";\n\nexport type User = {\n userName: string;\n};\n\nexport interface AuthProvider {\n login: (\n username?: string,\n password?: string,\n ) => Promise<{ authorizations: string[]; token: string; user: User }>;\n logout: () => void;\n}\n\n/**\n * The Vuu AuthProvider is a simple Demoware auth provider that\n * grabs username and pasdsword from. a simple login form and\n * exchanges these for a Vuu Token. Password is manipulated in\n * plain text, hence not suitable for real world usage.\n *\n * This AuthProvider is used by the login panel, which sets\n * user credentials in cookies.\n * It is then used by the application itself to retrieve the\n * credentials and login to vuu.\n */\nexport class VuuAuthProvider implements AuthProvider {\n constructor(private authEndpoint: string) {}\n\n login = async (username?: string, password?: string) => {\n const date = new Date();\n const days = 1;\n date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);\n\n if (username && password) {\n // coming from login panel\n\n // TODO what if the authorizations have changed\n const { token } = await this.getVuuTokenWithUsernameAndPassword(\n username,\n password,\n );\n document.cookie = `vuu-auth-user=${username};expires=${date.toUTCString()};path=/`;\n document.cookie = `vuu-auth-password=${password};expires=${date.toUTCString()};path=/`;\n document.cookie = `vuu-auth-token=${token};expires=${date.toUTCString()};path=/`;\n return this.redirectToApplication() as never;\n } else {\n const userName = getCookieValue(\"vuu-auth-user\");\n const password = getCookieValue(\"vuu-auth-password\");\n if (userName && password) {\n const { authorizations, token } =\n await this.getVuuTokenWithUsernameAndPassword(userName, password);\n document.cookie = `vuu-auth-token=${token};expires=${date.toUTCString()};path=/`;\n\n return {\n authorizations,\n user: {\n userName,\n },\n token,\n };\n } else {\n return this.redirectToLoginPage() as never;\n }\n }\n };\n\n private async getVuuTokenWithUsernameAndPassword(\n username: string,\n password: string,\n ) {\n const response = await fetch(this.authEndpoint, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"access-control-allow-origin\": location.host,\n },\n body: JSON.stringify({\n username,\n password,\n }),\n });\n\n if (response.ok) {\n const vuuAuthToken = response.headers.get(\"vuu-auth-token\");\n if (typeof vuuAuthToken === \"string\" && vuuAuthToken.length > 0) {\n const { authorizations } = parseVuuUserFromToken(vuuAuthToken);\n return { authorizations, token: vuuAuthToken };\n } else {\n throw Error(`Authentication failed auth token not returned by server`);\n }\n } else {\n throw Error(`Authentication failed, ${response.status}`);\n }\n }\n\n private clear() {\n document.cookie =\n \"vuu-auth-user= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie =\n \"vuu-auth-password= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n document.cookie =\n \"vuu-auth-token= ; expires = Thu, 01 Jan 1970 00:00:00 GMT\";\n }\n\n private redirectToLoginPage() {\n window.location.href = \"login.html\";\n }\n\n private redirectToApplication() {\n window.location.href = \"index.html\";\n }\n\n logout() {\n this.clear();\n this.redirectToLoginPage();\n }\n}\n"],"names":["getCookieValue","password","parseVuuUserFromToken"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ConnectionManager = require('./ConnectionManager.js');
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
+
const VuuAuthTokenIssuePolicy = {
|
|
9
|
+
BearerToken: "bearer-token",
|
|
10
|
+
UsernamePassword: "username-password"
|
|
11
|
+
};
|
|
12
|
+
class VuuAuthenticator {
|
|
13
|
+
constructor({
|
|
14
|
+
authProvider,
|
|
15
|
+
authTokenIssuePolicy = VuuAuthTokenIssuePolicy.BearerToken,
|
|
16
|
+
websocketUrl
|
|
17
|
+
}) {
|
|
18
|
+
__publicField(this, "authProvider");
|
|
19
|
+
__publicField(this, "authTokenIssuePolicy");
|
|
20
|
+
__publicField(this, "websocketUrl");
|
|
21
|
+
__publicField(this, "openWebsocketConnection", async (vuuToken) => {
|
|
22
|
+
await ConnectionManager.connect(
|
|
23
|
+
{
|
|
24
|
+
url: this.websocketUrl,
|
|
25
|
+
token: vuuToken
|
|
26
|
+
},
|
|
27
|
+
true
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
|
+
__publicField(this, "login", async () => {
|
|
31
|
+
const { authorizations, user, token } = await this.authProvider.login();
|
|
32
|
+
if (token && user) {
|
|
33
|
+
await this.openWebsocketConnection(token);
|
|
34
|
+
return [user, authorizations];
|
|
35
|
+
} else {
|
|
36
|
+
throw Error("[VuuAuthenticator] login failed");
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
__publicField(this, "logout", () => {
|
|
40
|
+
this.authProvider.logout();
|
|
41
|
+
});
|
|
42
|
+
this.authProvider = authProvider;
|
|
43
|
+
this.authTokenIssuePolicy = authTokenIssuePolicy;
|
|
44
|
+
this.websocketUrl = websocketUrl;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
exports.VuuAuthTokenIssuePolicy = VuuAuthTokenIssuePolicy;
|
|
49
|
+
exports.VuuAuthenticator = VuuAuthenticator;
|
|
50
|
+
//# sourceMappingURL=VuuAuthenticator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VuuAuthenticator.js","sources":["../../../packages/vuu-data-remote/src/VuuAuthenticator.ts"],"sourcesContent":["import ConnectionManager from \"./ConnectionManager\";\nimport { ValueOf } from \"@vuu-ui/vuu-utils\";\nimport { User, type AuthProvider } from \"./VuuAuthProvider\";\n\nexport const VuuAuthTokenIssuePolicy = {\n BearerToken: \"bearer-token\",\n UsernamePassword: \"username-password\",\n} as const;\n\nexport type VuuAuthTokenIssuePolicy = ValueOf<typeof VuuAuthTokenIssuePolicy>;\n\nexport interface VuuAuthenticatorConstructorOptions {\n authProvider: AuthProvider;\n authTokenIssuePolicy?: VuuAuthTokenIssuePolicy;\n websocketUrl: string;\n}\n\nexport class VuuAuthenticator {\n private authProvider: AuthProvider;\n private authTokenIssuePolicy: VuuAuthTokenIssuePolicy;\n private websocketUrl: string;\n\n constructor({\n authProvider,\n authTokenIssuePolicy = VuuAuthTokenIssuePolicy.BearerToken,\n websocketUrl,\n }: VuuAuthenticatorConstructorOptions) {\n this.authProvider = authProvider;\n this.authTokenIssuePolicy = authTokenIssuePolicy;\n this.websocketUrl = websocketUrl;\n }\n\n private openWebsocketConnection = async (vuuToken: string) => {\n await ConnectionManager.connect(\n {\n url: this.websocketUrl,\n token: vuuToken,\n },\n true,\n );\n };\n\n login = async (): Promise<[User, string[]] | never> => {\n const { authorizations, user, token } = await this.authProvider.login();\n if (token && user) {\n await this.openWebsocketConnection(token);\n return [user, authorizations];\n } else {\n throw Error(\"[VuuAuthenticator] login failed\");\n }\n };\n\n logout = () => {\n this.authProvider.logout();\n };\n}\n"],"names":[],"mappings":";;;;;;;AAIO,MAAM,uBAA0B,GAAA;AAAA,EACrC,WAAa,EAAA,cAAA;AAAA,EACb,gBAAkB,EAAA;AACpB;AAUO,MAAM,gBAAiB,CAAA;AAAA,EAK5B,WAAY,CAAA;AAAA,IACV,YAAA;AAAA,IACA,uBAAuB,uBAAwB,CAAA,WAAA;AAAA,IAC/C;AAAA,GACqC,EAAA;AARvC,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,sBAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAYR,IAAQ,aAAA,CAAA,IAAA,EAAA,yBAAA,EAA0B,OAAO,QAAqB,KAAA;AAC5D,MAAA,MAAM,iBAAkB,CAAA,OAAA;AAAA,QACtB;AAAA,UACE,KAAK,IAAK,CAAA,YAAA;AAAA,UACV,KAAO,EAAA;AAAA,SACT;AAAA,QACA;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,OAAA,EAAQ,YAA+C;AACrD,MAAM,MAAA,EAAE,gBAAgB,IAAM,EAAA,KAAA,KAAU,MAAM,IAAA,CAAK,aAAa,KAAM,EAAA;AACtE,MAAA,IAAI,SAAS,IAAM,EAAA;AACjB,QAAM,MAAA,IAAA,CAAK,wBAAwB,KAAK,CAAA;AACxC,QAAO,OAAA,CAAC,MAAM,cAAc,CAAA;AAAA,OACvB,MAAA;AACL,QAAA,MAAM,MAAM,iCAAiC,CAAA;AAAA;AAC/C,KACF,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,MAAM;AACb,MAAA,IAAA,CAAK,aAAa,MAAO,EAAA;AAAA,KAC3B,CAAA;AA3BE,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA;AACpB,IAAA,IAAA,CAAK,oBAAuB,GAAA,oBAAA;AAC5B,IAAA,IAAA,CAAK,YAAe,GAAA,YAAA;AAAA;AA0BxB;;;;;"}
|
|
@@ -3,24 +3,18 @@
|
|
|
3
3
|
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
4
|
|
|
5
5
|
vuuUtils.logger("WebSocketConnection");
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
"failed"
|
|
17
|
-
].includes(msg.connectionStatus);
|
|
18
|
-
} else {
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
6
|
+
const isWebSocketConnectionStatus = (msg) => typeof msg === "string" && [
|
|
7
|
+
"connecting",
|
|
8
|
+
"websocket-open",
|
|
9
|
+
"connected",
|
|
10
|
+
"reconnecting",
|
|
11
|
+
"reconnected",
|
|
12
|
+
"disconnected",
|
|
13
|
+
"closed",
|
|
14
|
+
"failed"
|
|
15
|
+
].includes(msg);
|
|
22
16
|
const isConnected = (status) => status === "connected" || status === "reconnected";
|
|
23
17
|
|
|
24
18
|
exports.isConnected = isConnected;
|
|
25
|
-
exports.
|
|
19
|
+
exports.isWebSocketConnectionStatus = isWebSocketConnectionStatus;
|
|
26
20
|
//# sourceMappingURL=WebSocketConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebSocketConnection.js","sources":["../../../packages/vuu-data-remote/src/WebSocketConnection.ts"],"sourcesContent":["import { WebSocketProtocol } from \"@vuu-ui/vuu-data-types\";\nimport { VuuClientMessage, VuuServerMessage } from \"@vuu-ui/vuu-protocol-types\";\nimport { DeferredPromise, EventEmitter, logger } from \"@vuu-ui/vuu-utils\";\n\nexport type ConnectingStatus = \"connecting\" | \"reconnecting\";\nexport type ConnectedStatus = \"connected\" | \"reconnected\";\nexport type ConnectionStatus =\n | ConnectedStatus\n | \"closed\"\n | \"connection-open-awaiting-session\"\n | \"disconnected\"\n | \"failed\"\n | \"inactive\";\n\ntype InternalConnectionStatus = ConnectionStatus | ConnectingStatus;\n\ntype ReconnectAttempts = {\n retryAttemptsTotal: number;\n retryAttemptsRemaining: number;\n secondsToNextRetry: number;\n};\n\nexport interface WebSocketConnectionState<\n T extends InternalConnectionStatus = ConnectionStatus,\n> extends ReconnectAttempts {\n connectionPhase: ConnectingStatus;\n connectionStatus: T;\n}\n\nconst { debug, debugEnabled, info } = logger(\"WebSocketConnection\");\n\nconst isNotConnecting = (\n connectionState: WebSocketConnectionState<InternalConnectionStatus>,\n): connectionState is WebSocketConnectionState<ConnectionStatus> =>\n connectionState.connectionStatus !== \"connecting\" &&\n connectionState.connectionStatus !== \"reconnecting\";\n\nexport const isWebSocketConnectionMessage = (\n msg: object | WebSocketConnectionState,\n): msg is WebSocketConnectionState => {\n if (\"connectionStatus\" in msg) {\n return [\n \"connecting\",\n \"connected\",\n \"connection-open-awaiting-session\",\n \"reconnecting\",\n \"reconnected\",\n \"disconnected\",\n \"closed\",\n \"failed\",\n ].includes(msg.connectionStatus);\n } else {\n return false;\n }\n};\n\nexport const isConnected = (\n status: ConnectionStatus,\n): status is ConnectedStatus =>\n status === \"connected\" || status === \"reconnected\";\n\nexport type VuuServerMessageCallback = (msg: VuuServerMessage) => void;\n\nexport type RetryLimits = {\n connect: number;\n reconnect: number;\n};\n\nexport type WebSocketConnectionConfig = {\n url: string;\n protocols: WebSocketProtocol;\n callback: VuuServerMessageCallback;\n connectionTimeout?: number;\n retryLimits?: RetryLimits;\n};\n\nconst DEFAULT_RETRY_LIMITS: RetryLimits = {\n connect: 5,\n reconnect: 8,\n};\n\nconst DEFAULT_CONNECTION_TIMEOUT = 10000;\n\nconst ConnectingEndState: Record<ConnectingStatus, ConnectedStatus> = {\n connecting: \"connected\",\n reconnecting: \"reconnected\",\n} as const;\n\nconst parseWebSocketMessage = (message: string): VuuServerMessage => {\n try {\n return JSON.parse(message) as VuuServerMessage;\n } catch (e) {\n throw Error(`Error parsing JSON response from server ${message}`);\n }\n};\n\nexport type WebSocketCloseMessage = {\n type: \"websocket-closed\";\n reason: WebSocketConnectionCloseReason;\n};\n\nexport type WebSocketConnectionCloseReason =\n | \"failure\"\n | \"shutdown\"\n | \"invalid-token\"\n | \"token-expired\";\nexport type WebSocketConnectionEvents = {\n closed: (message: WebSocketCloseMessage) => void;\n connected: () => void;\n \"connection-status\": (message: WebSocketConnectionState) => void;\n reconnected: () => void;\n};\n\nexport class WebSocketConnection extends EventEmitter<WebSocketConnectionEvents> {\n #callback;\n /**\n We are not confirmedOpen until we receive the first message from the\n server. If we get an unexpected close event before that, we consider\n the reconnect attempts as still within the connection phase, not true\n reconnection. This can happen e.g. when connecting to remote host via\n a proxy.\n */\n #confirmedOpen = false;\n #connectionState: WebSocketConnectionState<InternalConnectionStatus>;\n #connectionTimeout;\n #deferredConnection?: DeferredPromise;\n #protocols;\n #reconnectAttempts: ReconnectAttempts;\n #requiresLogin = true;\n #url;\n #ws?: WebSocket;\n\n constructor({\n callback,\n connectionTimeout = DEFAULT_CONNECTION_TIMEOUT,\n protocols,\n retryLimits = DEFAULT_RETRY_LIMITS,\n url,\n }: WebSocketConnectionConfig) {\n super();\n\n this.#callback = callback;\n this.#connectionTimeout = connectionTimeout;\n this.#url = url;\n this.#protocols = protocols;\n\n this.#reconnectAttempts = {\n retryAttemptsTotal: retryLimits.reconnect,\n retryAttemptsRemaining: retryLimits.reconnect,\n secondsToNextRetry: 1,\n };\n\n /**\n * Initial retryAttempts are for the 'connecting' phase. These will\n * be replaced with 'reconnecting' phase retry attempts only once\n * initial connection succeeds.\n */\n this.#connectionState = {\n connectionPhase: \"connecting\",\n connectionStatus: \"closed\",\n retryAttemptsTotal: retryLimits.connect,\n retryAttemptsRemaining: retryLimits.connect,\n secondsToNextRetry: 1,\n };\n }\n\n get connectionTimeout() {\n return this.#connectionTimeout;\n }\n\n get protocols() {\n return this.#protocols;\n }\n\n get requiresLogin() {\n return this.#requiresLogin;\n }\n\n get isClosed() {\n return this.status === \"closed\";\n }\n get isDisconnected() {\n return this.status === \"disconnected\";\n }\n\n get isConnecting() {\n return this.#connectionState.connectionPhase === \"connecting\";\n }\n\n get status() {\n return this.#connectionState.connectionStatus;\n }\n\n private set status(connectionStatus: InternalConnectionStatus) {\n this.#connectionState = {\n ...this.#connectionState,\n connectionStatus,\n };\n // we don't publish the connecting states. They have little meaning for clients\n // and are will generally be very short-lived.\n if (isNotConnecting(this.#connectionState)) {\n this.emit(\"connection-status\", this.#connectionState);\n }\n }\n\n get connectionState() {\n return this.#connectionState;\n }\n\n private get hasConnectionAttemptsRemaining() {\n return this.#connectionState.retryAttemptsRemaining > 0;\n }\n\n private get confirmedOpen() {\n return this.#confirmedOpen;\n }\n\n /**\n * We are 'confirmedOpen' when we see the first message transmitted\n * from the server. This ensures that even if we have one or more\n * proxies in our route to the endPoint, all connections have been\n * opened successfully.\n * First time in here (on our initial successful connection) we switch\n * from 'connect' phase to 'reconnect' phase. We may have different\n * retry configurations for these two phases.\n */\n private set confirmedOpen(confirmedOpen: boolean) {\n this.#confirmedOpen = confirmedOpen;\n\n if (confirmedOpen && this.isConnecting) {\n this.#connectionState = {\n ...this.#connectionState,\n connectionPhase: \"reconnecting\",\n ...this.#reconnectAttempts,\n };\n } else if (confirmedOpen) {\n // we have successfully reconnected after a failure.\n // Reset the retry attempts, ready for next failure\n // Note: this retry is shared with 'disconnected' status\n this.#connectionState = {\n ...this.#connectionState,\n ...this.#reconnectAttempts,\n };\n }\n }\n\n get url() {\n return this.#url;\n }\n\n async connect(clientCall = true) {\n const state = this.#connectionState;\n if (this.isConnecting && this.#deferredConnection === undefined) {\n // We block on the first connecting call, this will be the\n // initial connect call from app. Any other calls will be\n // reconnect attempts. The initial connecting call returns a promise.\n // This promise is resolved either on that initial call or on a\n // subsequent successful retry attempt within nthat same initial\n // connecting phase.\n this.#deferredConnection = new DeferredPromise();\n }\n const { connectionTimeout, protocols, url } = this;\n this.status = state.connectionPhase;\n const timer = setTimeout(() => {\n throw Error(\n `Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`,\n );\n }, connectionTimeout);\n\n const ws = (this.#ws = new WebSocket(url, protocols));\n\n ws.onopen = () => {\n const connectedStatus = ConnectingEndState[state.connectionPhase];\n this.status = connectedStatus;\n clearTimeout(timer);\n if (this.#deferredConnection) {\n this.#deferredConnection.resolve(undefined);\n this.#deferredConnection = undefined;\n }\n if (this.isConnecting) {\n this.emit(\"connected\");\n } else {\n this.emit(\"reconnected\");\n }\n };\n ws.onerror = () => {\n clearTimeout(timer);\n };\n\n ws.onclose = () => {\n if (!this.isClosed) {\n this.confirmedOpen = false;\n this.status = \"disconnected\";\n if (this.hasConnectionAttemptsRemaining) {\n this.reconnect();\n } else {\n this.close(\"failure\");\n }\n }\n };\n\n ws.onmessage = (evt) => {\n if (!this.confirmedOpen) {\n // Now that we are confirmedOpen any subsequent close events\n // will be treated as part of a reconnection phase.\n this.confirmedOpen = true;\n }\n this.receive(evt);\n };\n\n if (clientCall) {\n return this.#deferredConnection?.promise;\n }\n }\n\n private reconnect() {\n const { retryAttemptsRemaining, secondsToNextRetry } =\n this.#connectionState;\n setTimeout(() => {\n this.#connectionState = {\n ...this.#connectionState,\n retryAttemptsRemaining: retryAttemptsRemaining - 1,\n secondsToNextRetry: secondsToNextRetry * 2,\n };\n this.connect(false);\n }, secondsToNextRetry * 1000);\n }\n\n private receive = (evt: MessageEvent) => {\n if (evt.data === \"Invalid token\" || evt.data === \"Token has expired\") {\n const closeReason: WebSocketConnectionCloseReason =\n evt.data === \"Invalid token\" ? \"invalid-token\" : \"token-expired\";\n this.close(closeReason);\n } else {\n const vuuMessageFromServer = parseWebSocketMessage(evt.data);\n if (vuuMessageFromServer.body.type === \"CHANGE_VP_RANGE_SUCCESS\") {\n info?.(`CHANGE_VP_RANGE_SUCCESS<#${vuuMessageFromServer.requestId}>`);\n }\n if (debugEnabled) {\n if (vuuMessageFromServer.body.type !== \"HB\") {\n debug(`${vuuMessageFromServer.body.type}`);\n if (vuuMessageFromServer.body.type === \"CHANGE_VP_SUCCESS\") {\n debug(JSON.stringify(vuuMessageFromServer.body));\n }\n }\n }\n this.#callback(vuuMessageFromServer);\n }\n };\n\n send = (msg: VuuClientMessage) => {\n if (msg.body.type === \"CHANGE_VP_RANGE\") {\n info?.(\n `CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`,\n );\n }\n this.#ws?.send(JSON.stringify(msg));\n };\n\n close(reason: WebSocketConnectionCloseReason = \"shutdown\") {\n this.status = \"closed\";\n if (reason === \"failure\") {\n if (this.#deferredConnection) {\n this.#deferredConnection.reject(Error(\"connection failed\"));\n this.#deferredConnection = undefined;\n }\n } else {\n this.#ws?.close();\n }\n this.emit(\"closed\", { type: \"websocket-closed\", reason });\n this.#ws = undefined;\n }\n}\n"],"names":["logger"],"mappings":";;;;AA6BsCA,gBAAO,qBAAqB;AAQrD,MAAA,4BAAA,GAA+B,CAC1C,GACoC,KAAA;AACpC,EAAA,IAAI,sBAAsB,GAAK,EAAA;AAC7B,IAAO,OAAA;AAAA,MACL,YAAA;AAAA,MACA,WAAA;AAAA,MACA,kCAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAE,QAAS,CAAA,GAAA,CAAI,gBAAgB,CAAA;AAAA,GAC1B,MAAA;AACL,IAAO,OAAA,KAAA;AAAA;AAEX;AAEO,MAAM,WAAc,GAAA,CACzB,MAEA,KAAA,MAAA,KAAW,eAAe,MAAW,KAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"WebSocketConnection.js","sources":["../../../packages/vuu-data-remote/src/WebSocketConnection.ts"],"sourcesContent":["import { WebSocketProtocol } from \"@vuu-ui/vuu-data-types\";\nimport {\n InvalidSessionReason,\n InvalidTokenReason,\n LoginErrorMessage,\n VuuClientMessage,\n VuuServerMessage,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n DeferredPromise,\n EventEmitter,\n isLoginErrorMessage,\n logger,\n} from \"@vuu-ui/vuu-utils\";\n\nexport type ConnectionPhase =\n | \"initial-connection\"\n | \"post-disconnect-reconnection\";\nexport type ConnectingStatus = \"connecting\" | \"reconnecting\";\nexport type ConnectedStatus = \"connected\" | \"reconnected\";\nexport type ConnectionStatus =\n | ConnectingStatus\n | ConnectedStatus\n | \"closed\"\n | \"websocket-open\"\n | \"disconnected\"\n | \"failed\"\n | \"inactive\";\n\nexport const isInvalidTokenReason = (\n text: string,\n): text is InvalidTokenReason =>\n text === \"Invalid token\" || text === \"Token has expired\";\n\nexport const isInvalidSessionReason = (\n text: string,\n): text is InvalidSessionReason =>\n text === \"Invalid session\" || text === \"User session limit exceeded\";\n\nconst { debug, debugEnabled, info } = logger(\"WebSocketConnection\");\n\nexport const isWebSocketConnectionStatus = (\n msg: unknown,\n): msg is ConnectionStatus =>\n typeof msg === \"string\" &&\n [\n \"connecting\",\n \"websocket-open\",\n \"connected\",\n \"reconnecting\",\n \"reconnected\",\n \"disconnected\",\n \"closed\",\n \"failed\",\n ].includes(msg);\n\nexport const isConnected = (\n status: ConnectionStatus,\n): status is ConnectedStatus =>\n status === \"connected\" || status === \"reconnected\";\n\nexport type LoginRejectedMessage = {\n type: \"LOGIN_REJECTED\";\n reason: LoginErrorMessage;\n};\n\nexport const isLoginRejectedMessage = (\n message: object,\n): message is LoginRejectedMessage =>\n message !== null && \"type\" in message && message.type === \"LOGIN_REJECTED\";\n\nexport type VuuServerMessageCallback = (\n msg: VuuServerMessage | LoginRejectedMessage,\n) => void;\n\nexport type WebSocketConnectionConfig = {\n url: string;\n protocols: WebSocketProtocol;\n callback: VuuServerMessageCallback;\n connectionTimeout?: number;\n};\n\nconst DEFAULT_CONNECTION_TIMEOUT = 10000;\n\nconst parseWebSocketMessage = (message: string): VuuServerMessage => {\n try {\n return JSON.parse(message) as VuuServerMessage;\n } catch (e) {\n throw Error(`Error parsing JSON response from server ${message}`);\n }\n};\n\nexport type WebSocketConnectionCloseReason =\n | LoginErrorMessage\n | \"failure\"\n | \"shutdown\";\n\nexport type WebSocketConnectionEvents = {\n \"connection-status\": (status: ConnectionStatus) => void;\n};\n\nexport class WebSocketConnection extends EventEmitter<WebSocketConnectionEvents> {\n #callback;\n /**\n We are not confirmedOpen until we receive the first message from the\n server. If we get an unexpected close event before that, we consider\n the reconnect attempts as still within the connection phase, not true\n reconnection. This can happen e.g. when connecting to remote host via\n a proxy.\n */\n #confirmedOpen = false;\n #connectionPhase: ConnectionPhase = \"initial-connection\";\n #connectionStatus: ConnectionStatus = \"closed\";\n\n #connectionTimeout;\n #deferredOpen?: DeferredPromise;\n #protocols;\n #url;\n #ws?: WebSocket;\n\n constructor({\n callback,\n connectionTimeout = DEFAULT_CONNECTION_TIMEOUT,\n protocols,\n url,\n }: WebSocketConnectionConfig) {\n super();\n\n this.#callback = callback;\n this.#connectionTimeout = connectionTimeout;\n this.#url = url;\n this.#protocols = protocols;\n }\n\n get connectionTimeout() {\n return this.#connectionTimeout;\n }\n\n get protocols() {\n return this.#protocols;\n }\n\n get isClosed() {\n return this.#connectionStatus === \"closed\";\n }\n get isDisconnected() {\n return this.#connectionStatus === \"disconnected\";\n }\n\n get connectionPhase() {\n return this.#connectionPhase;\n }\n\n get connectionStatus() {\n return this.#connectionStatus;\n }\n\n private set connectionStatus(connectionStatus: ConnectionStatus) {\n if (\n connectionStatus !== \"connecting\" &&\n connectionStatus !== \"reconnecting\"\n ) {\n this.#connectionStatus = connectionStatus;\n this.emit(\"connection-status\", this.#connectionStatus);\n }\n }\n\n get confirmedOpen() {\n return this.#confirmedOpen;\n }\n\n /**\n * We are 'confirmedOpen' when we see the first message transmitted\n * from the server. This ensures that even if we have one or more\n * proxies in our route to the endPoint, all connections have been\n * opened successfully.\n * First time in here (on our initial successful connection) we switch\n * from 'connect' phase to 'reconnect' phase. We may have different\n * retry configurations for these two phases.\n */\n private set confirmedOpen(confirmedOpen: boolean) {\n this.#confirmedOpen = confirmedOpen;\n if (confirmedOpen && this.#connectionPhase === \"initial-connection\") {\n this.#connectionPhase = \"post-disconnect-reconnection\";\n }\n }\n\n get url() {\n return this.#url;\n }\n\n async openWebSocket() {\n const initialConnect = this.#connectionPhase === \"initial-connection\";\n if (this.#deferredOpen === undefined) {\n this.#deferredOpen = new DeferredPromise();\n }\n const { connectionTimeout, protocols, url } = this;\n this.#connectionStatus = initialConnect ? \"connecting\" : \"reconnecting\";\n\n const timer = setTimeout(() => {\n throw Error(\n `Failed to open WebSocket connection to ${url}, timed out after ${connectionTimeout}ms`,\n );\n }, connectionTimeout);\n\n const ws = (this.#ws = new WebSocket(url, protocols));\n\n ws.onopen = () => {\n this.connectionStatus = \"websocket-open\";\n\n clearTimeout(timer);\n\n // Do we do this here or after login\n if (this.#deferredOpen) {\n this.#deferredOpen.resolve(undefined);\n this.#deferredOpen = undefined;\n }\n };\n\n ws.onerror = () => {\n clearTimeout(timer);\n };\n\n ws.onclose = () => {\n if (!this.isClosed) {\n this.confirmedOpen = false;\n // Do we emit disconnected even if not confirmed open ?\n // this will emit disconnected\n this.connectionStatus = \"disconnected\";\n // this will emit closed\n this.close(\"failure\");\n }\n };\n\n ws.onmessage = (evt) => {\n this.receive(evt);\n };\n\n return this.#deferredOpen?.promise;\n }\n\n private receive = (evt: MessageEvent) => {\n if (isLoginErrorMessage(evt.data)) {\n console.log(`[WebSocketConnection] closed because of login issue`);\n if (this.#deferredOpen) {\n console.log(`... and qwe have a deferred connection`);\n }\n\n this.#callback({\n type: \"LOGIN_REJECTED\",\n reason: evt.data,\n });\n this.close(evt.data);\n } else {\n const vuuMessageFromServer = parseWebSocketMessage(evt.data);\n\n if (debugEnabled) {\n if (vuuMessageFromServer.body.type !== \"HB\") {\n debug(`${vuuMessageFromServer.body.type}`);\n if (vuuMessageFromServer.body.type === \"CHANGE_VP_SUCCESS\") {\n debug(JSON.stringify(vuuMessageFromServer.body));\n }\n }\n }\n this.#callback(vuuMessageFromServer);\n\n if (!this.confirmedOpen) {\n if (vuuMessageFromServer.body.type === \"LOGIN_SUCCESS\") {\n // Now that we are confirmedOpen any subsequent close events\n // will be treated as part of a reconnection phase.\n this.connectionStatus =\n this.#connectionPhase === \"initial-connection\"\n ? \"connected\"\n : \"reconnected\";\n this.confirmedOpen = true;\n }\n }\n }\n };\n\n send = (msg: VuuClientMessage) => {\n if (msg.body.type === \"CHANGE_VP_RANGE\") {\n info?.(\n `CHANGE_VP_RANGE<#${msg.requestId}> ${msg.body.from}-${msg.body.to}`,\n );\n }\n this.#ws?.send(JSON.stringify(msg));\n };\n\n close(reason: WebSocketConnectionCloseReason = \"shutdown\") {\n this.connectionStatus = \"closed\";\n if (reason === \"failure\") {\n if (this.#deferredOpen) {\n this.#deferredOpen.reject(Error(\"connection failed\"));\n this.#deferredOpen = undefined;\n }\n } else {\n this.#ws?.close();\n }\n this.#ws = undefined;\n }\n}\n"],"names":["logger"],"mappings":";;;;AAuCsCA,gBAAO,qBAAqB;AAE3D,MAAM,2BAA8B,GAAA,CACzC,GAEA,KAAA,OAAO,QAAQ,QACf,IAAA;AAAA,EACE,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,CAAE,SAAS,GAAG;AAET,MAAM,WAAc,GAAA,CACzB,MAEA,KAAA,MAAA,KAAW,eAAe,MAAW,KAAA;;;;;"}
|
package/cjs/authenticate.js
CHANGED
|
@@ -12,6 +12,20 @@ const parseVuuUserFromToken = (token) => {
|
|
|
12
12
|
throw Error(`auth token does not containe VuuUser`);
|
|
13
13
|
}
|
|
14
14
|
};
|
|
15
|
+
const getVuuAuthToken = async (authUrl, token) => {
|
|
16
|
+
const response = await fetch(authUrl, {
|
|
17
|
+
headers: { Authorization: `Bearer ${token}` }
|
|
18
|
+
});
|
|
19
|
+
if (!response.ok) {
|
|
20
|
+
throw Error("Authentication error: Auth token failure");
|
|
21
|
+
}
|
|
22
|
+
const json = await response.json();
|
|
23
|
+
const vuuUser = parseVuuUserFromToken(json.token);
|
|
24
|
+
return {
|
|
25
|
+
authorizations: vuuUser.authorizations,
|
|
26
|
+
token: json.token
|
|
27
|
+
};
|
|
28
|
+
};
|
|
15
29
|
const authenticate = async (username, password, authUrl = defaultAuthUrl) => {
|
|
16
30
|
return fetch(authUrl, {
|
|
17
31
|
method: "POST",
|
|
@@ -45,5 +59,6 @@ const authenticate = async (username, password, authUrl = defaultAuthUrl) => {
|
|
|
45
59
|
};
|
|
46
60
|
|
|
47
61
|
exports.authenticate = authenticate;
|
|
62
|
+
exports.getVuuAuthToken = getVuuAuthToken;
|
|
48
63
|
exports.parseVuuUserFromToken = parseVuuUserFromToken;
|
|
49
64
|
//# sourceMappingURL=authenticate.js.map
|
package/cjs/authenticate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authenticate.js","sources":["../../../packages/vuu-data-remote/src/authenticate.ts"],"sourcesContent":["import type { VuuUser } from \"@vuu-ui/vuu-protocol-types\";\n\nconst defaultAuthUrl = \"api/authn\";\n\nconst isValidVuuUser = (response: unknown): response is VuuUser =>\n typeof response === \"object\" &&\n response !== null &&\n \"name\" in response &&\n \"authorizations\" in response &&\n typeof response.name === \"string\" &&\n Array.isArray(response.authorizations);\n\n/**\n * The auth token returned from authn call encodes (Base64) a VuuUser\n * within the first part of the token.\n */\nexport const parseVuuUserFromToken = (token: string) => {\n const [base64EncodedVuuUser] = token.split(\".\");\n const jsonString = atob(base64EncodedVuuUser);\n const response = JSON.parse(jsonString);\n if (isValidVuuUser(response)) {\n return response;\n } else {\n throw Error(`auth token does not containe VuuUser`);\n }\n};\n\nexport type AuthenticationResponse = {\n token: string;\n user: VuuUser;\n};\n\nexport const authenticate = async (\n username: string,\n password: string,\n authUrl = defaultAuthUrl,\n): Promise<AuthenticationResponse> => {\n return fetch(authUrl, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"access-control-allow-origin\": location.host,\n },\n body: JSON.stringify({ username, password }),\n }).then((response) => {\n if (response.ok) {\n const authToken = response.headers.get(\"vuu-auth-token\");\n if (typeof authToken === \"string\" && authToken.length > 0) {\n try {\n return {\n token: authToken,\n user: parseVuuUserFromToken(authToken),\n };\n } catch (e) {\n throw Error(`Authentication error: vuu auth token decoding failed.`);\n }\n } else {\n throw Error(`Authentication failed auth token not returned by server`);\n }\n } else {\n throw Error(\n `Authentication failed ${response.status} ${response.statusText}`,\n );\n }\n });\n};\n"],"names":[],"mappings":";;AAEA,MAAM,cAAiB,GAAA,WAAA;AAEvB,MAAM,iBAAiB,CAAC,QAAA,KACtB,OAAO,QAAa,KAAA,QAAA,IACpB,aAAa,IACb,IAAA,MAAA,IAAU,YACV,gBAAoB,IAAA,QAAA,IACpB,OAAO,QAAS,CAAA,IAAA,KAAS,YACzB,KAAM,CAAA,OAAA,CAAQ,SAAS,cAAc,CAAA;AAM1B,MAAA,qBAAA,GAAwB,CAAC,KAAkB,KAAA;AACtD,EAAA,MAAM,CAAC,oBAAoB,CAAI,GAAA,KAAA,CAAM,MAAM,GAAG,CAAA;AAC9C,EAAM,MAAA,UAAA,GAAa,KAAK,oBAAoB,CAAA;AAC5C,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACtC,EAAI,IAAA,cAAA,CAAe,QAAQ,CAAG,EAAA;AAC5B,IAAO,OAAA,QAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,CAAsC,oCAAA,CAAA,CAAA;AAAA;AAEtD;
|
|
1
|
+
{"version":3,"file":"authenticate.js","sources":["../../../packages/vuu-data-remote/src/authenticate.ts"],"sourcesContent":["import type { VuuUser } from \"@vuu-ui/vuu-protocol-types\";\n\nconst defaultAuthUrl = \"api/authn\";\n\nconst isValidVuuUser = (response: unknown): response is VuuUser =>\n typeof response === \"object\" &&\n response !== null &&\n \"name\" in response &&\n \"authorizations\" in response &&\n typeof response.name === \"string\" &&\n Array.isArray(response.authorizations);\n\n/**\n * The auth token returned from authn call encodes (Base64) a VuuUser\n * within the first part of the token.\n */\nexport const parseVuuUserFromToken = (token: string) => {\n const [base64EncodedVuuUser] = token.split(\".\");\n const jsonString = atob(base64EncodedVuuUser);\n const response = JSON.parse(jsonString);\n if (isValidVuuUser(response)) {\n return response;\n } else {\n throw Error(`auth token does not containe VuuUser`);\n }\n};\n\nexport type AuthenticationResponse = {\n token: string;\n user: VuuUser;\n};\n\nexport const getVuuAuthToken = async (\n authUrl: string,\n token: string,\n): Promise<{ authorizations: string[]; token: string }> => {\n const response = await fetch(authUrl, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (!response.ok) {\n throw Error(\"Authentication error: Auth token failure\");\n }\n const json = await response.json();\n const vuuUser = parseVuuUserFromToken(json.token);\n return {\n authorizations: vuuUser.authorizations,\n token: json.token,\n };\n};\n\nexport const authenticate = async (\n username: string,\n password: string,\n authUrl = defaultAuthUrl,\n): Promise<AuthenticationResponse> => {\n return fetch(authUrl, {\n method: \"POST\",\n credentials: \"include\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"access-control-allow-origin\": location.host,\n },\n body: JSON.stringify({ username, password }),\n }).then((response) => {\n if (response.ok) {\n const authToken = response.headers.get(\"vuu-auth-token\");\n if (typeof authToken === \"string\" && authToken.length > 0) {\n try {\n return {\n token: authToken,\n user: parseVuuUserFromToken(authToken),\n };\n } catch (e) {\n throw Error(`Authentication error: vuu auth token decoding failed.`);\n }\n } else {\n throw Error(`Authentication failed auth token not returned by server`);\n }\n } else {\n throw Error(\n `Authentication failed ${response.status} ${response.statusText}`,\n );\n }\n });\n};\n"],"names":[],"mappings":";;AAEA,MAAM,cAAiB,GAAA,WAAA;AAEvB,MAAM,iBAAiB,CAAC,QAAA,KACtB,OAAO,QAAa,KAAA,QAAA,IACpB,aAAa,IACb,IAAA,MAAA,IAAU,YACV,gBAAoB,IAAA,QAAA,IACpB,OAAO,QAAS,CAAA,IAAA,KAAS,YACzB,KAAM,CAAA,OAAA,CAAQ,SAAS,cAAc,CAAA;AAM1B,MAAA,qBAAA,GAAwB,CAAC,KAAkB,KAAA;AACtD,EAAA,MAAM,CAAC,oBAAoB,CAAI,GAAA,KAAA,CAAM,MAAM,GAAG,CAAA;AAC9C,EAAM,MAAA,UAAA,GAAa,KAAK,oBAAoB,CAAA;AAC5C,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,UAAU,CAAA;AACtC,EAAI,IAAA,cAAA,CAAe,QAAQ,CAAG,EAAA;AAC5B,IAAO,OAAA,QAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,CAAsC,oCAAA,CAAA,CAAA;AAAA;AAEtD;AAOa,MAAA,eAAA,GAAkB,OAC7B,OAAA,EACA,KACyD,KAAA;AACzD,EAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,OAAS,EAAA;AAAA,IACpC,OAAS,EAAA,EAAE,aAAe,EAAA,CAAA,OAAA,EAAU,KAAK,CAAG,CAAA;AAAA,GAC7C,CAAA;AACD,EAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,IAAA,MAAM,MAAM,0CAA0C,CAAA;AAAA;AAExD,EAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA;AACjC,EAAM,MAAA,OAAA,GAAU,qBAAsB,CAAA,IAAA,CAAK,KAAK,CAAA;AAChD,EAAO,OAAA;AAAA,IACL,gBAAgB,OAAQ,CAAA,cAAA;AAAA,IACxB,OAAO,IAAK,CAAA;AAAA,GACd;AACF;AAEO,MAAM,YAAe,GAAA,OAC1B,QACA,EAAA,QAAA,EACA,UAAU,cAC0B,KAAA;AACpC,EAAA,OAAO,MAAM,OAAS,EAAA;AAAA,IACpB,MAAQ,EAAA,MAAA;AAAA,IACR,WAAa,EAAA,SAAA;AAAA,IACb,OAAS,EAAA;AAAA,MACP,cAAgB,EAAA,kBAAA;AAAA,MAChB,+BAA+B,QAAS,CAAA;AAAA,KAC1C;AAAA,IACA,MAAM,IAAK,CAAA,SAAA,CAAU,EAAE,QAAA,EAAU,UAAU;AAAA,GAC5C,CAAA,CAAE,IAAK,CAAA,CAAC,QAAa,KAAA;AACpB,IAAA,IAAI,SAAS,EAAI,EAAA;AACf,MAAA,MAAM,SAAY,GAAA,QAAA,CAAS,OAAQ,CAAA,GAAA,CAAI,gBAAgB,CAAA;AACvD,MAAA,IAAI,OAAO,SAAA,KAAc,QAAY,IAAA,SAAA,CAAU,SAAS,CAAG,EAAA;AACzD,QAAI,IAAA;AACF,UAAO,OAAA;AAAA,YACL,KAAO,EAAA,SAAA;AAAA,YACP,IAAA,EAAM,sBAAsB,SAAS;AAAA,WACvC;AAAA,iBACO,CAAG,EAAA;AACV,UAAA,MAAM,MAAM,CAAwD,sDAAA,CAAA,CAAA;AAAA;AACtE,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAAyD,uDAAA,CAAA,CAAA;AAAA;AACvE,KACK,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAyB,sBAAA,EAAA,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,UAAU,CAAA;AAAA,OACjE;AAAA;AACF,GACD,CAAA;AACH;;;;;;"}
|
package/cjs/index.js
CHANGED
|
@@ -4,13 +4,17 @@ var authenticate = require('./authenticate.js');
|
|
|
4
4
|
var ConnectionManager = require('./ConnectionManager.js');
|
|
5
5
|
var constants = require('./constants.js');
|
|
6
6
|
var dataSource = require('./data-source.js');
|
|
7
|
+
var LostConnectionHandler = require('./LostConnectionHandler.js');
|
|
7
8
|
var messageUtils = require('./message-utils.js');
|
|
9
|
+
var VuuAuthenticator = require('./VuuAuthenticator.js');
|
|
10
|
+
var VuuAuthProvider = require('./VuuAuthProvider.js');
|
|
8
11
|
var VuuDataSource = require('./VuuDataSource.js');
|
|
9
12
|
var WebSocketConnection = require('./WebSocketConnection.js');
|
|
10
13
|
|
|
11
14
|
|
|
12
15
|
|
|
13
16
|
exports.authenticate = authenticate.authenticate;
|
|
17
|
+
exports.getVuuAuthToken = authenticate.getVuuAuthToken;
|
|
14
18
|
exports.parseVuuUserFromToken = authenticate.parseVuuUserFromToken;
|
|
15
19
|
exports.ConnectionManager = ConnectionManager;
|
|
16
20
|
exports.connectionId = constants.connectionId;
|
|
@@ -19,11 +23,16 @@ exports.isDataSourceConfigMessage = dataSource.isDataSourceConfigMessage;
|
|
|
19
23
|
exports.isSizeOnly = dataSource.isSizeOnly;
|
|
20
24
|
exports.shouldMessageBeRoutedToDataSource = dataSource.shouldMessageBeRoutedToDataSource;
|
|
21
25
|
exports.toDataSourceConfig = dataSource.toDataSourceConfig;
|
|
26
|
+
exports.LostConnectionHandler = LostConnectionHandler.LostConnectionHandler;
|
|
27
|
+
exports.RetryOptions = LostConnectionHandler.RetryOptions;
|
|
22
28
|
exports.createSchemaFromTableMetadata = messageUtils.createSchemaFromTableMetadata;
|
|
23
29
|
exports.getFirstAndLastRows = messageUtils.getFirstAndLastRows;
|
|
24
30
|
exports.groupRowsByViewport = messageUtils.groupRowsByViewport;
|
|
25
31
|
exports.hasRequestId = messageUtils.hasRequestId;
|
|
26
32
|
exports.stripRequestId = messageUtils.stripRequestId;
|
|
33
|
+
exports.VuuAuthTokenIssuePolicy = VuuAuthenticator.VuuAuthTokenIssuePolicy;
|
|
34
|
+
exports.VuuAuthenticator = VuuAuthenticator.VuuAuthenticator;
|
|
35
|
+
exports.VuuAuthProvider = VuuAuthProvider.VuuAuthProvider;
|
|
27
36
|
exports.VuuDataSource = VuuDataSource.VuuDataSource;
|
|
28
37
|
exports.isConnected = WebSocketConnection.isConnected;
|
|
29
38
|
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|