@webiny/api-websockets 0.0.0-unstable.e53eceafb5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/context/WebsocketsContext.d.ts +13 -0
  4. package/context/WebsocketsContext.js +70 -0
  5. package/context/WebsocketsContext.js.map +1 -0
  6. package/context/abstractions/IWebsocketsContext.d.ts +22 -0
  7. package/context/abstractions/IWebsocketsContext.js +7 -0
  8. package/context/abstractions/IWebsocketsContext.js.map +1 -0
  9. package/context/index.d.ts +5 -0
  10. package/context/index.js +53 -0
  11. package/context/index.js.map +1 -0
  12. package/graphql/checkPermissions.d.ts +7 -0
  13. package/graphql/checkPermissions.js +21 -0
  14. package/graphql/checkPermissions.js.map +1 -0
  15. package/graphql/createResolvers.d.ts +13 -0
  16. package/graphql/createResolvers.js +68 -0
  17. package/graphql/createResolvers.js.map +1 -0
  18. package/graphql/createTypeDefs.d.ts +1 -0
  19. package/graphql/createTypeDefs.js +78 -0
  20. package/graphql/createTypeDefs.js.map +1 -0
  21. package/graphql/index.d.ts +2 -0
  22. package/graphql/index.js +20 -0
  23. package/graphql/index.js.map +1 -0
  24. package/graphql/utils.d.ts +7 -0
  25. package/graphql/utils.js +19 -0
  26. package/graphql/utils.js.map +1 -0
  27. package/handler/handler.d.ts +2 -0
  28. package/handler/handler.js +84 -0
  29. package/handler/handler.js.map +1 -0
  30. package/handler/headers.d.ts +7 -0
  31. package/handler/headers.js +46 -0
  32. package/handler/headers.js.map +1 -0
  33. package/handler/register.d.ts +1 -0
  34. package/handler/register.js +28 -0
  35. package/handler/register.js.map +1 -0
  36. package/handler/types.d.ts +73 -0
  37. package/handler/types.js +20 -0
  38. package/handler/types.js.map +1 -0
  39. package/index.d.ts +10 -0
  40. package/index.js +101 -0
  41. package/index.js.map +1 -0
  42. package/package.json +48 -0
  43. package/plugins/WebsocketsActionPlugin.d.ts +11 -0
  44. package/plugins/WebsocketsActionPlugin.js +25 -0
  45. package/plugins/WebsocketsActionPlugin.js.map +1 -0
  46. package/plugins/WebsocketsRoutePlugin.d.ts +28 -0
  47. package/plugins/WebsocketsRoutePlugin.js +25 -0
  48. package/plugins/WebsocketsRoutePlugin.js.map +1 -0
  49. package/plugins/abstrations/IWebsocketsActionPlugin.d.ts +35 -0
  50. package/plugins/abstrations/IWebsocketsActionPlugin.js +7 -0
  51. package/plugins/abstrations/IWebsocketsActionPlugin.js.map +1 -0
  52. package/plugins/index.d.ts +3 -0
  53. package/plugins/index.js +40 -0
  54. package/plugins/index.js.map +1 -0
  55. package/registry/WebsocketsConnectionRegistry.d.ts +23 -0
  56. package/registry/WebsocketsConnectionRegistry.js +182 -0
  57. package/registry/WebsocketsConnectionRegistry.js.map +1 -0
  58. package/registry/abstractions/IWebsocketsConnectionRegistry.d.ts +33 -0
  59. package/registry/abstractions/IWebsocketsConnectionRegistry.js +7 -0
  60. package/registry/abstractions/IWebsocketsConnectionRegistry.js.map +1 -0
  61. package/registry/entity.d.ts +108 -0
  62. package/registry/entity.js +62 -0
  63. package/registry/entity.js.map +1 -0
  64. package/registry/index.d.ts +2 -0
  65. package/registry/index.js +29 -0
  66. package/registry/index.js.map +1 -0
  67. package/response/WebsocketsResponse.d.ts +5 -0
  68. package/response/WebsocketsResponse.js +29 -0
  69. package/response/WebsocketsResponse.js.map +1 -0
  70. package/response/abstractions/IWebsocketsResponse.d.ts +29 -0
  71. package/response/abstractions/IWebsocketsResponse.js +7 -0
  72. package/response/abstractions/IWebsocketsResponse.js.map +1 -0
  73. package/response/index.d.ts +2 -0
  74. package/response/index.js +29 -0
  75. package/response/index.js.map +1 -0
  76. package/runner/WebsocketsRunner.d.ts +17 -0
  77. package/runner/WebsocketsRunner.js +191 -0
  78. package/runner/WebsocketsRunner.js.map +1 -0
  79. package/runner/abstractions/IWebsocketsRunner.d.ts +16 -0
  80. package/runner/abstractions/IWebsocketsRunner.js +7 -0
  81. package/runner/abstractions/IWebsocketsRunner.js.map +1 -0
  82. package/runner/index.d.ts +2 -0
  83. package/runner/index.js +29 -0
  84. package/runner/index.js.map +1 -0
  85. package/runner/routes/connect.d.ts +1 -0
  86. package/runner/routes/connect.js +57 -0
  87. package/runner/routes/connect.js.map +1 -0
  88. package/runner/routes/default.d.ts +1 -0
  89. package/runner/routes/default.js +40 -0
  90. package/runner/routes/default.js.map +1 -0
  91. package/runner/routes/disconnect.d.ts +1 -0
  92. package/runner/routes/disconnect.js +26 -0
  93. package/runner/routes/disconnect.js.map +1 -0
  94. package/runner/routes/index.d.ts +1 -0
  95. package/runner/routes/index.js +15 -0
  96. package/runner/routes/index.js.map +1 -0
  97. package/transport/WebsocketsTransport.d.ts +8 -0
  98. package/transport/WebsocketsTransport.js +54 -0
  99. package/transport/WebsocketsTransport.js.map +1 -0
  100. package/transport/abstractions/IWebsocketsTransport.d.ts +20 -0
  101. package/transport/abstractions/IWebsocketsTransport.js +7 -0
  102. package/transport/abstractions/IWebsocketsTransport.js.map +1 -0
  103. package/transport/index.d.ts +2 -0
  104. package/transport/index.js +29 -0
  105. package/transport/index.js.map +1 -0
  106. package/types.d.ts +12 -0
  107. package/types.js +7 -0
  108. package/types.js.map +1 -0
  109. package/utils/middleware.d.ts +5 -0
  110. package/utils/middleware.js +25 -0
  111. package/utils/middleware.js.map +1 -0
  112. package/validator/WebsocketsEventValidator.d.ts +5 -0
  113. package/validator/WebsocketsEventValidator.js +85 -0
  114. package/validator/WebsocketsEventValidator.js.map +1 -0
  115. package/validator/abstractions/IWebsocketsEventValidator.d.ts +8 -0
  116. package/validator/abstractions/IWebsocketsEventValidator.js +7 -0
  117. package/validator/abstractions/IWebsocketsEventValidator.js.map +1 -0
  118. package/validator/index.d.ts +2 -0
  119. package/validator/index.js +29 -0
  120. package/validator/index.js.map +1 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # @webiny/api-websockets
2
+ [![](https://img.shields.io/npm/dw/@webiny/api-websockets.svg)](https://www.npmjs.com/package/@webiny/api-websockets)
3
+ [![](https://img.shields.io/npm/v/@webiny/api-websockets.svg)](https://www.npmjs.com/package/@webiny/api-websockets)
4
+ [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
5
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
6
+
7
+ ## Install
8
+ ```
9
+ yarn add @webiny/api-websockets
10
+ ```
@@ -0,0 +1,13 @@
1
+ import type { IWebsocketsConnectionRegistry, IWebsocketsConnectionRegistryData } from "../registry";
2
+ import type { IWebsocketsContextObject, IWebsocketsContextDisconnectConnectionsParams, IWebsocketsContextListConnectionsParams, IWebsocketsIdentity } from "./abstractions/IWebsocketsContext";
3
+ import type { IWebsocketsTransport, IWebsocketsTransportSendConnection, IWebsocketsTransportSendData } from "../transport";
4
+ import type { GenericRecord } from "@webiny/api/types";
5
+ export declare class WebsocketsContext implements IWebsocketsContextObject {
6
+ readonly registry: IWebsocketsConnectionRegistry;
7
+ private readonly transport;
8
+ constructor(registry: IWebsocketsConnectionRegistry, transport: IWebsocketsTransport);
9
+ send<T extends GenericRecord = GenericRecord>(identity: Pick<IWebsocketsIdentity, "id">, data: IWebsocketsTransportSendData<T>): Promise<void>;
10
+ sendToConnections<T extends GenericRecord = GenericRecord>(connections: IWebsocketsTransportSendConnection[], data: IWebsocketsTransportSendData<T>): Promise<void>;
11
+ listConnections(params?: IWebsocketsContextListConnectionsParams): Promise<IWebsocketsConnectionRegistryData[]>;
12
+ disconnect(params?: IWebsocketsContextDisconnectConnectionsParams, notify?: boolean): Promise<IWebsocketsConnectionRegistryData[]>;
13
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.WebsocketsContext = void 0;
8
+ var _error = _interopRequireDefault(require("@webiny/error"));
9
+ class WebsocketsContext {
10
+ constructor(registry, transport) {
11
+ this.registry = registry;
12
+ this.transport = transport;
13
+ }
14
+ async send(identity, data) {
15
+ const connections = await this.listConnections({
16
+ where: {
17
+ identityId: identity.id
18
+ }
19
+ });
20
+ return this.transport.send(connections, data);
21
+ }
22
+ async sendToConnections(connections, data) {
23
+ return this.transport.send(connections, data);
24
+ }
25
+ async listConnections(params) {
26
+ const where = params?.where || {};
27
+ if (where.identityId) {
28
+ return await this.registry.listViaIdentity(where.identityId);
29
+ } else if (where.connections) {
30
+ return await this.registry.listViaConnections(where.connections);
31
+ } else if (where.tenant) {
32
+ return await this.registry.listViaTenant(where.tenant, where.locale);
33
+ }
34
+ return await this.registry.listAll();
35
+ }
36
+ async disconnect(params, notify = true) {
37
+ const connections = await this.listConnections(params);
38
+ for (const connection of connections) {
39
+ try {
40
+ await this.registry.unregister(connection);
41
+ } catch {
42
+ // do nothing
43
+ }
44
+ }
45
+ if (notify) {
46
+ try {
47
+ await this.transport.send(connections, {
48
+ action: "forcedDisconnect"
49
+ });
50
+ } catch (ex) {
51
+ throw new _error.default("Failed to notify the clients about the forced disconnect.", "FORCED_DISCONNECT_NOTIFICATION_ERROR", {
52
+ connections,
53
+ error: ex
54
+ });
55
+ }
56
+ }
57
+ try {
58
+ await this.transport.disconnect(connections);
59
+ } catch (ex) {
60
+ throw new _error.default("Failed to forcefully disconnect the Websocket clients.", "FORCED_DISCONNECT_ERROR", {
61
+ connections,
62
+ error: ex
63
+ });
64
+ }
65
+ return connections;
66
+ }
67
+ }
68
+ exports.WebsocketsContext = WebsocketsContext;
69
+
70
+ //# sourceMappingURL=WebsocketsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_error","_interopRequireDefault","require","WebsocketsContext","constructor","registry","transport","send","identity","data","connections","listConnections","where","identityId","id","sendToConnections","params","listViaIdentity","listViaConnections","tenant","listViaTenant","locale","listAll","disconnect","notify","connection","unregister","action","ex","WebinyError","error","exports"],"sources":["WebsocketsContext.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { IWebsocketsConnectionRegistry, IWebsocketsConnectionRegistryData } from \"~/registry\";\nimport type {\n IWebsocketsContextObject,\n IWebsocketsContextDisconnectConnectionsParams,\n IWebsocketsContextListConnectionsParams,\n IWebsocketsIdentity\n} from \"./abstractions/IWebsocketsContext\";\nimport type {\n IWebsocketsTransport,\n IWebsocketsTransportSendConnection,\n IWebsocketsTransportSendData\n} from \"~/transport\";\nimport type { GenericRecord } from \"@webiny/api/types\";\n\nexport class WebsocketsContext implements IWebsocketsContextObject {\n public readonly registry: IWebsocketsConnectionRegistry;\n private readonly transport: IWebsocketsTransport;\n\n constructor(registry: IWebsocketsConnectionRegistry, transport: IWebsocketsTransport) {\n this.registry = registry;\n this.transport = transport;\n }\n\n public async send<T extends GenericRecord = GenericRecord>(\n identity: Pick<IWebsocketsIdentity, \"id\">,\n data: IWebsocketsTransportSendData<T>\n ): Promise<void> {\n const connections = await this.listConnections({\n where: {\n identityId: identity.id\n }\n });\n return this.transport.send<T>(connections, data);\n }\n\n public async sendToConnections<T extends GenericRecord = GenericRecord>(\n connections: IWebsocketsTransportSendConnection[],\n data: IWebsocketsTransportSendData<T>\n ): Promise<void> {\n return this.transport.send<T>(connections, data);\n }\n\n public async listConnections(\n params?: IWebsocketsContextListConnectionsParams\n ): Promise<IWebsocketsConnectionRegistryData[]> {\n const where = params?.where || {};\n if (where.identityId) {\n return await this.registry.listViaIdentity(where.identityId);\n } else if (where.connections) {\n return await this.registry.listViaConnections(where.connections);\n } else if (where.tenant) {\n return await this.registry.listViaTenant(where.tenant, where.locale);\n }\n return await this.registry.listAll();\n }\n\n public async disconnect(\n params?: IWebsocketsContextDisconnectConnectionsParams,\n notify = true\n ): Promise<IWebsocketsConnectionRegistryData[]> {\n const connections = await this.listConnections(params);\n\n for (const connection of connections) {\n try {\n await this.registry.unregister(connection);\n } catch {\n // do nothing\n }\n }\n if (notify) {\n try {\n await this.transport.send(connections, {\n action: \"forcedDisconnect\"\n });\n } catch (ex) {\n throw new WebinyError(\n \"Failed to notify the clients about the forced disconnect.\",\n \"FORCED_DISCONNECT_NOTIFICATION_ERROR\",\n {\n connections,\n error: ex\n }\n );\n }\n }\n try {\n await this.transport.disconnect(connections);\n } catch (ex) {\n throw new WebinyError(\n \"Failed to forcefully disconnect the Websocket clients.\",\n \"FORCED_DISCONNECT_ERROR\",\n {\n connections,\n error: ex\n }\n );\n }\n\n return connections;\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAeO,MAAMC,iBAAiB,CAAqC;EAI/DC,WAAWA,CAACC,QAAuC,EAAEC,SAA+B,EAAE;IAClF,IAAI,CAACD,QAAQ,GAAGA,QAAQ;IACxB,IAAI,CAACC,SAAS,GAAGA,SAAS;EAC9B;EAEA,MAAaC,IAAIA,CACbC,QAAyC,EACzCC,IAAqC,EACxB;IACb,MAAMC,WAAW,GAAG,MAAM,IAAI,CAACC,eAAe,CAAC;MAC3CC,KAAK,EAAE;QACHC,UAAU,EAAEL,QAAQ,CAACM;MACzB;IACJ,CAAC,CAAC;IACF,OAAO,IAAI,CAACR,SAAS,CAACC,IAAI,CAAIG,WAAW,EAAED,IAAI,CAAC;EACpD;EAEA,MAAaM,iBAAiBA,CAC1BL,WAAiD,EACjDD,IAAqC,EACxB;IACb,OAAO,IAAI,CAACH,SAAS,CAACC,IAAI,CAAIG,WAAW,EAAED,IAAI,CAAC;EACpD;EAEA,MAAaE,eAAeA,CACxBK,MAAgD,EACJ;IAC5C,MAAMJ,KAAK,GAAGI,MAAM,EAAEJ,KAAK,IAAI,CAAC,CAAC;IACjC,IAAIA,KAAK,CAACC,UAAU,EAAE;MAClB,OAAO,MAAM,IAAI,CAACR,QAAQ,CAACY,eAAe,CAACL,KAAK,CAACC,UAAU,CAAC;IAChE,CAAC,MAAM,IAAID,KAAK,CAACF,WAAW,EAAE;MAC1B,OAAO,MAAM,IAAI,CAACL,QAAQ,CAACa,kBAAkB,CAACN,KAAK,CAACF,WAAW,CAAC;IACpE,CAAC,MAAM,IAAIE,KAAK,CAACO,MAAM,EAAE;MACrB,OAAO,MAAM,IAAI,CAACd,QAAQ,CAACe,aAAa,CAACR,KAAK,CAACO,MAAM,EAAEP,KAAK,CAACS,MAAM,CAAC;IACxE;IACA,OAAO,MAAM,IAAI,CAAChB,QAAQ,CAACiB,OAAO,CAAC,CAAC;EACxC;EAEA,MAAaC,UAAUA,CACnBP,MAAsD,EACtDQ,MAAM,GAAG,IAAI,EAC+B;IAC5C,MAAMd,WAAW,GAAG,MAAM,IAAI,CAACC,eAAe,CAACK,MAAM,CAAC;IAEtD,KAAK,MAAMS,UAAU,IAAIf,WAAW,EAAE;MAClC,IAAI;QACA,MAAM,IAAI,CAACL,QAAQ,CAACqB,UAAU,CAACD,UAAU,CAAC;MAC9C,CAAC,CAAC,MAAM;QACJ;MAAA;IAER;IACA,IAAID,MAAM,EAAE;MACR,IAAI;QACA,MAAM,IAAI,CAAClB,SAAS,CAACC,IAAI,CAACG,WAAW,EAAE;UACnCiB,MAAM,EAAE;QACZ,CAAC,CAAC;MACN,CAAC,CAAC,OAAOC,EAAE,EAAE;QACT,MAAM,IAAIC,cAAW,CACjB,2DAA2D,EAC3D,sCAAsC,EACtC;UACInB,WAAW;UACXoB,KAAK,EAAEF;QACX,CACJ,CAAC;MACL;IACJ;IACA,IAAI;MACA,MAAM,IAAI,CAACtB,SAAS,CAACiB,UAAU,CAACb,WAAW,CAAC;IAChD,CAAC,CAAC,OAAOkB,EAAE,EAAE;MACT,MAAM,IAAIC,cAAW,CACjB,wDAAwD,EACxD,yBAAyB,EACzB;QACInB,WAAW;QACXoB,KAAK,EAAEF;MACX,CACJ,CAAC;IACL;IAEA,OAAOlB,WAAW;EACtB;AACJ;AAACqB,OAAA,CAAA5B,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -0,0 +1,22 @@
1
+ import type { IWebsocketsConnectionRegistry, IWebsocketsConnectionRegistryData } from "../../registry";
2
+ import type { IWebsocketsTransportSendConnection, IWebsocketsTransportSendData } from "../../transport";
3
+ import type { SecurityIdentity } from "@webiny/api-security/types";
4
+ import type { GenericRecord } from "@webiny/api/types";
5
+ export type IWebsocketsIdentity = Pick<SecurityIdentity, "id" | "displayName" | "type">;
6
+ export interface IWebsocketsContextListConnectionsParamsWhere {
7
+ identityId?: string;
8
+ tenant?: string;
9
+ locale?: string;
10
+ connections?: string[];
11
+ }
12
+ export interface IWebsocketsContextListConnectionsParams {
13
+ where?: IWebsocketsContextListConnectionsParamsWhere;
14
+ }
15
+ export type IWebsocketsContextDisconnectConnectionsParams = IWebsocketsContextListConnectionsParams;
16
+ export interface IWebsocketsContextObject {
17
+ readonly registry: IWebsocketsConnectionRegistry;
18
+ send<T extends GenericRecord = GenericRecord>(identity: Pick<IWebsocketsIdentity, "id">, data: IWebsocketsTransportSendData<T>): Promise<void>;
19
+ sendToConnections<T extends GenericRecord = GenericRecord>(connections: IWebsocketsTransportSendConnection[], data: IWebsocketsTransportSendData<T>): Promise<void>;
20
+ listConnections(params?: IWebsocketsContextListConnectionsParams): Promise<IWebsocketsConnectionRegistryData[]>;
21
+ disconnect(params?: IWebsocketsContextDisconnectConnectionsParams, notify?: boolean): Promise<IWebsocketsConnectionRegistryData[]>;
22
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ //# sourceMappingURL=IWebsocketsContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["IWebsocketsContext.ts"],"sourcesContent":["import type { IWebsocketsConnectionRegistry, IWebsocketsConnectionRegistryData } from \"~/registry\";\nimport type { IWebsocketsTransportSendConnection, IWebsocketsTransportSendData } from \"~/transport\";\nimport type { SecurityIdentity } from \"@webiny/api-security/types\";\nimport type { GenericRecord } from \"@webiny/api/types\";\n\nexport type IWebsocketsIdentity = Pick<SecurityIdentity, \"id\" | \"displayName\" | \"type\">;\n\nexport interface IWebsocketsContextListConnectionsParamsWhere {\n identityId?: string;\n tenant?: string;\n locale?: string;\n connections?: string[];\n}\n\nexport interface IWebsocketsContextListConnectionsParams {\n where?: IWebsocketsContextListConnectionsParamsWhere;\n}\n\nexport type IWebsocketsContextDisconnectConnectionsParams = IWebsocketsContextListConnectionsParams;\n\nexport interface IWebsocketsContextObject {\n readonly registry: IWebsocketsConnectionRegistry;\n\n send<T extends GenericRecord = GenericRecord>(\n identity: Pick<IWebsocketsIdentity, \"id\">,\n data: IWebsocketsTransportSendData<T>\n ): Promise<void>;\n sendToConnections<T extends GenericRecord = GenericRecord>(\n connections: IWebsocketsTransportSendConnection[],\n data: IWebsocketsTransportSendData<T>\n ): Promise<void>;\n listConnections(\n params?: IWebsocketsContextListConnectionsParams\n ): Promise<IWebsocketsConnectionRegistryData[]>;\n disconnect(\n params?: IWebsocketsContextDisconnectConnectionsParams,\n notify?: boolean\n ): Promise<IWebsocketsConnectionRegistryData[]>;\n}\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ import { ContextPlugin } from "@webiny/handler";
2
+ import type { Context } from "../types";
3
+ export * from "./WebsocketsContext";
4
+ export * from "./abstractions/IWebsocketsContext";
5
+ export declare const createWebsocketsContext: () => ContextPlugin<Context>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _exportNames = {
7
+ createWebsocketsContext: true
8
+ };
9
+ exports.createWebsocketsContext = void 0;
10
+ var _handler = require("@webiny/handler");
11
+ var _WebsocketsContext = require("./WebsocketsContext");
12
+ Object.keys(_WebsocketsContext).forEach(function (key) {
13
+ if (key === "default" || key === "__esModule") return;
14
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
15
+ if (key in exports && exports[key] === _WebsocketsContext[key]) return;
16
+ Object.defineProperty(exports, key, {
17
+ enumerable: true,
18
+ get: function () {
19
+ return _WebsocketsContext[key];
20
+ }
21
+ });
22
+ });
23
+ var _registry = require("../registry");
24
+ var _transport = require("../transport");
25
+ var _IWebsocketsContext = require("./abstractions/IWebsocketsContext");
26
+ Object.keys(_IWebsocketsContext).forEach(function (key) {
27
+ if (key === "default" || key === "__esModule") return;
28
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
29
+ if (key in exports && exports[key] === _IWebsocketsContext[key]) return;
30
+ Object.defineProperty(exports, key, {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _IWebsocketsContext[key];
34
+ }
35
+ });
36
+ });
37
+ const createWebsocketsContext = () => {
38
+ const plugin = new _handler.ContextPlugin(async context => {
39
+ /**
40
+ * TODO Find a better way to send the documentClient to the registry.
41
+ */
42
+ // @ts-expect-error
43
+ const documentClient = context.db.driver.documentClient;
44
+ const registry = new _registry.WebsocketsConnectionRegistry(documentClient);
45
+ const transport = new _transport.WebsocketsTransport();
46
+ context.websockets = new _WebsocketsContext.WebsocketsContext(registry, transport);
47
+ });
48
+ plugin.name = "websockets.context";
49
+ return plugin;
50
+ };
51
+ exports.createWebsocketsContext = createWebsocketsContext;
52
+
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_handler","require","_WebsocketsContext","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_registry","_transport","_IWebsocketsContext","createWebsocketsContext","plugin","ContextPlugin","context","documentClient","db","driver","registry","WebsocketsConnectionRegistry","transport","WebsocketsTransport","websockets","WebsocketsContext","name"],"sources":["index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/handler\";\nimport type { Context } from \"~/types\";\nimport { WebsocketsContext } from \"./WebsocketsContext\";\nimport { WebsocketsConnectionRegistry } from \"~/registry\";\nimport { WebsocketsTransport } from \"~/transport\";\n\nexport * from \"./WebsocketsContext\";\nexport * from \"./abstractions/IWebsocketsContext\";\n\nexport const createWebsocketsContext = () => {\n const plugin = new ContextPlugin<Context>(async context => {\n /**\n * TODO Find a better way to send the documentClient to the registry.\n */\n // @ts-expect-error\n const documentClient = context.db.driver.documentClient;\n const registry = new WebsocketsConnectionRegistry(documentClient);\n const transport = new WebsocketsTransport();\n context.websockets = new WebsocketsContext(registry, transport);\n });\n\n plugin.name = \"websockets.context\";\n\n return plugin;\n};\n"],"mappings":";;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,IAAAC,kBAAA,GAAAD,OAAA;AAIAE,MAAA,CAAAC,IAAA,CAAAF,kBAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,kBAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,kBAAA,CAAAI,GAAA;IAAA;EAAA;AAAA;AAHA,IAAAS,SAAA,GAAAd,OAAA;AACA,IAAAe,UAAA,GAAAf,OAAA;AAGA,IAAAgB,mBAAA,GAAAhB,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAa,mBAAA,EAAAZ,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAW,mBAAA,CAAAX,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAG,mBAAA,CAAAX,GAAA;IAAA;EAAA;AAAA;AAEO,MAAMY,uBAAuB,GAAGA,CAAA,KAAM;EACzC,MAAMC,MAAM,GAAG,IAAIC,sBAAa,CAAU,MAAMC,OAAO,IAAI;IACvD;AACR;AACA;IACQ;IACA,MAAMC,cAAc,GAAGD,OAAO,CAACE,EAAE,CAACC,MAAM,CAACF,cAAc;IACvD,MAAMG,QAAQ,GAAG,IAAIC,sCAA4B,CAACJ,cAAc,CAAC;IACjE,MAAMK,SAAS,GAAG,IAAIC,8BAAmB,CAAC,CAAC;IAC3CP,OAAO,CAACQ,UAAU,GAAG,IAAIC,oCAAiB,CAACL,QAAQ,EAAEE,SAAS,CAAC;EACnE,CAAC,CAAC;EAEFR,MAAM,CAACY,IAAI,GAAG,oBAAoB;EAElC,OAAOZ,MAAM;AACjB,CAAC;AAACR,OAAA,CAAAO,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import type { Context } from "../types";
2
+ /**
3
+ * Simple permission check. Only full access can access the websockets API via GraphQL - ({name: "*"})
4
+ *
5
+ * @throws
6
+ */
7
+ export declare const checkPermissions: (context: Context) => Promise<void>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkPermissions = void 0;
7
+ var _apiSecurity = require("@webiny/api-security");
8
+ /**
9
+ * Simple permission check. Only full access can access the websockets API via GraphQL - ({name: "*"})
10
+ *
11
+ * @throws
12
+ */
13
+ const checkPermissions = async context => {
14
+ const permissions = await context.security.getPermissions("websockets");
15
+ if (permissions.length === 0) {
16
+ throw new _apiSecurity.NotAuthorizedError();
17
+ }
18
+ };
19
+ exports.checkPermissions = checkPermissions;
20
+
21
+ //# sourceMappingURL=checkPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_apiSecurity","require","checkPermissions","context","permissions","security","getPermissions","length","NotAuthorizedError","exports"],"sources":["checkPermissions.ts"],"sourcesContent":["import { NotAuthorizedError } from \"@webiny/api-security\";\nimport type { Context, WebsocketsPermission } from \"~/types\";\n\n/**\n * Simple permission check. Only full access can access the websockets API via GraphQL - ({name: \"*\"})\n *\n * @throws\n */\nexport const checkPermissions = async (context: Context): Promise<void> => {\n const permissions = await context.security.getPermissions<WebsocketsPermission>(\"websockets\");\n\n if (permissions.length === 0) {\n throw new NotAuthorizedError();\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAGA;AACA;AACA;AACA;AACA;AACO,MAAMC,gBAAgB,GAAG,MAAOC,OAAgB,IAAoB;EACvE,MAAMC,WAAW,GAAG,MAAMD,OAAO,CAACE,QAAQ,CAACC,cAAc,CAAuB,YAAY,CAAC;EAE7F,IAAIF,WAAW,CAACG,MAAM,KAAK,CAAC,EAAE;IAC1B,MAAM,IAAIC,+BAAkB,CAAC,CAAC;EAClC;AACJ,CAAC;AAACC,OAAA,CAAAP,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -0,0 +1,13 @@
1
+ import type { Resolvers } from "@webiny/handler-graphql/types";
2
+ import type { Context } from "../types";
3
+ export interface IWebsocketsMutationDisconnectConnectionsArgs {
4
+ connections: string[];
5
+ }
6
+ export interface IWebsocketsMutationDisconnectIdentityArgs {
7
+ identityId: string;
8
+ }
9
+ export interface IWebsocketsMutationDisconnectTenantArgs {
10
+ tenant: string;
11
+ locale?: string;
12
+ }
13
+ export declare const createResolvers: () => Resolvers<Context>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createResolvers = void 0;
7
+ var _utils = require("./utils");
8
+ var _checkPermissions = require("./checkPermissions");
9
+ const createResolvers = () => {
10
+ return {
11
+ Query: {
12
+ websockets: _utils.emptyResolver
13
+ },
14
+ Mutation: {
15
+ websockets: _utils.emptyResolver
16
+ },
17
+ WebsocketsQuery: {
18
+ listConnections: async (_, args, context) => {
19
+ return (0, _utils.resolve)(async () => {
20
+ await (0, _checkPermissions.checkPermissions)(context);
21
+ return await context.websockets.listConnections(args);
22
+ });
23
+ }
24
+ },
25
+ WebsocketsMutation: {
26
+ disconnect: async (_, args, context) => {
27
+ return (0, _utils.resolve)(async () => {
28
+ await (0, _checkPermissions.checkPermissions)(context);
29
+ return await context.websockets.disconnect({
30
+ where: {
31
+ connections: args.connections
32
+ }
33
+ });
34
+ });
35
+ },
36
+ disconnectIdentity: async (_, args, context) => {
37
+ return (0, _utils.resolve)(async () => {
38
+ await (0, _checkPermissions.checkPermissions)(context);
39
+ return await context.websockets.disconnect({
40
+ where: {
41
+ identityId: args.identityId
42
+ }
43
+ });
44
+ });
45
+ },
46
+ disconnectTenant: async (_, args, context) => {
47
+ return (0, _utils.resolve)(async () => {
48
+ await (0, _checkPermissions.checkPermissions)(context);
49
+ return await context.websockets.disconnect({
50
+ where: {
51
+ tenant: args.tenant,
52
+ locale: args.locale
53
+ }
54
+ });
55
+ });
56
+ },
57
+ disconnectAll: async (_, __, context) => {
58
+ return (0, _utils.resolve)(async () => {
59
+ await (0, _checkPermissions.checkPermissions)(context);
60
+ return await context.websockets.disconnect();
61
+ });
62
+ }
63
+ }
64
+ };
65
+ };
66
+ exports.createResolvers = createResolvers;
67
+
68
+ //# sourceMappingURL=createResolvers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_utils","require","_checkPermissions","createResolvers","Query","websockets","emptyResolver","Mutation","WebsocketsQuery","listConnections","_","args","context","resolve","checkPermissions","WebsocketsMutation","disconnect","where","connections","disconnectIdentity","identityId","disconnectTenant","tenant","locale","disconnectAll","__","exports"],"sources":["createResolvers.ts"],"sourcesContent":["import type { Resolvers } from \"@webiny/handler-graphql/types\";\nimport type { Context } from \"~/types\";\nimport { emptyResolver, resolve } from \"./utils\";\nimport type { IWebsocketsContextListConnectionsParams } from \"~/context\";\nimport type { IWebsocketsConnectionRegistryData } from \"~/registry\";\nimport { checkPermissions } from \"~/graphql/checkPermissions\";\n\nexport interface IWebsocketsMutationDisconnectConnectionsArgs {\n connections: string[];\n}\n\nexport interface IWebsocketsMutationDisconnectIdentityArgs {\n identityId: string;\n}\n\nexport interface IWebsocketsMutationDisconnectTenantArgs {\n tenant: string;\n locale?: string;\n}\n\nexport const createResolvers = (): Resolvers<Context> => {\n return {\n Query: {\n websockets: emptyResolver\n },\n Mutation: {\n websockets: emptyResolver\n },\n WebsocketsQuery: {\n listConnections: async (_, args: IWebsocketsContextListConnectionsParams, context) => {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.websockets.listConnections(args);\n });\n }\n },\n WebsocketsMutation: {\n disconnect: async (_, args: IWebsocketsMutationDisconnectConnectionsArgs, context) => {\n return resolve(async () => {\n await checkPermissions(context);\n return await context.websockets.disconnect({\n where: {\n connections: args.connections\n }\n });\n });\n },\n disconnectIdentity: async (\n _,\n args: IWebsocketsMutationDisconnectIdentityArgs,\n context\n ) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n return await context.websockets.disconnect({\n where: {\n identityId: args.identityId\n }\n });\n });\n },\n disconnectTenant: async (_, args: IWebsocketsMutationDisconnectTenantArgs, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n return await context.websockets.disconnect({\n where: {\n tenant: args.tenant,\n locale: args.locale\n }\n });\n });\n },\n disconnectAll: async (_, __, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n return await context.websockets.disconnect();\n });\n }\n }\n };\n};\n"],"mappings":";;;;;;AAEA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,iBAAA,GAAAD,OAAA;AAeO,MAAME,eAAe,GAAGA,CAAA,KAA0B;EACrD,OAAO;IACHC,KAAK,EAAE;MACHC,UAAU,EAAEC;IAChB,CAAC;IACDC,QAAQ,EAAE;MACNF,UAAU,EAAEC;IAChB,CAAC;IACDE,eAAe,EAAE;MACbC,eAAe,EAAE,MAAAA,CAAOC,CAAC,EAAEC,IAA6C,EAAEC,OAAO,KAAK;QAClF,OAAO,IAAAC,cAAO,EAAC,YAAY;UACvB,MAAM,IAAAC,kCAAgB,EAACF,OAAO,CAAC;UAC/B,OAAO,MAAMA,OAAO,CAACP,UAAU,CAACI,eAAe,CAACE,IAAI,CAAC;QACzD,CAAC,CAAC;MACN;IACJ,CAAC;IACDI,kBAAkB,EAAE;MAChBC,UAAU,EAAE,MAAAA,CAAON,CAAC,EAAEC,IAAkD,EAAEC,OAAO,KAAK;QAClF,OAAO,IAAAC,cAAO,EAAC,YAAY;UACvB,MAAM,IAAAC,kCAAgB,EAACF,OAAO,CAAC;UAC/B,OAAO,MAAMA,OAAO,CAACP,UAAU,CAACW,UAAU,CAAC;YACvCC,KAAK,EAAE;cACHC,WAAW,EAAEP,IAAI,CAACO;YACtB;UACJ,CAAC,CAAC;QACN,CAAC,CAAC;MACN,CAAC;MACDC,kBAAkB,EAAE,MAAAA,CAChBT,CAAC,EACDC,IAA+C,EAC/CC,OAAO,KACN;QACD,OAAO,IAAAC,cAAO,EAAsC,YAAY;UAC5D,MAAM,IAAAC,kCAAgB,EAACF,OAAO,CAAC;UAC/B,OAAO,MAAMA,OAAO,CAACP,UAAU,CAACW,UAAU,CAAC;YACvCC,KAAK,EAAE;cACHG,UAAU,EAAET,IAAI,CAACS;YACrB;UACJ,CAAC,CAAC;QACN,CAAC,CAAC;MACN,CAAC;MACDC,gBAAgB,EAAE,MAAAA,CAAOX,CAAC,EAAEC,IAA6C,EAAEC,OAAO,KAAK;QACnF,OAAO,IAAAC,cAAO,EAAsC,YAAY;UAC5D,MAAM,IAAAC,kCAAgB,EAACF,OAAO,CAAC;UAC/B,OAAO,MAAMA,OAAO,CAACP,UAAU,CAACW,UAAU,CAAC;YACvCC,KAAK,EAAE;cACHK,MAAM,EAAEX,IAAI,CAACW,MAAM;cACnBC,MAAM,EAAEZ,IAAI,CAACY;YACjB;UACJ,CAAC,CAAC;QACN,CAAC,CAAC;MACN,CAAC;MACDC,aAAa,EAAE,MAAAA,CAAOd,CAAC,EAAEe,EAAE,EAAEb,OAAO,KAAK;QACrC,OAAO,IAAAC,cAAO,EAAsC,YAAY;UAC5D,MAAM,IAAAC,kCAAgB,EAACF,OAAO,CAAC;UAC/B,OAAO,MAAMA,OAAO,CAACP,UAAU,CAACW,UAAU,CAAC,CAAC;QAChD,CAAC,CAAC;MACN;IACJ;EACJ,CAAC;AACL,CAAC;AAACU,OAAA,CAAAvB,eAAA,GAAAA,eAAA","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const createTypeDefs: () => string;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createTypeDefs = void 0;
7
+ const createTypeDefs = () => {
8
+ return /* GraphQL */`
9
+ type WebsocketsIdentity {
10
+ id: String!
11
+ type: String
12
+ displayName: String
13
+ }
14
+ type WebsocketsConnection {
15
+ connectionId: String!
16
+ domainName: String!
17
+ stage: String!
18
+ identity: WebsocketsIdentity!
19
+ connectedOn: DateTime!
20
+ tenant: String!
21
+ locale: String!
22
+ }
23
+
24
+ type WebsocketsError {
25
+ message: String!
26
+ code: String!
27
+ data: JSON
28
+ }
29
+
30
+ type WebsocketsListConnectionsResponse {
31
+ data: [WebsocketsConnection!]
32
+ error: WebsocketsError
33
+ }
34
+
35
+ input WebsocketsListConnectionsWhereInput {
36
+ identityId: String
37
+ tenant: String
38
+ locale: String
39
+ }
40
+
41
+ type WebsocketsDisconnectResponse {
42
+ data: [WebsocketsConnection!]
43
+ error: WebsocketsError
44
+ }
45
+
46
+ type WebsocketsQuery {
47
+ _empty: String
48
+ }
49
+
50
+ type WebsocketsMutation {
51
+ _empty: String
52
+ }
53
+
54
+ extend type Query {
55
+ websockets: WebsocketsQuery
56
+ }
57
+
58
+ extend type Mutation {
59
+ websockets: WebsocketsMutation
60
+ }
61
+
62
+ extend type WebsocketsQuery {
63
+ listConnections(
64
+ where: WebsocketsListConnectionsWhereInput
65
+ ): WebsocketsListConnectionsResponse!
66
+ }
67
+
68
+ extend type WebsocketsMutation {
69
+ disconnect(connections: [String!]!): WebsocketsDisconnectResponse!
70
+ disconnectIdentity(identityId: String!): WebsocketsDisconnectResponse!
71
+ disconnectTenant(tenant: String!, locale: String): WebsocketsDisconnectResponse!
72
+ disconnectAll: WebsocketsDisconnectResponse!
73
+ }
74
+ `;
75
+ };
76
+ exports.createTypeDefs = createTypeDefs;
77
+
78
+ //# sourceMappingURL=createTypeDefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createTypeDefs","exports"],"sources":["createTypeDefs.ts"],"sourcesContent":["export const createTypeDefs = () => {\n return /* GraphQL */ `\n type WebsocketsIdentity {\n id: String!\n type: String\n displayName: String\n }\n type WebsocketsConnection {\n connectionId: String!\n domainName: String!\n stage: String!\n identity: WebsocketsIdentity!\n connectedOn: DateTime!\n tenant: String!\n locale: String!\n }\n\n type WebsocketsError {\n message: String!\n code: String!\n data: JSON\n }\n\n type WebsocketsListConnectionsResponse {\n data: [WebsocketsConnection!]\n error: WebsocketsError\n }\n\n input WebsocketsListConnectionsWhereInput {\n identityId: String\n tenant: String\n locale: String\n }\n\n type WebsocketsDisconnectResponse {\n data: [WebsocketsConnection!]\n error: WebsocketsError\n }\n\n type WebsocketsQuery {\n _empty: String\n }\n\n type WebsocketsMutation {\n _empty: String\n }\n\n extend type Query {\n websockets: WebsocketsQuery\n }\n\n extend type Mutation {\n websockets: WebsocketsMutation\n }\n\n extend type WebsocketsQuery {\n listConnections(\n where: WebsocketsListConnectionsWhereInput\n ): WebsocketsListConnectionsResponse!\n }\n\n extend type WebsocketsMutation {\n disconnect(connections: [String!]!): WebsocketsDisconnectResponse!\n disconnectIdentity(identityId: String!): WebsocketsDisconnectResponse!\n disconnectTenant(tenant: String!, locale: String): WebsocketsDisconnectResponse!\n disconnectAll: WebsocketsDisconnectResponse!\n }\n `;\n};\n"],"mappings":";;;;;;AAAO,MAAMA,cAAc,GAAGA,CAAA,KAAM;EAChC,OAAO,aAAc;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL,CAAC;AAACC,OAAA,CAAAD,cAAA,GAAAA,cAAA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import { GraphQLSchemaPlugin } from "@webiny/handler-graphql";
2
+ export declare const createWebsocketsGraphQL: () => GraphQLSchemaPlugin<import("..").Context>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createWebsocketsGraphQL = void 0;
7
+ var _handlerGraphql = require("@webiny/handler-graphql");
8
+ var _createTypeDefs = require("./createTypeDefs");
9
+ var _createResolvers = require("./createResolvers");
10
+ const createWebsocketsGraphQL = () => {
11
+ const plugin = new _handlerGraphql.GraphQLSchemaPlugin({
12
+ typeDefs: (0, _createTypeDefs.createTypeDefs)(),
13
+ resolvers: (0, _createResolvers.createResolvers)()
14
+ });
15
+ plugin.name = "websockets.graphql";
16
+ return plugin;
17
+ };
18
+ exports.createWebsocketsGraphQL = createWebsocketsGraphQL;
19
+
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_handlerGraphql","require","_createTypeDefs","_createResolvers","createWebsocketsGraphQL","plugin","GraphQLSchemaPlugin","typeDefs","createTypeDefs","resolvers","createResolvers","name","exports"],"sources":["index.ts"],"sourcesContent":["import { GraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { createTypeDefs } from \"./createTypeDefs\";\nimport { createResolvers } from \"./createResolvers\";\n\nexport const createWebsocketsGraphQL = () => {\n const plugin = new GraphQLSchemaPlugin({\n typeDefs: createTypeDefs(),\n resolvers: createResolvers()\n });\n\n plugin.name = \"websockets.graphql\";\n\n return plugin;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAF,OAAA;AAEO,MAAMG,uBAAuB,GAAGA,CAAA,KAAM;EACzC,MAAMC,MAAM,GAAG,IAAIC,mCAAmB,CAAC;IACnCC,QAAQ,EAAE,IAAAC,8BAAc,EAAC,CAAC;IAC1BC,SAAS,EAAE,IAAAC,gCAAe,EAAC;EAC/B,CAAC,CAAC;EAEFL,MAAM,CAACM,IAAI,GAAG,oBAAoB;EAElC,OAAON,MAAM;AACjB,CAAC;AAACO,OAAA,CAAAR,uBAAA,GAAAA,uBAAA","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import { ErrorResponse, Response } from "@webiny/handler-graphql";
2
+ export declare const emptyResolver: () => {};
3
+ interface ResolveCallable<T = any> {
4
+ (): Promise<T>;
5
+ }
6
+ export declare const resolve: <T = any>(fn: ResolveCallable<T>) => Promise<ErrorResponse | Response<T>>;
7
+ export {};
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.resolve = exports.emptyResolver = void 0;
7
+ var _handlerGraphql = require("@webiny/handler-graphql");
8
+ const emptyResolver = () => ({});
9
+ exports.emptyResolver = emptyResolver;
10
+ const resolve = async fn => {
11
+ try {
12
+ return new _handlerGraphql.Response(await fn());
13
+ } catch (ex) {
14
+ return new _handlerGraphql.ErrorResponse(ex);
15
+ }
16
+ };
17
+ exports.resolve = resolve;
18
+
19
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_handlerGraphql","require","emptyResolver","exports","resolve","fn","Response","ex","ErrorResponse"],"sources":["utils.ts"],"sourcesContent":["import { ErrorResponse, Response } from \"@webiny/handler-graphql\";\n\nexport const emptyResolver = () => ({});\n\ninterface ResolveCallable<T = any> {\n (): Promise<T>;\n}\n\nexport const resolve = async <T = any>(fn: ResolveCallable<T>) => {\n try {\n return new Response<T>(await fn());\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AAEO,MAAMC,aAAa,GAAGA,CAAA,MAAO,CAAC,CAAC,CAAC;AAACC,OAAA,CAAAD,aAAA,GAAAA,aAAA;AAMjC,MAAME,OAAO,GAAG,MAAgBC,EAAsB,IAAK;EAC9D,IAAI;IACA,OAAO,IAAIC,wBAAQ,CAAI,MAAMD,EAAE,CAAC,CAAC,CAAC;EACtC,CAAC,CAAC,OAAOE,EAAE,EAAE;IACT,OAAO,IAAIC,6BAAa,CAACD,EAAE,CAAC;EAChC;AACJ,CAAC;AAACJ,OAAA,CAAAC,OAAA,GAAAA,OAAA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import type { HandlerCallable, HandlerParams } from "./types";
2
+ export declare const createHandler: (params: HandlerParams) => HandlerCallable;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createHandler = void 0;
7
+ var _handler = require("@webiny/handler");
8
+ var _plugins = require("@webiny/handler-aws/plugins");
9
+ var _execute = require("@webiny/handler-aws/execute");
10
+ var _plugins2 = require("@webiny/plugins");
11
+ var _routes = require("../runner/routes");
12
+ var _validator = require("../validator");
13
+ var _response = require("../response");
14
+ var _runner = require("../runner");
15
+ var _headers = require("./headers");
16
+ const url = "/webiny-websockets";
17
+ const createPluginsContainer = plugins => {
18
+ if (plugins instanceof _plugins2.PluginsContainer) {
19
+ return plugins;
20
+ }
21
+ return new _plugins2.PluginsContainer(plugins || []);
22
+ };
23
+ const createHandler = params => {
24
+ const plugins = createPluginsContainer(params.plugins);
25
+ plugins.register(...(0, _routes.createWebsocketsRoutePlugins)());
26
+ return async event => {
27
+ const app = (0, _handler.createHandler)({
28
+ ...params,
29
+ plugins,
30
+ options: {
31
+ logger: params.debug === true,
32
+ ...(params.options || {})
33
+ }
34
+ });
35
+ (0, _plugins.registerDefaultPlugins)(app.webiny);
36
+ app.setErrorHandler(async (error, _, reply) => {
37
+ app.__webiny_raw_result = {
38
+ error: {
39
+ message: error.message,
40
+ code: error.code,
41
+ data: error.data
42
+ },
43
+ statusCode: 200
44
+ };
45
+ return reply.send({});
46
+ });
47
+ app.post(url, async (_, reply) => {
48
+ const {
49
+ validator,
50
+ response
51
+ } = params;
52
+ const context = app.webiny;
53
+ const handler = new _runner.WebsocketsRunner(context, context.websockets.registry, validator || new _validator.WebsocketsEventValidator(), response || new _response.WebsocketsResponse());
54
+ const result = await handler.run(event);
55
+ return reply.status(result.statusCode).headers({
56
+ "Sec-WebSocket-Protocol": "webiny-ws-v1"
57
+ }).send(result);
58
+ });
59
+ const {
60
+ tenant,
61
+ locale,
62
+ endpoint,
63
+ token
64
+ } = (0, _headers.getEventValues)(event);
65
+ const headers = {
66
+ Authorization: `Bearer ${token}`,
67
+ ["x-tenant"]: tenant,
68
+ ["x-webiny-cms-locale"]: locale,
69
+ ["x-webiny-cms-endpoint"]: endpoint,
70
+ ...event.headers
71
+ };
72
+ return (0, _execute.execute)({
73
+ app,
74
+ url,
75
+ payload: {
76
+ ...event,
77
+ headers
78
+ }
79
+ });
80
+ };
81
+ };
82
+ exports.createHandler = createHandler;
83
+
84
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_handler","require","_plugins","_execute","_plugins2","_routes","_validator","_response","_runner","_headers","url","createPluginsContainer","plugins","PluginsContainer","createHandler","params","register","createWebsocketsRoutePlugins","event","app","createBaseHandler","options","logger","debug","registerDefaultPlugins","webiny","setErrorHandler","error","_","reply","__webiny_raw_result","message","code","data","statusCode","send","post","validator","response","context","handler","WebsocketsRunner","websockets","registry","WebsocketsEventValidator","WebsocketsResponse","result","run","status","headers","tenant","locale","endpoint","token","getEventValues","Authorization","execute","payload","exports"],"sources":["handler.ts"],"sourcesContent":["import type WebinyError from \"@webiny/error\";\nimport { createHandler as createBaseHandler } from \"@webiny/handler\";\nimport { registerDefaultPlugins } from \"@webiny/handler-aws/plugins\";\nimport { execute } from \"@webiny/handler-aws/execute\";\nimport { PluginsContainer } from \"@webiny/plugins\";\nimport { createWebsocketsRoutePlugins } from \"~/runner/routes\";\nimport { WebsocketsEventValidator } from \"~/validator\";\nimport { WebsocketsResponse } from \"~/response\";\nimport type { Context } from \"~/types\";\nimport { WebsocketsRunner } from \"~/runner\";\nimport type { PluginCollection } from \"@webiny/plugins/types\";\nimport type { HandlerCallable, HandlerParams } from \"./types\";\nimport { getEventValues } from \"./headers\";\n\nconst url = \"/webiny-websockets\";\n\nconst createPluginsContainer = (\n plugins?: PluginsContainer | PluginCollection\n): PluginsContainer => {\n if (plugins instanceof PluginsContainer) {\n return plugins;\n }\n return new PluginsContainer(plugins || []);\n};\n\nexport const createHandler = (params: HandlerParams): HandlerCallable => {\n const plugins = createPluginsContainer(params.plugins);\n plugins.register(...createWebsocketsRoutePlugins());\n\n return async event => {\n const app = createBaseHandler({\n ...params,\n plugins,\n options: {\n logger: params.debug === true,\n ...(params.options || {})\n }\n });\n\n registerDefaultPlugins(app.webiny);\n\n app.setErrorHandler<WebinyError>(async (error, _, reply) => {\n app.__webiny_raw_result = {\n error: {\n message: error.message,\n code: error.code,\n data: error.data\n },\n statusCode: 200\n };\n return reply.send({});\n });\n\n app.post(url, async (_, reply) => {\n const { validator, response } = params;\n const context = app.webiny as Context;\n const handler = new WebsocketsRunner(\n context,\n context.websockets.registry,\n validator || new WebsocketsEventValidator(),\n response || new WebsocketsResponse()\n );\n\n const result = await handler.run(event);\n\n return reply\n .status(result.statusCode)\n .headers({\n \"Sec-WebSocket-Protocol\": \"webiny-ws-v1\"\n })\n .send(result);\n });\n\n const { tenant, locale, endpoint, token } = getEventValues(event);\n\n const headers = {\n Authorization: `Bearer ${token}`,\n [\"x-tenant\"]: tenant,\n [\"x-webiny-cms-locale\"]: locale,\n [\"x-webiny-cms-endpoint\"]: endpoint,\n ...event.headers\n };\n\n return execute({\n app,\n url,\n payload: {\n ...event,\n headers\n }\n });\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import type { IWebsocketsIncomingEvent } from "./types";
2
+ export declare const getEventValues: (event: IWebsocketsIncomingEvent) => {
3
+ tenant: string;
4
+ locale: string;
5
+ token: string | null;
6
+ endpoint: string;
7
+ };