@webiny/app-websockets 6.3.0 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/WebsocketsContextProvider.js +119 -142
- package/WebsocketsContextProvider.js.map +1 -1
- package/domain/WebsocketsAction.js +17 -24
- package/domain/WebsocketsAction.js.map +1 -1
- package/domain/WebsocketsActions.js +52 -73
- package/domain/WebsocketsActions.js.map +1 -1
- package/domain/WebsocketsConnection.js +72 -102
- package/domain/WebsocketsConnection.js.map +1 -1
- package/domain/WebsocketsManager.js +33 -34
- package/domain/WebsocketsManager.js.map +1 -1
- package/domain/WebsocketsSubscriptionManager.js +57 -64
- package/domain/WebsocketsSubscriptionManager.js.map +1 -1
- package/domain/abstractions/IWebsocketsAction.js +0 -3
- package/domain/abstractions/IWebsocketsActions.js +0 -3
- package/domain/abstractions/IWebsocketsConnection.js +7 -6
- package/domain/abstractions/IWebsocketsConnection.js.map +1 -1
- package/domain/abstractions/IWebsocketsManager.js +0 -3
- package/domain/abstractions/IWebsocketsSubscriptionManager.js +0 -3
- package/domain/abstractions/types.js +19 -18
- package/domain/abstractions/types.js.map +1 -1
- package/domain/index.js +0 -2
- package/domain/types.js +0 -2
- package/hooks/index.js +0 -2
- package/hooks/useWebsockets.js +5 -6
- package/hooks/useWebsockets.js.map +1 -1
- package/index.js +9 -12
- package/index.js.map +1 -1
- package/package.json +6 -6
- package/types.js +0 -3
- package/utils/getUrl.js +4 -3
- package/utils/getUrl.js.map +1 -1
- package/domain/abstractions/IWebsocketsAction.js.map +0 -1
- package/domain/abstractions/IWebsocketsActions.js.map +0 -1
- package/domain/abstractions/IWebsocketsManager.js.map +0 -1
- package/domain/abstractions/IWebsocketsSubscriptionManager.js.map +0 -1
- package/domain/index.js.map +0 -1
- package/domain/types.js.map +0 -1
- package/hooks/index.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1,114 +1,84 @@
|
|
|
1
1
|
import { WebsocketsReadyState } from "./types.js";
|
|
2
|
-
const defaultFactory = (url, protocol)
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* We need to attach the websockets cache to window object, or it will be reset on every hot reload.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
if (!window.WebinyWebsocketsConnectionCache) {
|
|
11
|
-
window.WebinyWebsocketsConnectionCache = {
|
|
2
|
+
const defaultFactory = (url, protocol)=>new WebSocket(url, protocol);
|
|
3
|
+
if (!window.WebinyWebsocketsConnectionCache) window.WebinyWebsocketsConnectionCache = {
|
|
12
4
|
ws: null
|
|
13
|
-
|
|
14
|
-
}
|
|
5
|
+
};
|
|
15
6
|
const connectionCache = window.WebinyWebsocketsConnectionCache;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
}
|
|
25
|
-
setTenant(tenant) {
|
|
26
|
-
this.tenant = tenant;
|
|
27
|
-
}
|
|
28
|
-
async connect() {
|
|
29
|
-
await this.getConnection();
|
|
30
|
-
}
|
|
31
|
-
async close(code, reason) {
|
|
32
|
-
if (!connectionCache.ws || connectionCache.ws.readyState === WebsocketsReadyState.CLOSED || connectionCache.ws.readyState === WebsocketsReadyState.CLOSING) {
|
|
33
|
-
connectionCache.ws = undefined;
|
|
34
|
-
return true;
|
|
7
|
+
class WebsocketsConnection {
|
|
8
|
+
constructor(params){
|
|
9
|
+
this.url = params.url;
|
|
10
|
+
this.tenant = params.tenant;
|
|
11
|
+
this.getToken = params.getToken;
|
|
12
|
+
this.protocol = params.protocol;
|
|
13
|
+
this.subscriptionManager = params.subscriptionManager;
|
|
14
|
+
this.factory = params.factory || defaultFactory;
|
|
35
15
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
async send(data) {
|
|
41
|
-
const connection = await this.getConnection();
|
|
42
|
-
if (connection.readyState !== WebsocketsReadyState.OPEN) {
|
|
43
|
-
console.info("Websocket connection is not open, cannot send any data.", data);
|
|
44
|
-
return;
|
|
16
|
+
setTenant(tenant) {
|
|
17
|
+
this.tenant = tenant;
|
|
45
18
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
isConnected() {
|
|
49
|
-
return connectionCache.ws?.readyState === WebsocketsReadyState.OPEN;
|
|
50
|
-
}
|
|
51
|
-
isClosed() {
|
|
52
|
-
return connectionCache.ws?.readyState === WebsocketsReadyState.CLOSED;
|
|
53
|
-
}
|
|
54
|
-
async createUrl() {
|
|
55
|
-
const token = await this.getToken();
|
|
56
|
-
if (!token) {
|
|
57
|
-
console.error(`Missing token to connect to websockets.`);
|
|
58
|
-
return null;
|
|
19
|
+
async connect() {
|
|
20
|
+
await this.getConnection();
|
|
59
21
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
} else if (connectionCache.ws?.readyState === WebsocketsReadyState.CONNECTING) {
|
|
69
|
-
return connectionCache.ws;
|
|
22
|
+
async close(code, reason) {
|
|
23
|
+
if (!connectionCache.ws || connectionCache.ws.readyState === WebsocketsReadyState.CLOSED || connectionCache.ws.readyState === WebsocketsReadyState.CLOSING) {
|
|
24
|
+
connectionCache.ws = void 0;
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
connectionCache.ws.close(code, reason);
|
|
28
|
+
connectionCache.ws = void 0;
|
|
29
|
+
return true;
|
|
70
30
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
31
|
+
async send(data) {
|
|
32
|
+
const connection = await this.getConnection();
|
|
33
|
+
if (connection.readyState !== WebsocketsReadyState.OPEN) return void console.info("Websocket connection is not open, cannot send any data.", data);
|
|
34
|
+
connection.send(JSON.stringify(data));
|
|
74
35
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
connectionCache.ws.addEventListener("close", event => {
|
|
87
|
-
return this.subscriptionManager.triggerOnClose(event);
|
|
88
|
-
});
|
|
89
|
-
connectionCache.ws.addEventListener("error", event => {
|
|
90
|
-
console.info(`Error in the Websocket connection.`, event);
|
|
91
|
-
/**
|
|
92
|
-
* Let's close it if possible.
|
|
93
|
-
* It will reopen automatically.
|
|
94
|
-
*/
|
|
95
|
-
if (connectionCache.ws?.close) {
|
|
96
|
-
try {
|
|
97
|
-
connectionCache.ws.close();
|
|
98
|
-
} catch (ex) {
|
|
99
|
-
console.error(ex);
|
|
36
|
+
isConnected() {
|
|
37
|
+
return connectionCache.ws?.readyState === WebsocketsReadyState.OPEN;
|
|
38
|
+
}
|
|
39
|
+
isClosed() {
|
|
40
|
+
return connectionCache.ws?.readyState === WebsocketsReadyState.CLOSED;
|
|
41
|
+
}
|
|
42
|
+
async createUrl() {
|
|
43
|
+
const token = await this.getToken();
|
|
44
|
+
if (!token) {
|
|
45
|
+
console.error("Missing token to connect to websockets.");
|
|
46
|
+
return null;
|
|
100
47
|
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
48
|
+
return {
|
|
49
|
+
token,
|
|
50
|
+
url: `${this.url}?token=${token}&tenant=${this.tenant}`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async getConnection() {
|
|
54
|
+
if (connectionCache.ws?.readyState === WebsocketsReadyState.OPEN) return connectionCache.ws;
|
|
55
|
+
if (connectionCache.ws?.readyState === WebsocketsReadyState.CONNECTING) return connectionCache.ws;
|
|
56
|
+
const result = await this.createUrl();
|
|
57
|
+
if (!result) throw new Error("Missing URL for WebSocket to connect to.");
|
|
58
|
+
const { url } = result;
|
|
59
|
+
connectionCache.ws = this.factory(url, this.protocol);
|
|
60
|
+
const start = new Date().getTime();
|
|
61
|
+
console.log(`Websockets connecting to ${this.url}...`);
|
|
62
|
+
connectionCache.ws.addEventListener("open", (event)=>{
|
|
63
|
+
const end = new Date().getTime();
|
|
64
|
+
console.log(`...connected in ${end - start}ms.`);
|
|
65
|
+
return this.subscriptionManager.triggerOnOpen(event);
|
|
66
|
+
});
|
|
67
|
+
connectionCache.ws.addEventListener("close", (event)=>this.subscriptionManager.triggerOnClose(event));
|
|
68
|
+
connectionCache.ws.addEventListener("error", (event)=>{
|
|
69
|
+
console.info("Error in the Websocket connection.", event);
|
|
70
|
+
if (connectionCache.ws?.close) try {
|
|
71
|
+
connectionCache.ws.close();
|
|
72
|
+
} catch (ex) {
|
|
73
|
+
console.error(ex);
|
|
74
|
+
}
|
|
75
|
+
return this.subscriptionManager.triggerOnError(event);
|
|
76
|
+
});
|
|
77
|
+
connectionCache.ws.addEventListener("message", (event)=>this.subscriptionManager.triggerOnMessage(event));
|
|
78
|
+
return connectionCache.ws;
|
|
79
|
+
}
|
|
109
80
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
};
|
|
81
|
+
const createWebsocketsConnection = (params)=>new WebsocketsConnection(params);
|
|
82
|
+
export { WebsocketsConnection, createWebsocketsConnection };
|
|
113
83
|
|
|
114
84
|
//# sourceMappingURL=WebsocketsConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebsocketsReadyState","defaultFactory","url","protocol","WebSocket","window","WebinyWebsocketsConnectionCache","ws","connectionCache","WebsocketsConnection","constructor","params","tenant","getToken","subscriptionManager","factory","setTenant","connect","getConnection","close","code","reason","readyState","CLOSED","CLOSING","undefined","send","data","connection","OPEN","console","info","JSON","stringify","isConnected","isClosed","createUrl","token","error","CONNECTING","result","Error","start","Date","getTime","log","addEventListener","event","end","triggerOnOpen","triggerOnClose","ex","triggerOnError","triggerOnMessage","createWebsocketsConnection"],"sources":["WebsocketsConnection.ts"],"sourcesContent":["import type {\n IGenericData,\n IWebsocketsConnection,\n IWebsocketsConnectionFactory,\n IWebsocketsConnectProtocol,\n IWebsocketsManagerMessageEvent,\n IWebsocketsSubscriptionManager,\n WebsocketsCloseCode\n} from \"./types.js\";\nimport { WebsocketsReadyState } from \"./types.js\";\n\ninterface ICreateUrlResult {\n token: string;\n url: string;\n}\n\nconst defaultFactory: IWebsocketsConnectionFactory = (url, protocol) => {\n return new WebSocket(url, protocol);\n};\n\ninterface IConnection {\n ws: WebSocket | null;\n}\n\n/**\n * We need to attach the websockets cache to window object, or it will be reset on every hot reload.\n */\ndeclare global {\n interface Window {\n WebinyWebsocketsConnectionCache: IConnection;\n }\n}\n\nif (!window.WebinyWebsocketsConnectionCache) {\n window.WebinyWebsocketsConnectionCache = {\n ws: null\n };\n}\n\nconst connectionCache = window.WebinyWebsocketsConnectionCache;\n\nexport interface IWebsocketsConnectionParams {\n url: string;\n tenant: string;\n getToken(): Promise<string | undefined>;\n subscriptionManager: IWebsocketsSubscriptionManager;\n protocol?: IWebsocketsConnectProtocol;\n factory?: IWebsocketsConnectionFactory;\n}\n\nexport class WebsocketsConnection implements IWebsocketsConnection {\n private readonly url: string;\n private readonly getToken: () => Promise<string | undefined>;\n private tenant: string;\n private readonly protocol: IWebsocketsConnectProtocol;\n public readonly subscriptionManager: IWebsocketsSubscriptionManager;\n private readonly factory: IWebsocketsConnectionFactory;\n\n public constructor(params: IWebsocketsConnectionParams) {\n this.url = params.url;\n this.tenant = params.tenant;\n this.getToken = params.getToken;\n this.protocol = params.protocol;\n this.subscriptionManager = params.subscriptionManager;\n this.factory = params.factory || defaultFactory;\n }\n\n public setTenant(tenant: string): void {\n this.tenant = tenant;\n }\n\n public async connect(): Promise<void> {\n await this.getConnection();\n }\n\n public async close(code: WebsocketsCloseCode, reason: string): Promise<boolean> {\n if (\n !connectionCache.ws ||\n connectionCache.ws.readyState === WebsocketsReadyState.CLOSED ||\n connectionCache.ws.readyState === WebsocketsReadyState.CLOSING\n ) {\n connectionCache.ws = undefined as unknown as null;\n\n return true;\n }\n connectionCache.ws.close(code, reason);\n\n connectionCache.ws = undefined as unknown as null;\n return true;\n }\n\n public async send<T extends IGenericData = IGenericData>(data: T): Promise<void> {\n const connection = await this.getConnection();\n if (connection.readyState !== WebsocketsReadyState.OPEN) {\n console.info(\"Websocket connection is not open, cannot send any data.\", data);\n return;\n }\n connection.send(JSON.stringify(data));\n }\n\n public isConnected(): boolean {\n return connectionCache.ws?.readyState === WebsocketsReadyState.OPEN;\n }\n\n public isClosed(): boolean {\n return connectionCache.ws?.readyState === WebsocketsReadyState.CLOSED;\n }\n\n private async createUrl(): Promise<ICreateUrlResult | null> {\n const token = await this.getToken();\n if (!token) {\n console.error(`Missing token to connect to websockets.`);\n return null;\n }\n return {\n token,\n url: `${this.url}?token=${token}&tenant=${this.tenant}`\n };\n }\n\n private async getConnection(): Promise<WebSocket> {\n if (connectionCache.ws?.readyState === WebsocketsReadyState.OPEN) {\n return connectionCache.ws;\n } else if (connectionCache.ws?.readyState === WebsocketsReadyState.CONNECTING) {\n return connectionCache.ws;\n }\n\n const result = await this.createUrl();\n if (!result) {\n throw new Error(`Missing URL for WebSocket to connect to.`);\n }\n const { url } = result;\n\n connectionCache.ws = this.factory(url, this.protocol);\n\n const start = new Date().getTime();\n\n console.log(`Websockets connecting to ${this.url}...`);\n\n connectionCache.ws.addEventListener(\"open\", event => {\n const end = new Date().getTime();\n console.log(`...connected in ${end - start}ms.`);\n return this.subscriptionManager.triggerOnOpen(event);\n });\n connectionCache.ws.addEventListener(\"close\", event => {\n return this.subscriptionManager.triggerOnClose(event);\n });\n connectionCache.ws.addEventListener(\"error\", event => {\n console.info(`Error in the Websocket connection.`, event);\n /**\n * Let's close it if possible.\n * It will reopen automatically.\n */\n if (connectionCache.ws?.close) {\n try {\n connectionCache.ws.close();\n } catch (ex) {\n console.error(ex);\n }\n }\n return this.subscriptionManager.triggerOnError(event);\n });\n\n connectionCache.ws.addEventListener(\n \"message\",\n (event: IWebsocketsManagerMessageEvent<string>) => {\n return this.subscriptionManager.triggerOnMessage(event);\n }\n );\n\n return connectionCache.ws;\n }\n}\n\nexport const createWebsocketsConnection = (\n params: IWebsocketsConnectionParams\n): IWebsocketsConnection => {\n return new WebsocketsConnection(params);\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"domain/WebsocketsConnection.js","sources":["../../src/domain/WebsocketsConnection.ts"],"sourcesContent":["import type {\n IGenericData,\n IWebsocketsConnection,\n IWebsocketsConnectionFactory,\n IWebsocketsConnectProtocol,\n IWebsocketsManagerMessageEvent,\n IWebsocketsSubscriptionManager,\n WebsocketsCloseCode\n} from \"./types.js\";\nimport { WebsocketsReadyState } from \"./types.js\";\n\ninterface ICreateUrlResult {\n token: string;\n url: string;\n}\n\nconst defaultFactory: IWebsocketsConnectionFactory = (url, protocol) => {\n return new WebSocket(url, protocol);\n};\n\ninterface IConnection {\n ws: WebSocket | null;\n}\n\n/**\n * We need to attach the websockets cache to window object, or it will be reset on every hot reload.\n */\ndeclare global {\n interface Window {\n WebinyWebsocketsConnectionCache: IConnection;\n }\n}\n\nif (!window.WebinyWebsocketsConnectionCache) {\n window.WebinyWebsocketsConnectionCache = {\n ws: null\n };\n}\n\nconst connectionCache = window.WebinyWebsocketsConnectionCache;\n\nexport interface IWebsocketsConnectionParams {\n url: string;\n tenant: string;\n getToken(): Promise<string | undefined>;\n subscriptionManager: IWebsocketsSubscriptionManager;\n protocol?: IWebsocketsConnectProtocol;\n factory?: IWebsocketsConnectionFactory;\n}\n\nexport class WebsocketsConnection implements IWebsocketsConnection {\n private readonly url: string;\n private readonly getToken: () => Promise<string | undefined>;\n private tenant: string;\n private readonly protocol: IWebsocketsConnectProtocol;\n public readonly subscriptionManager: IWebsocketsSubscriptionManager;\n private readonly factory: IWebsocketsConnectionFactory;\n\n public constructor(params: IWebsocketsConnectionParams) {\n this.url = params.url;\n this.tenant = params.tenant;\n this.getToken = params.getToken;\n this.protocol = params.protocol;\n this.subscriptionManager = params.subscriptionManager;\n this.factory = params.factory || defaultFactory;\n }\n\n public setTenant(tenant: string): void {\n this.tenant = tenant;\n }\n\n public async connect(): Promise<void> {\n await this.getConnection();\n }\n\n public async close(code: WebsocketsCloseCode, reason: string): Promise<boolean> {\n if (\n !connectionCache.ws ||\n connectionCache.ws.readyState === WebsocketsReadyState.CLOSED ||\n connectionCache.ws.readyState === WebsocketsReadyState.CLOSING\n ) {\n connectionCache.ws = undefined as unknown as null;\n\n return true;\n }\n connectionCache.ws.close(code, reason);\n\n connectionCache.ws = undefined as unknown as null;\n return true;\n }\n\n public async send<T extends IGenericData = IGenericData>(data: T): Promise<void> {\n const connection = await this.getConnection();\n if (connection.readyState !== WebsocketsReadyState.OPEN) {\n console.info(\"Websocket connection is not open, cannot send any data.\", data);\n return;\n }\n connection.send(JSON.stringify(data));\n }\n\n public isConnected(): boolean {\n return connectionCache.ws?.readyState === WebsocketsReadyState.OPEN;\n }\n\n public isClosed(): boolean {\n return connectionCache.ws?.readyState === WebsocketsReadyState.CLOSED;\n }\n\n private async createUrl(): Promise<ICreateUrlResult | null> {\n const token = await this.getToken();\n if (!token) {\n console.error(`Missing token to connect to websockets.`);\n return null;\n }\n return {\n token,\n url: `${this.url}?token=${token}&tenant=${this.tenant}`\n };\n }\n\n private async getConnection(): Promise<WebSocket> {\n if (connectionCache.ws?.readyState === WebsocketsReadyState.OPEN) {\n return connectionCache.ws;\n } else if (connectionCache.ws?.readyState === WebsocketsReadyState.CONNECTING) {\n return connectionCache.ws;\n }\n\n const result = await this.createUrl();\n if (!result) {\n throw new Error(`Missing URL for WebSocket to connect to.`);\n }\n const { url } = result;\n\n connectionCache.ws = this.factory(url, this.protocol);\n\n const start = new Date().getTime();\n\n console.log(`Websockets connecting to ${this.url}...`);\n\n connectionCache.ws.addEventListener(\"open\", event => {\n const end = new Date().getTime();\n console.log(`...connected in ${end - start}ms.`);\n return this.subscriptionManager.triggerOnOpen(event);\n });\n connectionCache.ws.addEventListener(\"close\", event => {\n return this.subscriptionManager.triggerOnClose(event);\n });\n connectionCache.ws.addEventListener(\"error\", event => {\n console.info(`Error in the Websocket connection.`, event);\n /**\n * Let's close it if possible.\n * It will reopen automatically.\n */\n if (connectionCache.ws?.close) {\n try {\n connectionCache.ws.close();\n } catch (ex) {\n console.error(ex);\n }\n }\n return this.subscriptionManager.triggerOnError(event);\n });\n\n connectionCache.ws.addEventListener(\n \"message\",\n (event: IWebsocketsManagerMessageEvent<string>) => {\n return this.subscriptionManager.triggerOnMessage(event);\n }\n );\n\n return connectionCache.ws;\n }\n}\n\nexport const createWebsocketsConnection = (\n params: IWebsocketsConnectionParams\n): IWebsocketsConnection => {\n return new WebsocketsConnection(params);\n};\n"],"names":["defaultFactory","url","protocol","WebSocket","window","connectionCache","WebsocketsConnection","params","tenant","code","reason","WebsocketsReadyState","undefined","data","connection","console","JSON","token","result","Error","start","Date","event","end","ex","createWebsocketsConnection"],"mappings":"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"}
|
|
@@ -1,37 +1,36 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
class WebsocketsManager {
|
|
2
|
+
constructor(connection){
|
|
3
|
+
this.connection = connection;
|
|
4
|
+
}
|
|
5
|
+
onOpen(cb) {
|
|
6
|
+
return this.connection.subscriptionManager.onOpen(cb);
|
|
7
|
+
}
|
|
8
|
+
onClose(cb) {
|
|
9
|
+
return this.connection.subscriptionManager.onClose(cb);
|
|
10
|
+
}
|
|
11
|
+
onMessage(cb) {
|
|
12
|
+
return this.connection.subscriptionManager.onMessage(cb);
|
|
13
|
+
}
|
|
14
|
+
onError(cb) {
|
|
15
|
+
return this.connection.subscriptionManager.onError(cb);
|
|
16
|
+
}
|
|
17
|
+
async connect() {
|
|
18
|
+
return this.connection.connect();
|
|
19
|
+
}
|
|
20
|
+
async close(code, reason) {
|
|
21
|
+
return await this.connection.close(code, reason);
|
|
22
|
+
}
|
|
23
|
+
send(data) {
|
|
24
|
+
return this.connection.send(data);
|
|
25
|
+
}
|
|
26
|
+
isConnected() {
|
|
27
|
+
return this.connection.isConnected();
|
|
28
|
+
}
|
|
29
|
+
isClosed() {
|
|
30
|
+
return this.connection.isClosed();
|
|
31
|
+
}
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
33
|
+
const createWebsocketsManager = (connection)=>new WebsocketsManager(connection);
|
|
34
|
+
export { WebsocketsManager, createWebsocketsManager };
|
|
36
35
|
|
|
37
36
|
//# sourceMappingURL=WebsocketsManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"domain/WebsocketsManager.js","sources":["../../src/domain/WebsocketsManager.ts"],"sourcesContent":["import type {\n IGenericData,\n IWebsocketsConnection,\n IWebsocketsManager,\n IWebsocketsManagerCloseEvent,\n IWebsocketsManagerErrorEvent,\n IWebsocketsManagerMessageEvent,\n IWebsocketsManagerOpenEvent,\n IWebsocketManagerSendData,\n IWebsocketsSubscription,\n IWebsocketsSubscriptionCallback,\n WebsocketsCloseCode\n} from \"./types.js\";\n\nexport class WebsocketsManager implements IWebsocketsManager {\n public readonly connection: IWebsocketsConnection;\n\n public constructor(connection: IWebsocketsConnection) {\n this.connection = connection;\n }\n\n public onOpen(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerOpenEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerOpenEvent> {\n return this.connection.subscriptionManager.onOpen(cb);\n }\n\n public onClose(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerCloseEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerCloseEvent> {\n return this.connection.subscriptionManager.onClose(cb);\n }\n\n public onMessage<T extends IGenericData = IGenericData>(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerMessageEvent<T>>\n ): IWebsocketsSubscription<IWebsocketsManagerMessageEvent<T>> {\n return this.connection.subscriptionManager.onMessage<T>(cb);\n }\n\n public onError(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerErrorEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerErrorEvent> {\n return this.connection.subscriptionManager.onError(cb);\n }\n\n public async connect(): Promise<void> {\n return this.connection.connect();\n }\n\n public async close(code: WebsocketsCloseCode, reason: string): Promise<boolean> {\n return await this.connection.close(code, reason);\n }\n\n public send<T extends IWebsocketManagerSendData = IWebsocketManagerSendData>(data: T): void {\n return this.connection.send<T>(data);\n }\n\n public isConnected(): boolean {\n return this.connection.isConnected();\n }\n\n public isClosed(): boolean {\n return this.connection.isClosed();\n }\n}\n\nexport const createWebsocketsManager = (connection: IWebsocketsConnection): IWebsocketsManager => {\n return new WebsocketsManager(connection);\n};\n"],"names":["WebsocketsManager","connection","cb","code","reason","data","createWebsocketsManager"],"mappings":"AAcO,MAAMA;IAGT,YAAmBC,UAAiC,CAAE;QAClD,IAAI,CAAC,UAAU,GAAGA;IACtB;IAEO,OACHC,EAAgE,EACZ;QACpD,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,MAAM,CAACA;IACtD;IAEO,QACHA,EAAiE,EACZ;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAACA;IACvD;IAEO,UACHA,EAAsE,EACZ;QAC1D,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,SAAS,CAAIA;IAC5D;IAEO,QACHA,EAAiE,EACZ;QACrD,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAACA;IACvD;IAEA,MAAa,UAAyB;QAClC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO;IAClC;IAEA,MAAa,MAAMC,IAAyB,EAAEC,MAAc,EAAoB;QAC5E,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAACD,MAAMC;IAC7C;IAEO,KAAsEC,IAAO,EAAQ;QACxF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAIA;IACnC;IAEO,cAAuB;QAC1B,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW;IACtC;IAEO,WAAoB;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ;IACnC;AACJ;AAEO,MAAMC,0BAA0B,CAACL,aAC7B,IAAID,kBAAkBC"}
|
|
@@ -1,73 +1,66 @@
|
|
|
1
1
|
import { generateId } from "@webiny/utils/generateId.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
message: {}
|
|
8
|
-
};
|
|
9
|
-
onOpen(cb) {
|
|
10
|
-
const value = this.createSubscription("open", cb);
|
|
11
|
-
this.subscriptions.close[value.id] = value;
|
|
12
|
-
return value;
|
|
13
|
-
}
|
|
14
|
-
onClose(cb) {
|
|
15
|
-
const value = this.createSubscription("close", cb);
|
|
16
|
-
this.subscriptions.close[value.id] = value;
|
|
17
|
-
return value;
|
|
18
|
-
}
|
|
19
|
-
onError(cb) {
|
|
20
|
-
const value = this.createSubscription("error", cb);
|
|
21
|
-
this.subscriptions.error[value.id] = value;
|
|
22
|
-
return value;
|
|
23
|
-
}
|
|
24
|
-
onMessage(cb) {
|
|
25
|
-
const value = this.createSubscription("message", cb);
|
|
26
|
-
this.subscriptions.message[value.id] = value;
|
|
27
|
-
return value;
|
|
28
|
-
}
|
|
29
|
-
async triggerOnOpen(event) {
|
|
30
|
-
for (const id in this.subscriptions.open) {
|
|
31
|
-
await this.subscriptions.open[id].cb(event);
|
|
2
|
+
class WebsocketsSubscriptionManager {
|
|
3
|
+
onOpen(cb) {
|
|
4
|
+
const value = this.createSubscription("open", cb);
|
|
5
|
+
this.subscriptions.close[value.id] = value;
|
|
6
|
+
return value;
|
|
32
7
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
8
|
+
onClose(cb) {
|
|
9
|
+
const value = this.createSubscription("close", cb);
|
|
10
|
+
this.subscriptions.close[value.id] = value;
|
|
11
|
+
return value;
|
|
37
12
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
13
|
+
onError(cb) {
|
|
14
|
+
const value = this.createSubscription("error", cb);
|
|
15
|
+
this.subscriptions.error[value.id] = value;
|
|
16
|
+
return value;
|
|
42
17
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
data = JSON.parse(event.data);
|
|
48
|
-
} catch (ex) {
|
|
49
|
-
console.error("Failed to parse the incoming message.", ex);
|
|
18
|
+
onMessage(cb) {
|
|
19
|
+
const value = this.createSubscription("message", cb);
|
|
20
|
+
this.subscriptions.message[value.id] = value;
|
|
21
|
+
return value;
|
|
50
22
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
23
|
+
async triggerOnOpen(event) {
|
|
24
|
+
for(const id in this.subscriptions.open)await this.subscriptions.open[id].cb(event);
|
|
25
|
+
}
|
|
26
|
+
async triggerOnClose(event) {
|
|
27
|
+
for(const id in this.subscriptions.close)await this.subscriptions.close[id].cb(event);
|
|
28
|
+
}
|
|
29
|
+
async triggerOnError(event) {
|
|
30
|
+
for(const id in this.subscriptions.error)await this.subscriptions.error[id].cb(event);
|
|
31
|
+
}
|
|
32
|
+
async triggerOnMessage(event) {
|
|
33
|
+
let data = {};
|
|
34
|
+
try {
|
|
35
|
+
data = JSON.parse(event.data);
|
|
36
|
+
} catch (ex) {
|
|
37
|
+
console.error("Failed to parse the incoming message.", ex);
|
|
38
|
+
}
|
|
39
|
+
for(const id in this.subscriptions.message)await this.subscriptions.message[id].cb({
|
|
40
|
+
...event,
|
|
41
|
+
data: data || {}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
createSubscription(type, cb) {
|
|
45
|
+
const id = generateId();
|
|
46
|
+
return {
|
|
47
|
+
cb,
|
|
48
|
+
id,
|
|
49
|
+
off: ()=>{
|
|
50
|
+
delete this.subscriptions[type][id];
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
constructor(){
|
|
55
|
+
this.subscriptions = {
|
|
56
|
+
open: {},
|
|
57
|
+
close: {},
|
|
58
|
+
error: {},
|
|
59
|
+
message: {}
|
|
60
|
+
};
|
|
56
61
|
}
|
|
57
|
-
}
|
|
58
|
-
createSubscription(type, cb) {
|
|
59
|
-
const id = generateId();
|
|
60
|
-
return {
|
|
61
|
-
cb,
|
|
62
|
-
id,
|
|
63
|
-
off: () => {
|
|
64
|
-
delete this.subscriptions[type][id];
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
62
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
};
|
|
63
|
+
const createWebsocketsSubscriptionManager = ()=>new WebsocketsSubscriptionManager();
|
|
64
|
+
export { WebsocketsSubscriptionManager, createWebsocketsSubscriptionManager };
|
|
72
65
|
|
|
73
66
|
//# sourceMappingURL=WebsocketsSubscriptionManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"domain/WebsocketsSubscriptionManager.js","sources":["../../src/domain/WebsocketsSubscriptionManager.ts"],"sourcesContent":["import { generateId } from \"@webiny/utils/generateId.js\";\nimport type {\n IGenericData,\n IWebsocketsManagerCloseEvent,\n IWebsocketsManagerErrorEvent,\n IWebsocketManagerEvent,\n IWebsocketsManagerMessageEvent,\n IWebsocketsManagerOpenEvent\n} from \"./types.js\";\nimport type {\n IWebsocketsSubscriptionManagerSubscriptions,\n IWebsocketsSubscription,\n IWebsocketsSubscriptionCallback,\n IWebsocketsSubscriptionManager\n} from \"./abstractions/IWebsocketsSubscriptionManager.js\";\n\nexport class WebsocketsSubscriptionManager implements IWebsocketsSubscriptionManager {\n private subscriptions: IWebsocketsSubscriptionManagerSubscriptions = {\n open: {},\n close: {},\n error: {},\n message: {}\n };\n\n public onOpen(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerOpenEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerOpenEvent> {\n const value = this.createSubscription<IWebsocketsManagerOpenEvent>(\"open\", cb);\n this.subscriptions.close[value.id] = value;\n return value;\n }\n\n public onClose(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerCloseEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerCloseEvent> {\n const value = this.createSubscription<IWebsocketsManagerCloseEvent>(\"close\", cb);\n this.subscriptions.close[value.id] = value;\n return value;\n }\n\n public onError(\n cb: IWebsocketsSubscriptionCallback<IWebsocketsManagerErrorEvent>\n ): IWebsocketsSubscription<IWebsocketsManagerErrorEvent> {\n const value = this.createSubscription<IWebsocketsManagerErrorEvent>(\"error\", cb);\n this.subscriptions.error[value.id] = value;\n return value;\n }\n\n public onMessage<T extends IGenericData = IGenericData>(\n cb: IWebsocketsSubscriptionCallback<T>\n ): IWebsocketsSubscription<T> {\n const value = this.createSubscription<T>(\"message\", cb);\n this.subscriptions.message[value.id] = value;\n return value;\n }\n\n public async triggerOnOpen(event: Event): Promise<void> {\n for (const id in this.subscriptions.open) {\n await this.subscriptions.open[id].cb(event);\n }\n }\n\n public async triggerOnClose(event: CloseEvent): Promise<void> {\n for (const id in this.subscriptions.close) {\n await this.subscriptions.close[id].cb(event);\n }\n }\n\n public async triggerOnError(event: Event): Promise<void> {\n for (const id in this.subscriptions.error) {\n await this.subscriptions.error[id].cb(event);\n }\n }\n\n public async triggerOnMessage(event: IWebsocketsManagerMessageEvent<string>): Promise<void> {\n let data: IGenericData = {};\n try {\n data = JSON.parse(event.data);\n } catch (ex) {\n console.error(\"Failed to parse the incoming message.\", ex);\n }\n for (const id in this.subscriptions.message) {\n await this.subscriptions.message[id].cb({\n ...event,\n data: data || {}\n });\n }\n }\n\n private createSubscription<T>(\n type: IWebsocketManagerEvent,\n cb: IWebsocketsSubscriptionCallback<T>\n ): IWebsocketsSubscription<T> {\n const id = generateId();\n return {\n cb,\n id,\n off: () => {\n delete this.subscriptions[type][id];\n }\n };\n }\n}\n\nexport const createWebsocketsSubscriptionManager = (): IWebsocketsSubscriptionManager => {\n return new WebsocketsSubscriptionManager();\n};\n"],"names":["WebsocketsSubscriptionManager","cb","value","event","id","data","JSON","ex","console","type","generateId","createWebsocketsSubscriptionManager"],"mappings":";AAgBO,MAAMA;IAQF,OACHC,EAAgE,EACZ;QACpD,MAAMC,QAAQ,IAAI,CAAC,kBAAkB,CAA8B,QAAQD;QAC3E,IAAI,CAAC,aAAa,CAAC,KAAK,CAACC,MAAM,EAAE,CAAC,GAAGA;QACrC,OAAOA;IACX;IAEO,QACHD,EAAiE,EACZ;QACrD,MAAMC,QAAQ,IAAI,CAAC,kBAAkB,CAA+B,SAASD;QAC7E,IAAI,CAAC,aAAa,CAAC,KAAK,CAACC,MAAM,EAAE,CAAC,GAAGA;QACrC,OAAOA;IACX;IAEO,QACHD,EAAiE,EACZ;QACrD,MAAMC,QAAQ,IAAI,CAAC,kBAAkB,CAA+B,SAASD;QAC7E,IAAI,CAAC,aAAa,CAAC,KAAK,CAACC,MAAM,EAAE,CAAC,GAAGA;QACrC,OAAOA;IACX;IAEO,UACHD,EAAsC,EACZ;QAC1B,MAAMC,QAAQ,IAAI,CAAC,kBAAkB,CAAI,WAAWD;QACpD,IAAI,CAAC,aAAa,CAAC,OAAO,CAACC,MAAM,EAAE,CAAC,GAAGA;QACvC,OAAOA;IACX;IAEA,MAAa,cAAcC,KAAY,EAAiB;QACpD,IAAK,MAAMC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CACpC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAACA,GAAG,CAAC,EAAE,CAACD;IAE7C;IAEA,MAAa,eAAeA,KAAiB,EAAiB;QAC1D,IAAK,MAAMC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CACrC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAACA,GAAG,CAAC,EAAE,CAACD;IAE9C;IAEA,MAAa,eAAeA,KAAY,EAAiB;QACrD,IAAK,MAAMC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CACrC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAACA,GAAG,CAAC,EAAE,CAACD;IAE9C;IAEA,MAAa,iBAAiBA,KAA6C,EAAiB;QACxF,IAAIE,OAAqB,CAAC;QAC1B,IAAI;YACAA,OAAOC,KAAK,KAAK,CAACH,MAAM,IAAI;QAChC,EAAE,OAAOI,IAAI;YACTC,QAAQ,KAAK,CAAC,yCAAyCD;QAC3D;QACA,IAAK,MAAMH,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CACvC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAACA,GAAG,CAAC,EAAE,CAAC;YACpC,GAAGD,KAAK;YACR,MAAME,QAAQ,CAAC;QACnB;IAER;IAEQ,mBACJI,IAA4B,EAC5BR,EAAsC,EACZ;QAC1B,MAAMG,KAAKM;QACX,OAAO;YACHT;YACAG;YACA,KAAK;gBACD,OAAO,IAAI,CAAC,aAAa,CAACK,KAAK,CAACL,GAAG;YACvC;QACJ;IACJ;;aApFQ,aAAa,GAAgD;YACjE,MAAM,CAAC;YACP,OAAO,CAAC;YACR,OAAO,CAAC;YACR,SAAS,CAAC;QACd;;AAgFJ;AAEO,MAAMO,sCAAsC,IACxC,IAAIX"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
var IWebsocketsConnection_WebsocketsReadyState = /*#__PURE__*/ function(WebsocketsReadyState) {
|
|
2
|
+
WebsocketsReadyState[WebsocketsReadyState["CONNECTING"] = 0] = "CONNECTING";
|
|
3
|
+
WebsocketsReadyState[WebsocketsReadyState["OPEN"] = 1] = "OPEN";
|
|
4
|
+
WebsocketsReadyState[WebsocketsReadyState["CLOSING"] = 2] = "CLOSING";
|
|
5
|
+
WebsocketsReadyState[WebsocketsReadyState["CLOSED"] = 3] = "CLOSED";
|
|
6
|
+
return WebsocketsReadyState;
|
|
7
7
|
}({});
|
|
8
|
+
export { IWebsocketsConnection_WebsocketsReadyState as WebsocketsReadyState };
|
|
8
9
|
|
|
9
10
|
//# sourceMappingURL=IWebsocketsConnection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"domain/abstractions/IWebsocketsConnection.js","sources":["../../../src/domain/abstractions/IWebsocketsConnection.ts"],"sourcesContent":["import type { IWebsocketsSubscriptionManager } from \"./IWebsocketsSubscriptionManager.js\";\nimport type { IGenericData, WebsocketsCloseCode } from \"./types.js\";\n\nexport type IWebsocketsConnectProtocol = string | string[] | undefined;\n\nexport interface IWebsocketsConnectionFactory {\n (url: string, protocol?: IWebsocketsConnectProtocol): WebSocket;\n}\n\nexport enum WebsocketsReadyState {\n CONNECTING = 0,\n OPEN = 1,\n CLOSING = 2,\n CLOSED = 3\n}\n\nexport interface IWebsocketsConnection {\n readonly subscriptionManager: IWebsocketsSubscriptionManager;\n\n isConnected(): boolean;\n isClosed(): boolean;\n\n connect(): Promise<void>;\n close(code: WebsocketsCloseCode, reason: string): Promise<boolean>;\n send<T extends IGenericData = IGenericData>(data: T): void;\n}\n"],"names":["WebsocketsReadyState"],"mappings":"AASO,IAAKA,6CAAoBA,WAAAA,GAAAA,SAApBA,oBAAoB;;;;;WAApBA"}
|
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
1
|
+
var types_WebsocketsCloseCode = /*#__PURE__*/ function(WebsocketsCloseCode) {
|
|
2
|
+
WebsocketsCloseCode[WebsocketsCloseCode["NORMAL"] = 1000] = "NORMAL";
|
|
3
|
+
WebsocketsCloseCode[WebsocketsCloseCode["GOING_AWAY"] = 1001] = "GOING_AWAY";
|
|
4
|
+
WebsocketsCloseCode[WebsocketsCloseCode["PROTOCOL_ERROR"] = 1002] = "PROTOCOL_ERROR";
|
|
5
|
+
WebsocketsCloseCode[WebsocketsCloseCode["CANNOT_ACCEPT"] = 1003] = "CANNOT_ACCEPT";
|
|
6
|
+
WebsocketsCloseCode[WebsocketsCloseCode["RESERVED"] = 1004] = "RESERVED";
|
|
7
|
+
WebsocketsCloseCode[WebsocketsCloseCode["NO_STATUS"] = 1005] = "NO_STATUS";
|
|
8
|
+
WebsocketsCloseCode[WebsocketsCloseCode["ABNORMAL"] = 1006] = "ABNORMAL";
|
|
9
|
+
WebsocketsCloseCode[WebsocketsCloseCode["INVALID_DATA"] = 1007] = "INVALID_DATA";
|
|
10
|
+
WebsocketsCloseCode[WebsocketsCloseCode["POLICY_VIOLATION"] = 1008] = "POLICY_VIOLATION";
|
|
11
|
+
WebsocketsCloseCode[WebsocketsCloseCode["TOO_BIG"] = 1009] = "TOO_BIG";
|
|
12
|
+
WebsocketsCloseCode[WebsocketsCloseCode["MISSING_EXTENSION"] = 1010] = "MISSING_EXTENSION";
|
|
13
|
+
WebsocketsCloseCode[WebsocketsCloseCode["SERVER_ERROR"] = 1011] = "SERVER_ERROR";
|
|
14
|
+
WebsocketsCloseCode[WebsocketsCloseCode["SERVICE_RESTART"] = 1012] = "SERVICE_RESTART";
|
|
15
|
+
WebsocketsCloseCode[WebsocketsCloseCode["TRY_AGAIN_LATER"] = 1013] = "TRY_AGAIN_LATER";
|
|
16
|
+
WebsocketsCloseCode[WebsocketsCloseCode["BAD_GATEWAY"] = 1014] = "BAD_GATEWAY";
|
|
17
|
+
WebsocketsCloseCode[WebsocketsCloseCode["TLS_HANDSHAKE"] = 1015] = "TLS_HANDSHAKE";
|
|
18
|
+
return WebsocketsCloseCode;
|
|
19
19
|
}({});
|
|
20
|
+
export { types_WebsocketsCloseCode as WebsocketsCloseCode };
|
|
20
21
|
|
|
21
22
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"domain/abstractions/types.js","sources":["../../../src/domain/abstractions/types.ts"],"sourcesContent":["import type { GenericRecord } from \"@webiny/app/types.js\";\n\nexport type IWebsocketsManagerMessageEvent<T = IGenericData> = MessageEvent<T>;\nexport type IWebsocketsManagerCloseEvent = CloseEvent;\nexport type IWebsocketsManagerOpenEvent = Event;\nexport type IWebsocketsManagerErrorEvent = Event;\n\nexport type IGenericData = GenericRecord;\n\nexport enum WebsocketsCloseCode {\n NORMAL = 1000,\n GOING_AWAY = 1001,\n PROTOCOL_ERROR = 1002,\n CANNOT_ACCEPT = 1003,\n RESERVED = 1004,\n NO_STATUS = 1005,\n ABNORMAL = 1006,\n INVALID_DATA = 1007,\n POLICY_VIOLATION = 1008,\n TOO_BIG = 1009,\n MISSING_EXTENSION = 1010,\n SERVER_ERROR = 1011,\n SERVICE_RESTART = 1012,\n TRY_AGAIN_LATER = 1013,\n BAD_GATEWAY = 1014,\n TLS_HANDSHAKE = 1015\n}\n"],"names":["WebsocketsCloseCode"],"mappings":"AASO,IAAKA,4BAAmBA,WAAAA,GAAAA,SAAnBA,mBAAmB;;;;;;;;;;;;;;;;;WAAnBA"}
|
package/domain/index.js
CHANGED
package/domain/types.js
CHANGED
package/hooks/index.js
CHANGED