@webiny/api-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.
Files changed (88) hide show
  1. package/context/WebsocketsContext.js +57 -72
  2. package/context/WebsocketsContext.js.map +1 -1
  3. package/context/abstractions/IWebsocketsContext.js +0 -3
  4. package/context/index.js +12 -15
  5. package/context/index.js.map +1 -1
  6. package/exports/api.d.ts +1 -0
  7. package/exports/api.js +5 -0
  8. package/exports/api.js.map +1 -0
  9. package/features/WebsocketService/abstractions.js +2 -1
  10. package/features/WebsocketService/abstractions.js.map +1 -1
  11. package/features/WebsocketService/errors.js +28 -30
  12. package/features/WebsocketService/errors.js.map +1 -1
  13. package/features/WebsocketService/index.js +0 -2
  14. package/graphql/checkPermissions.js +5 -11
  15. package/graphql/checkPermissions.js.map +1 -1
  16. package/graphql/createResolvers.js +55 -76
  17. package/graphql/createResolvers.js.map +1 -1
  18. package/graphql/createTypeDefs.js +2 -3
  19. package/graphql/createTypeDefs.js.map +1 -1
  20. package/graphql/index.js +8 -7
  21. package/graphql/index.js.map +1 -1
  22. package/graphql/utils.js +8 -7
  23. package/graphql/utils.js.map +1 -1
  24. package/handler/handler.js +58 -66
  25. package/handler/handler.js.map +1 -1
  26. package/handler/headers.js +21 -28
  27. package/handler/headers.js.map +1 -1
  28. package/handler/register.js +9 -19
  29. package/handler/register.js.map +1 -1
  30. package/handler/types.js +11 -10
  31. package/handler/types.js.map +1 -1
  32. package/index.js +5 -3
  33. package/index.js.map +1 -1
  34. package/package.json +20 -20
  35. package/plugins/WebsocketsActionPlugin.js +14 -13
  36. package/plugins/WebsocketsActionPlugin.js.map +1 -1
  37. package/plugins/WebsocketsRoutePlugin.js +14 -13
  38. package/plugins/WebsocketsRoutePlugin.js.map +1 -1
  39. package/plugins/abstrations/IWebsocketsActionPlugin.js +0 -3
  40. package/plugins/index.js +0 -2
  41. package/registry/WebsocketsConnectionRegistry.js +107 -146
  42. package/registry/WebsocketsConnectionRegistry.js.map +1 -1
  43. package/registry/abstractions/IWebsocketsConnectionRegistry.js +0 -3
  44. package/registry/entity.js +44 -43
  45. package/registry/entity.js.map +1 -1
  46. package/registry/index.js +0 -2
  47. package/response/WebsocketsResponse.js +20 -19
  48. package/response/WebsocketsResponse.js.map +1 -1
  49. package/response/abstractions/IWebsocketsResponse.js +0 -3
  50. package/response/index.js +0 -2
  51. package/runner/WebsocketsRunner.js +137 -164
  52. package/runner/WebsocketsRunner.js.map +1 -1
  53. package/runner/abstractions/IWebsocketsRunner.js +0 -3
  54. package/runner/index.js +0 -2
  55. package/runner/routes/connect.js +30 -40
  56. package/runner/routes/connect.js.map +1 -1
  57. package/runner/routes/default.js +16 -22
  58. package/runner/routes/default.js.map +1 -1
  59. package/runner/routes/disconnect.js +10 -13
  60. package/runner/routes/disconnect.js.map +1 -1
  61. package/runner/routes/index.js +6 -3
  62. package/runner/routes/index.js.map +1 -1
  63. package/transport/WebsocketsTransport.js +36 -39
  64. package/transport/WebsocketsTransport.js.map +1 -1
  65. package/transport/abstractions/IWebsocketsTransport.js +0 -3
  66. package/transport/index.js +0 -2
  67. package/types.js +0 -3
  68. package/utils/middleware.js +9 -14
  69. package/utils/middleware.js.map +1 -1
  70. package/validator/WebsocketsEventValidator.js +55 -63
  71. package/validator/WebsocketsEventValidator.js.map +1 -1
  72. package/validator/abstractions/IWebsocketsEventValidator.js +0 -3
  73. package/validator/index.js +0 -2
  74. package/context/abstractions/IWebsocketsContext.js.map +0 -1
  75. package/features/WebsocketService/index.js.map +0 -1
  76. package/plugins/abstrations/IWebsocketsActionPlugin.js.map +0 -1
  77. package/plugins/index.js.map +0 -1
  78. package/registry/abstractions/IWebsocketsConnectionRegistry.js.map +0 -1
  79. package/registry/index.js.map +0 -1
  80. package/response/abstractions/IWebsocketsResponse.js.map +0 -1
  81. package/response/index.js.map +0 -1
  82. package/runner/abstractions/IWebsocketsRunner.js.map +0 -1
  83. package/runner/index.js.map +0 -1
  84. package/transport/abstractions/IWebsocketsTransport.js.map +0 -1
  85. package/transport/index.js.map +0 -1
  86. package/types.js.map +0 -1
  87. package/validator/abstractions/IWebsocketsEventValidator.js.map +0 -1
  88. package/validator/index.js.map +0 -1
@@ -1,81 +1,66 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { WebsocketServiceError, WebsocketForceDisconnectError, WebsocketForceDisconnectNotificationError } from "../features/WebsocketService/errors.js";
3
- export class WebsocketsContext {
4
- constructor(registry, transport) {
5
- this.registry = registry;
6
- this.transport = transport;
7
- }
8
- async send(identity, data) {
9
- const result = await this.listConnections({
10
- where: {
11
- identityId: identity.id
12
- }
13
- });
14
- if (result.isFail()) {
15
- return Result.fail(result.error);
2
+ import { WebsocketForceDisconnectError, WebsocketForceDisconnectNotificationError, WebsocketServiceError } from "../features/WebsocketService/errors.js";
3
+ class WebsocketsContext {
4
+ constructor(registry, transport){
5
+ this.registry = registry;
6
+ this.transport = transport;
16
7
  }
17
- try {
18
- await this.transport.send(result.value, data);
19
- } catch (error) {
20
- return Result.fail(new WebsocketServiceError(error));
21
- }
22
- return Result.ok();
23
- }
24
- async sendToConnections(connections, data) {
25
- try {
26
- await this.transport.send(connections, data);
27
- } catch (error) {
28
- return Result.fail(new WebsocketServiceError(error));
29
- }
30
- return Result.ok();
31
- }
32
- async listConnections(params) {
33
- let connections = [];
34
- try {
35
- const where = params?.where || {};
36
- if (where.identityId) {
37
- connections = await this.registry.listViaIdentity(where.identityId);
38
- } else if (where.connections) {
39
- connections = await this.registry.listViaConnections(where.connections);
40
- } else if (where.tenant) {
41
- connections = await this.registry.listViaTenant(where.tenant);
42
- } else {
43
- connections = await this.registry.listAll();
44
- }
45
- } catch (error) {
46
- return Result.fail(new WebsocketServiceError(error));
47
- }
48
- return Result.ok(connections);
49
- }
50
- async disconnect(params, notify = true) {
51
- const result = await this.listConnections(params);
52
- if (result.isFail()) {
53
- return Result.fail(result.error);
8
+ async send(identity, data) {
9
+ const result = await this.listConnections({
10
+ where: {
11
+ identityId: identity.id
12
+ }
13
+ });
14
+ if (result.isFail()) return Result.fail(result.error);
15
+ try {
16
+ await this.transport.send(result.value, data);
17
+ } catch (error) {
18
+ return Result.fail(new WebsocketServiceError(error));
19
+ }
20
+ return Result.ok();
54
21
  }
55
- const connections = result.value;
56
- for (const connection of connections) {
57
- try {
58
- await this.registry.unregister(connection);
59
- } catch {
60
- // do nothing
61
- }
22
+ async sendToConnections(connections, data) {
23
+ try {
24
+ await this.transport.send(connections, data);
25
+ } catch (error) {
26
+ return Result.fail(new WebsocketServiceError(error));
27
+ }
28
+ return Result.ok();
62
29
  }
63
- if (notify) {
64
- try {
65
- await this.transport.send(connections, {
66
- action: "forcedDisconnect"
67
- });
68
- } catch (error) {
69
- return Result.fail(new WebsocketForceDisconnectNotificationError(error));
70
- }
30
+ async listConnections(params) {
31
+ let connections = [];
32
+ try {
33
+ const where = params?.where || {};
34
+ connections = where.identityId ? await this.registry.listViaIdentity(where.identityId) : where.connections ? await this.registry.listViaConnections(where.connections) : where.tenant ? await this.registry.listViaTenant(where.tenant) : await this.registry.listAll();
35
+ } catch (error) {
36
+ return Result.fail(new WebsocketServiceError(error));
37
+ }
38
+ const threeHoursAgo = new Date(Date.now() - 10800000).toISOString();
39
+ connections = connections.filter((c)=>c.connectedOn >= threeHoursAgo);
40
+ return Result.ok(connections);
71
41
  }
72
- try {
73
- await this.transport.disconnect(connections);
74
- } catch (error) {
75
- return Result.fail(new WebsocketForceDisconnectError(error));
42
+ async disconnect(params, notify = true) {
43
+ const result = await this.listConnections(params);
44
+ if (result.isFail()) return Result.fail(result.error);
45
+ const connections = result.value;
46
+ for (const connection of connections)try {
47
+ await this.registry.unregister(connection);
48
+ } catch {}
49
+ if (notify) try {
50
+ await this.transport.send(connections, {
51
+ action: "forcedDisconnect"
52
+ });
53
+ } catch (error) {
54
+ return Result.fail(new WebsocketForceDisconnectNotificationError(error));
55
+ }
56
+ try {
57
+ await this.transport.disconnect(connections);
58
+ } catch (error) {
59
+ return Result.fail(new WebsocketForceDisconnectError(error));
60
+ }
61
+ return Result.ok(connections);
76
62
  }
77
- return Result.ok(connections);
78
- }
79
63
  }
64
+ export { WebsocketsContext };
80
65
 
81
66
  //# sourceMappingURL=WebsocketsContext.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","WebsocketServiceError","WebsocketForceDisconnectError","WebsocketForceDisconnectNotificationError","WebsocketsContext","constructor","registry","transport","send","identity","data","result","listConnections","where","identityId","id","isFail","fail","error","value","ok","sendToConnections","connections","params","listViaIdentity","listViaConnections","tenant","listViaTenant","listAll","disconnect","notify","connection","unregister","action"],"sources":["WebsocketsContext.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport type {\n IWebsocketsConnectionRegistry,\n IWebsocketsConnectionRegistryData\n} from \"~/registry/index.js\";\nimport type {\n IWebsocketsContextObject,\n IWebsocketsContextDisconnectConnectionsParams,\n IWebsocketsContextListConnectionsParams,\n IWebsocketsIdentity\n} from \"./abstractions/IWebsocketsContext.js\";\nimport type {\n IWebsocketsTransport,\n IWebsocketsTransportSendConnection,\n IWebsocketsTransportSendData\n} from \"~/transport/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport {\n WebsocketServiceError,\n WebsocketForceDisconnectError,\n WebsocketForceDisconnectNotificationError\n} from \"~/features/WebsocketService/errors.js\";\nimport { WebsocketService } from \"~/features/WebsocketService/index.js\";\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<Result<void, WebsocketService.Error>> {\n const result = await this.listConnections({\n where: {\n identityId: identity.id\n }\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n try {\n await this.transport.send<T>(result.value, data);\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n return Result.ok();\n }\n\n public async sendToConnections<T extends GenericRecord = GenericRecord>(\n connections: IWebsocketsTransportSendConnection[],\n data: IWebsocketsTransportSendData<T>\n ): Promise<Result<void, WebsocketService.Error>> {\n try {\n await this.transport.send<T>(connections, data);\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n return Result.ok();\n }\n\n public async listConnections(\n params?: IWebsocketsContextListConnectionsParams\n ): Promise<Result<IWebsocketsConnectionRegistryData[], WebsocketService.Error>> {\n let connections: IWebsocketsConnectionRegistryData[] = [];\n\n try {\n const where = params?.where || {};\n if (where.identityId) {\n connections = await this.registry.listViaIdentity(where.identityId);\n } else if (where.connections) {\n connections = await this.registry.listViaConnections(where.connections);\n } else if (where.tenant) {\n connections = await this.registry.listViaTenant(where.tenant);\n } else {\n connections = await this.registry.listAll();\n }\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n return Result.ok(connections);\n }\n\n public async disconnect(\n params?: IWebsocketsContextDisconnectConnectionsParams,\n notify = true\n ): Promise<Result<IWebsocketsConnectionRegistryData[], WebsocketService.Error>> {\n const result = await this.listConnections(params);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const connections = result.value;\n\n for (const connection of connections) {\n try {\n await this.registry.unregister(connection);\n } catch {\n // do nothing\n }\n }\n\n if (notify) {\n try {\n await this.transport.send(connections, {\n action: \"forcedDisconnect\"\n });\n } catch (error) {\n return Result.fail(new WebsocketForceDisconnectNotificationError(error));\n }\n }\n\n try {\n await this.transport.disconnect(connections);\n } catch (error) {\n return Result.fail(new WebsocketForceDisconnectError(error));\n }\n\n return Result.ok(connections);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"context/WebsocketsContext.js","sources":["../../src/context/WebsocketsContext.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport type {\n IWebsocketsConnectionRegistry,\n IWebsocketsConnectionRegistryData\n} from \"~/registry/index.js\";\nimport type {\n IWebsocketsContextObject,\n IWebsocketsContextDisconnectConnectionsParams,\n IWebsocketsContextListConnectionsParams,\n IWebsocketsIdentity\n} from \"./abstractions/IWebsocketsContext.js\";\nimport type {\n IWebsocketsTransport,\n IWebsocketsTransportSendConnection,\n IWebsocketsTransportSendData\n} from \"~/transport/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport {\n WebsocketServiceError,\n WebsocketForceDisconnectError,\n WebsocketForceDisconnectNotificationError\n} from \"~/features/WebsocketService/errors.js\";\nimport { WebsocketService } from \"~/features/WebsocketService/index.js\";\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<Result<void, WebsocketService.Error>> {\n const result = await this.listConnections({\n where: {\n identityId: identity.id\n }\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n try {\n await this.transport.send<T>(result.value, data);\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n return Result.ok();\n }\n\n public async sendToConnections<T extends GenericRecord = GenericRecord>(\n connections: IWebsocketsTransportSendConnection[],\n data: IWebsocketsTransportSendData<T>\n ): Promise<Result<void, WebsocketService.Error>> {\n try {\n await this.transport.send<T>(connections, data);\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n return Result.ok();\n }\n\n public async listConnections(\n params?: IWebsocketsContextListConnectionsParams\n ): Promise<Result<IWebsocketsConnectionRegistryData[], WebsocketService.Error>> {\n let connections: IWebsocketsConnectionRegistryData[] = [];\n\n try {\n const where = params?.where || {};\n if (where.identityId) {\n connections = await this.registry.listViaIdentity(where.identityId);\n } else if (where.connections) {\n connections = await this.registry.listViaConnections(where.connections);\n } else if (where.tenant) {\n connections = await this.registry.listViaTenant(where.tenant);\n } else {\n connections = await this.registry.listAll();\n }\n } catch (error) {\n return Result.fail(new WebsocketServiceError(error));\n }\n\n // Defensively filter connections that were created in the last 3 hours.\n // This protects from attempting to send messages to stale connections.\n const threeHoursAgo = new Date(Date.now() - 3 * 60 * 60 * 1000).toISOString();\n connections = connections.filter(c => c.connectedOn >= threeHoursAgo);\n\n return Result.ok(connections);\n }\n\n public async disconnect(\n params?: IWebsocketsContextDisconnectConnectionsParams,\n notify = true\n ): Promise<Result<IWebsocketsConnectionRegistryData[], WebsocketService.Error>> {\n const result = await this.listConnections(params);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const connections = result.value;\n\n for (const connection of connections) {\n try {\n await this.registry.unregister(connection);\n } catch {\n // do nothing\n }\n }\n\n if (notify) {\n try {\n await this.transport.send(connections, {\n action: \"forcedDisconnect\"\n });\n } catch (error) {\n return Result.fail(new WebsocketForceDisconnectNotificationError(error));\n }\n }\n\n try {\n await this.transport.disconnect(connections);\n } catch (error) {\n return Result.fail(new WebsocketForceDisconnectError(error));\n }\n\n return Result.ok(connections);\n }\n}\n"],"names":["WebsocketsContext","registry","transport","identity","data","result","Result","error","WebsocketServiceError","connections","params","where","threeHoursAgo","Date","c","notify","connection","WebsocketForceDisconnectNotificationError","WebsocketForceDisconnectError"],"mappings":";;AAwBO,MAAMA;IAIT,YAAYC,QAAuC,EAAEC,SAA+B,CAAE;QAClF,IAAI,CAAC,QAAQ,GAAGD;QAChB,IAAI,CAAC,SAAS,GAAGC;IACrB;IAEA,MAAa,KACTC,QAAyC,EACzCC,IAAqC,EACQ;QAC7C,MAAMC,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC;YACtC,OAAO;gBACH,YAAYF,SAAS,EAAE;YAC3B;QACJ;QAEA,IAAIE,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAACD,OAAO,KAAK;QAGnC,IAAI;YACA,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAIA,OAAO,KAAK,EAAED;QAC/C,EAAE,OAAOG,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIE,sBAAsBD;QACjD;QAEA,OAAOD,OAAO,EAAE;IACpB;IAEA,MAAa,kBACTG,WAAiD,EACjDL,IAAqC,EACQ;QAC7C,IAAI;YACA,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAIK,aAAaL;QAC9C,EAAE,OAAOG,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIE,sBAAsBD;QACjD;QAEA,OAAOD,OAAO,EAAE;IACpB;IAEA,MAAa,gBACTI,MAAgD,EAC4B;QAC5E,IAAID,cAAmD,EAAE;QAEzD,IAAI;YACA,MAAME,QAAQD,QAAQ,SAAS,CAAC;YAE5BD,cADAE,MAAM,UAAU,GACF,MAAM,IAAI,CAAC,QAAQ,CAAC,eAAe,CAACA,MAAM,UAAU,IAC3DA,MAAM,WAAW,GACV,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAACA,MAAM,WAAW,IAC/DA,MAAM,MAAM,GACL,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAACA,MAAM,MAAM,IAE9C,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO;QAEjD,EAAE,OAAOJ,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIE,sBAAsBD;QACjD;QAIA,MAAMK,gBAAgB,IAAIC,KAAKA,KAAK,GAAG,KAAK,UAAoB,WAAW;QAC3EJ,cAAcA,YAAY,MAAM,CAACK,CAAAA,IAAKA,EAAE,WAAW,IAAIF;QAEvD,OAAON,OAAO,EAAE,CAACG;IACrB;IAEA,MAAa,WACTC,MAAsD,EACtDK,SAAS,IAAI,EAC+D;QAC5E,MAAMV,SAAS,MAAM,IAAI,CAAC,eAAe,CAACK;QAC1C,IAAIL,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAACD,OAAO,KAAK;QAGnC,MAAMI,cAAcJ,OAAO,KAAK;QAEhC,KAAK,MAAMW,cAAcP,YACrB,IAAI;YACA,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAACO;QACnC,EAAE,OAAM,CAER;QAGJ,IAAID,QACA,IAAI;YACA,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAACN,aAAa;gBACnC,QAAQ;YACZ;QACJ,EAAE,OAAOF,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIW,0CAA0CV;QACrE;QAGJ,IAAI;YACA,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAACE;QACpC,EAAE,OAAOF,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIY,8BAA8BX;QACzD;QAEA,OAAOD,OAAO,EAAE,CAACG;IACrB;AACJ"}
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=IWebsocketsContext.js.map
package/context/index.js CHANGED
@@ -1,22 +1,19 @@
1
1
  import { ContextPlugin } from "@webiny/handler";
2
- import { WebsocketsContext as WebsocketsImplementation } from "./WebsocketsContext.js";
2
+ import { WebsocketsContext } from "./WebsocketsContext.js";
3
3
  import { WebsocketsConnectionRegistry } from "../registry/index.js";
4
4
  import { WebsocketsTransport } from "../transport/index.js";
5
5
  import { WebsocketService } from "../features/WebsocketService/abstractions.js";
6
- export const createWebsocketsContext = () => {
7
- const plugin = new ContextPlugin(async context => {
8
- /**
9
- * TODO Find a better way to send the documentClient to the registry.
10
- */
11
- // @ts-expect-error
12
- const documentClient = context.db.driver.documentClient;
13
- const registry = new WebsocketsConnectionRegistry(documentClient);
14
- const transport = new WebsocketsTransport();
15
- context.websockets = new WebsocketsImplementation(registry, transport);
16
- context.container.registerInstance(WebsocketService, context.websockets);
17
- });
18
- plugin.name = "websockets.context";
19
- return plugin;
6
+ const createWebsocketsContext = ()=>{
7
+ const plugin = new ContextPlugin(async (context)=>{
8
+ const documentClient = context.db.driver.documentClient;
9
+ const registry = new WebsocketsConnectionRegistry(documentClient);
10
+ const transport = new WebsocketsTransport();
11
+ context.websockets = new WebsocketsContext(registry, transport);
12
+ context.container.registerInstance(WebsocketService, context.websockets);
13
+ });
14
+ plugin.name = "websockets.context";
15
+ return plugin;
20
16
  };
17
+ export { createWebsocketsContext };
21
18
 
22
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ContextPlugin","WebsocketsContext","WebsocketsImplementation","WebsocketsConnectionRegistry","WebsocketsTransport","WebsocketService","createWebsocketsContext","plugin","context","documentClient","db","driver","registry","transport","websockets","container","registerInstance","name"],"sources":["index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/handler\";\nimport type { Context } from \"~/types.js\";\nimport { WebsocketsContext as WebsocketsImplementation } from \"./WebsocketsContext.js\";\nimport { WebsocketsConnectionRegistry } from \"~/registry/index.js\";\nimport { WebsocketsTransport } from \"~/transport/index.js\";\nimport { WebsocketService } from \"~/features/WebsocketService/abstractions.js\";\n\nexport type * from \"./abstractions/IWebsocketsContext.js\";\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 WebsocketsImplementation(registry, transport);\n\n context.container.registerInstance(WebsocketService, context.websockets);\n });\n\n plugin.name = \"websockets.context\";\n\n return plugin;\n};\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,iBAAiB;AAE/C,SAASC,iBAAiB,IAAIC,wBAAwB;AACtD,SAASC,4BAA4B;AACrC,SAASC,mBAAmB;AAC5B,SAASC,gBAAgB;AAIzB,OAAO,MAAMC,uBAAuB,GAAGA,CAAA,KAAM;EACzC,MAAMC,MAAM,GAAG,IAAIP,aAAa,CAAU,MAAMQ,OAAO,IAAI;IACvD;AACR;AACA;IACQ;IACA,MAAMC,cAAc,GAAGD,OAAO,CAACE,EAAE,CAACC,MAAM,CAACF,cAAc;IACvD,MAAMG,QAAQ,GAAG,IAAIT,4BAA4B,CAACM,cAAc,CAAC;IACjE,MAAMI,SAAS,GAAG,IAAIT,mBAAmB,CAAC,CAAC;IAC3CI,OAAO,CAACM,UAAU,GAAG,IAAIZ,wBAAwB,CAACU,QAAQ,EAAEC,SAAS,CAAC;IAEtEL,OAAO,CAACO,SAAS,CAACC,gBAAgB,CAACX,gBAAgB,EAAEG,OAAO,CAACM,UAAU,CAAC;EAC5E,CAAC,CAAC;EAEFP,MAAM,CAACU,IAAI,GAAG,oBAAoB;EAElC,OAAOV,MAAM;AACjB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"context/index.js","sources":["../../src/context/index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/handler\";\nimport type { Context } from \"~/types.js\";\nimport { WebsocketsContext as WebsocketsImplementation } from \"./WebsocketsContext.js\";\nimport { WebsocketsConnectionRegistry } from \"~/registry/index.js\";\nimport { WebsocketsTransport } from \"~/transport/index.js\";\nimport { WebsocketService } from \"~/features/WebsocketService/abstractions.js\";\n\nexport type * from \"./abstractions/IWebsocketsContext.js\";\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 WebsocketsImplementation(registry, transport);\n\n context.container.registerInstance(WebsocketService, context.websockets);\n });\n\n plugin.name = \"websockets.context\";\n\n return plugin;\n};\n"],"names":["createWebsocketsContext","plugin","ContextPlugin","context","documentClient","registry","WebsocketsConnectionRegistry","transport","WebsocketsTransport","WebsocketsImplementation","WebsocketService"],"mappings":";;;;;AASO,MAAMA,0BAA0B;IACnC,MAAMC,SAAS,IAAIC,cAAuB,OAAMC;QAK5C,MAAMC,iBAAiBD,QAAQ,EAAE,CAAC,MAAM,CAAC,cAAc;QACvD,MAAME,WAAW,IAAIC,6BAA6BF;QAClD,MAAMG,YAAY,IAAIC;QACtBL,QAAQ,UAAU,GAAG,IAAIM,kBAAyBJ,UAAUE;QAE5DJ,QAAQ,SAAS,CAAC,gBAAgB,CAACO,kBAAkBP,QAAQ,UAAU;IAC3E;IAEAF,OAAO,IAAI,GAAG;IAEd,OAAOA;AACX"}
@@ -0,0 +1 @@
1
+ export declare const Websockets: import("@webiny/di").Abstraction<import("..").IWebsocketsContextObject>;
package/exports/api.js ADDED
@@ -0,0 +1,5 @@
1
+ import { WebsocketService } from "../features/WebsocketService/index.js";
2
+ const Websockets = WebsocketService;
3
+ export { Websockets };
4
+
5
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports/api.js","sources":["../../src/exports/api.ts"],"sourcesContent":["import { WebsocketService } from \"~/features/WebsocketService/index.js\";\n\nexport const Websockets = WebsocketService;\n"],"names":["Websockets","WebsocketService"],"mappings":";AAEO,MAAMA,aAAaC"}
@@ -1,4 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- export const WebsocketService = createAbstraction("WebsocketService");
2
+ const WebsocketService = createAbstraction("WebsocketService");
3
+ export { WebsocketService };
3
4
 
4
5
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","WebsocketService"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IWebsocketsContextObject } from \"~/context/abstractions/IWebsocketsContext.js\";\nimport {\n WebsocketForceDisconnectError,\n WebsocketForceDisconnectNotificationError,\n type WebsocketServiceError\n} from \"~/features/WebsocketService/errors.js\";\nimport type { IWebsocketsConnectionRegistryData } from \"~/registry/index.js\";\n\nexport const WebsocketService = createAbstraction<IWebsocketsContextObject>(\"WebsocketService\");\n\nexport namespace WebsocketService {\n export type Interface = IWebsocketsContextObject;\n export type Connection = IWebsocketsConnectionRegistryData;\n export type Error =\n | WebsocketServiceError\n | WebsocketForceDisconnectNotificationError\n | WebsocketForceDisconnectError;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AASvD,OAAO,MAAMC,gBAAgB,GAAGD,iBAAiB,CAA2B,kBAAkB,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/WebsocketService/abstractions.js","sources":["../../../src/features/WebsocketService/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IWebsocketsContextObject } from \"~/context/abstractions/IWebsocketsContext.js\";\nimport {\n WebsocketForceDisconnectError,\n WebsocketForceDisconnectNotificationError,\n type WebsocketServiceError\n} from \"~/features/WebsocketService/errors.js\";\nimport type { IWebsocketsConnectionRegistryData } from \"~/registry/index.js\";\n\nexport const WebsocketService = createAbstraction<IWebsocketsContextObject>(\"WebsocketService\");\n\nexport namespace WebsocketService {\n export type Interface = IWebsocketsContextObject;\n export type Connection = IWebsocketsConnectionRegistryData;\n export type Error =\n | WebsocketServiceError\n | WebsocketForceDisconnectNotificationError\n | WebsocketForceDisconnectError;\n}\n"],"names":["WebsocketService","createAbstraction"],"mappings":";AASO,MAAMA,mBAAmBC,kBAA4C"}
@@ -1,36 +1,34 @@
1
1
  import { BaseError } from "@webiny/feature/api";
2
- export class WebsocketServiceError extends BaseError {
3
- code = "Websocket/Service";
4
- constructor(error) {
5
- super({
6
- message: "WebsocketService encountered an error.",
7
- data: {
8
- error
9
- }
10
- });
11
- }
2
+ class WebsocketServiceError extends BaseError {
3
+ constructor(error){
4
+ super({
5
+ message: "WebsocketService encountered an error.",
6
+ data: {
7
+ error
8
+ }
9
+ }), this.code = "Websocket/Service";
10
+ }
12
11
  }
13
- export class WebsocketForceDisconnectNotificationError extends BaseError {
14
- code = "Websocket/Service/ForceDisconnectNotification";
15
- constructor(error) {
16
- super({
17
- message: "Failed to notify the clients about the forced disconnect.",
18
- data: {
19
- error
20
- }
21
- });
22
- }
12
+ class WebsocketForceDisconnectNotificationError extends BaseError {
13
+ constructor(error){
14
+ super({
15
+ message: "Failed to notify the clients about the forced disconnect.",
16
+ data: {
17
+ error
18
+ }
19
+ }), this.code = "Websocket/Service/ForceDisconnectNotification";
20
+ }
23
21
  }
24
- export class WebsocketForceDisconnectError extends BaseError {
25
- code = "Websocket/Service/ForceDisconnect";
26
- constructor(error) {
27
- super({
28
- message: "Failed to forcefully disconnect the Websocket clients.",
29
- data: {
30
- error
31
- }
32
- });
33
- }
22
+ class WebsocketForceDisconnectError extends BaseError {
23
+ constructor(error){
24
+ super({
25
+ message: "Failed to forcefully disconnect the Websocket clients.",
26
+ data: {
27
+ error
28
+ }
29
+ }), this.code = "Websocket/Service/ForceDisconnect";
30
+ }
34
31
  }
32
+ export { WebsocketForceDisconnectError, WebsocketForceDisconnectNotificationError, WebsocketServiceError };
35
33
 
36
34
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BaseError","WebsocketServiceError","code","constructor","error","message","data","WebsocketForceDisconnectNotificationError","WebsocketForceDisconnectError"],"sources":["errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\n\nexport class WebsocketServiceError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service\" as const;\n\n constructor(error: Error) {\n super({\n message: \"WebsocketService encountered an error.\",\n data: { error }\n });\n }\n}\n\nexport class WebsocketForceDisconnectNotificationError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service/ForceDisconnectNotification\" as const;\n\n constructor(error: Error) {\n super({\n message: \"Failed to notify the clients about the forced disconnect.\",\n data: { error }\n });\n }\n}\n\nexport class WebsocketForceDisconnectError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service/ForceDisconnect\" as const;\n\n constructor(error: Error) {\n super({\n message: \"Failed to forcefully disconnect the Websocket clients.\",\n data: { error }\n });\n }\n}\n"],"mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAqB;AAE/C,OAAO,MAAMC,qBAAqB,SAASD,SAAS,CAAmB;EACjDE,IAAI,GAAG,mBAAmB;EAE5CC,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,OAAO,EAAE,wCAAwC;MACjDC,IAAI,EAAE;QAAEF;MAAM;IAClB,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMG,yCAAyC,SAASP,SAAS,CAAmB;EACrEE,IAAI,GAAG,+CAA+C;EAExEC,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,OAAO,EAAE,2DAA2D;MACpEC,IAAI,EAAE;QAAEF;MAAM;IAClB,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMI,6BAA6B,SAASR,SAAS,CAAmB;EACzDE,IAAI,GAAG,mCAAmC;EAE5DC,WAAWA,CAACC,KAAY,EAAE;IACtB,KAAK,CAAC;MACFC,OAAO,EAAE,wDAAwD;MACjEC,IAAI,EAAE;QAAEF;MAAM;IAClB,CAAC,CAAC;EACN;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"features/WebsocketService/errors.js","sources":["../../../src/features/WebsocketService/errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\n\nexport class WebsocketServiceError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service\" as const;\n\n constructor(error: Error) {\n super({\n message: \"WebsocketService encountered an error.\",\n data: { error }\n });\n }\n}\n\nexport class WebsocketForceDisconnectNotificationError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service/ForceDisconnectNotification\" as const;\n\n constructor(error: Error) {\n super({\n message: \"Failed to notify the clients about the forced disconnect.\",\n data: { error }\n });\n }\n}\n\nexport class WebsocketForceDisconnectError extends BaseError<{ error: Error }> {\n override readonly code = \"Websocket/Service/ForceDisconnect\" as const;\n\n constructor(error: Error) {\n super({\n message: \"Failed to forcefully disconnect the Websocket clients.\",\n data: { error }\n });\n }\n}\n"],"names":["WebsocketServiceError","BaseError","error","WebsocketForceDisconnectNotificationError","WebsocketForceDisconnectError"],"mappings":";AAEO,MAAMA,8BAA8BC;IAGvC,YAAYC,KAAY,CAAE;QACtB,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBAAEA;YAAM;QAClB,SANc,IAAI,GAAG;IAOzB;AACJ;AAEO,MAAMC,kDAAkDF;IAG3D,YAAYC,KAAY,CAAE;QACtB,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBAAEA;YAAM;QAClB,SANc,IAAI,GAAG;IAOzB;AACJ;AAEO,MAAME,sCAAsCH;IAG/C,YAAYC,KAAY,CAAE;QACtB,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBAAEA;YAAM;QAClB,SANc,IAAI,GAAG;IAOzB;AACJ"}
@@ -1,3 +1 @@
1
1
  export { WebsocketService } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
@@ -1,16 +1,10 @@
1
1
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
2
2
  import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
3
- /**
4
- * Simple permission check. Only full access can access the websockets API via GraphQL - ({name: "*"})
5
- *
6
- * @throws
7
- */
8
- export const checkPermissions = async context => {
9
- const identityContext = context.container.resolve(IdentityContext);
10
- const permissions = await identityContext.getPermissions("websockets");
11
- if (permissions.length === 0) {
12
- throw new NotAuthorizedError();
13
- }
3
+ const checkPermissions = async (context)=>{
4
+ const identityContext = context.container.resolve(IdentityContext);
5
+ const permissions = await identityContext.getPermissions("websockets");
6
+ if (0 === permissions.length) throw new NotAuthorizedError();
14
7
  };
8
+ export { checkPermissions };
15
9
 
16
10
  //# sourceMappingURL=checkPermissions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["IdentityContext","NotAuthorizedError","checkPermissions","context","identityContext","container","resolve","permissions","getPermissions","length"],"sources":["checkPermissions.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport type { Context, WebsocketsPermission } from \"~/types.js\";\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 identityContext = context.container.resolve(IdentityContext);\n const permissions = await identityContext.getPermissions<WebsocketsPermission>(\"websockets\");\n\n if (permissions.length === 0) {\n throw new NotAuthorizedError();\n }\n};\n"],"mappings":"AAAA,SAASA,eAAe,QAAQ,6DAA6D;AAC7F,SAASC,kBAAkB,QAAQ,oDAAoD;AAGvF;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAgB,GAAG,MAAOC,OAAgB,IAAoB;EACvE,MAAMC,eAAe,GAAGD,OAAO,CAACE,SAAS,CAACC,OAAO,CAACN,eAAe,CAAC;EAClE,MAAMO,WAAW,GAAG,MAAMH,eAAe,CAACI,cAAc,CAAuB,YAAY,CAAC;EAE5F,IAAID,WAAW,CAACE,MAAM,KAAK,CAAC,EAAE;IAC1B,MAAM,IAAIR,kBAAkB,CAAC,CAAC;EAClC;AACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"graphql/checkPermissions.js","sources":["../../src/graphql/checkPermissions.ts"],"sourcesContent":["import { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport type { Context, WebsocketsPermission } from \"~/types.js\";\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 identityContext = context.container.resolve(IdentityContext);\n const permissions = await identityContext.getPermissions<WebsocketsPermission>(\"websockets\");\n\n if (permissions.length === 0) {\n throw new NotAuthorizedError();\n }\n};\n"],"names":["checkPermissions","context","identityContext","IdentityContext","permissions","NotAuthorizedError"],"mappings":";;AASO,MAAMA,mBAAmB,OAAOC;IACnC,MAAMC,kBAAkBD,QAAQ,SAAS,CAAC,OAAO,CAACE;IAClD,MAAMC,cAAc,MAAMF,gBAAgB,cAAc,CAAuB;IAE/E,IAAIE,AAAuB,MAAvBA,YAAY,MAAM,EAClB,MAAM,IAAIC;AAElB"}
@@ -1,80 +1,59 @@
1
1
  import { emptyResolver, resolve } from "./utils.js";
2
2
  import { checkPermissions } from "./checkPermissions.js";
3
- export const createResolvers = () => {
4
- return {
5
- Query: {
6
- websockets: emptyResolver
7
- },
8
- Mutation: {
9
- websockets: emptyResolver
10
- },
11
- WebsocketsQuery: {
12
- listConnections: async (_, args, context) => {
13
- return resolve(async () => {
14
- await checkPermissions(context);
15
- const result = await context.websockets.listConnections(args);
16
- if (result.isFail()) {
17
- throw result.error;
18
- }
19
- return result.value;
20
- });
21
- }
22
- },
23
- WebsocketsMutation: {
24
- disconnect: async (_, args, context) => {
25
- return resolve(async () => {
26
- await checkPermissions(context);
27
- const result = await context.websockets.disconnect({
28
- where: {
29
- connections: args.connections
30
- }
31
- });
32
- if (result.isFail()) {
33
- throw result.error;
34
- }
35
- return result.value;
36
- });
37
- },
38
- disconnectIdentity: async (_, args, context) => {
39
- return resolve(async () => {
40
- await checkPermissions(context);
41
- const result = await context.websockets.disconnect({
42
- where: {
43
- identityId: args.identityId
44
- }
45
- });
46
- if (result.isFail()) {
47
- throw result.error;
48
- }
49
- return result.value;
50
- });
51
- },
52
- disconnectTenant: async (_, args, context) => {
53
- return resolve(async () => {
54
- await checkPermissions(context);
55
- const result = await context.websockets.disconnect({
56
- where: {
57
- tenant: args.tenant
58
- }
59
- });
60
- if (result.isFail()) {
61
- throw result.error;
62
- }
63
- return result.value;
64
- });
65
- },
66
- disconnectAll: async (_, __, context) => {
67
- return resolve(async () => {
68
- await checkPermissions(context);
69
- const result = await context.websockets.disconnect();
70
- if (result.isFail()) {
71
- throw result.error;
72
- }
73
- return result.value;
74
- });
75
- }
76
- }
77
- };
78
- };
3
+ const createResolvers = ()=>({
4
+ Query: {
5
+ websockets: emptyResolver
6
+ },
7
+ Mutation: {
8
+ websockets: emptyResolver
9
+ },
10
+ WebsocketsQuery: {
11
+ listConnections: async (_, args, context)=>resolve(async ()=>{
12
+ await checkPermissions(context);
13
+ const result = await context.websockets.listConnections(args);
14
+ if (result.isFail()) throw result.error;
15
+ return result.value;
16
+ })
17
+ },
18
+ WebsocketsMutation: {
19
+ disconnect: async (_, args, context)=>resolve(async ()=>{
20
+ await checkPermissions(context);
21
+ const result = await context.websockets.disconnect({
22
+ where: {
23
+ connections: args.connections
24
+ }
25
+ });
26
+ if (result.isFail()) throw result.error;
27
+ return result.value;
28
+ }),
29
+ disconnectIdentity: async (_, args, context)=>resolve(async ()=>{
30
+ await checkPermissions(context);
31
+ const result = await context.websockets.disconnect({
32
+ where: {
33
+ identityId: args.identityId
34
+ }
35
+ });
36
+ if (result.isFail()) throw result.error;
37
+ return result.value;
38
+ }),
39
+ disconnectTenant: async (_, args, context)=>resolve(async ()=>{
40
+ await checkPermissions(context);
41
+ const result = await context.websockets.disconnect({
42
+ where: {
43
+ tenant: args.tenant
44
+ }
45
+ });
46
+ if (result.isFail()) throw result.error;
47
+ return result.value;
48
+ }),
49
+ disconnectAll: async (_, __, context)=>resolve(async ()=>{
50
+ await checkPermissions(context);
51
+ const result = await context.websockets.disconnect();
52
+ if (result.isFail()) throw result.error;
53
+ return result.value;
54
+ })
55
+ }
56
+ });
57
+ export { createResolvers };
79
58
 
80
59
  //# sourceMappingURL=createResolvers.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["emptyResolver","resolve","checkPermissions","createResolvers","Query","websockets","Mutation","WebsocketsQuery","listConnections","_","args","context","result","isFail","error","value","WebsocketsMutation","disconnect","where","connections","disconnectIdentity","identityId","disconnectTenant","tenant","disconnectAll","__"],"sources":["createResolvers.ts"],"sourcesContent":["import type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport type { Context } from \"~/types.js\";\nimport { emptyResolver, resolve } from \"./utils.js\";\nimport type { IWebsocketsContextListConnectionsParams } from \"~/context/index.js\";\nimport type { IWebsocketsConnectionRegistryData } from \"~/registry/index.js\";\nimport { checkPermissions } from \"~/graphql/checkPermissions.js\";\n\nexport interface IWebsocketsMutationDisconnectConnectionsArgs {\n connections: string[];\n}\n\nexport interface IWebsocketsMutationDisconnectIdentityArgs {\n identityId: string;\n}\n\nexport interface IWebsocketsMutationDisconnectTenantArgs {\n tenant: 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 const result = await context.websockets.listConnections(args);\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n }\n },\n WebsocketsMutation: {\n disconnect: async (_, args: IWebsocketsMutationDisconnectConnectionsArgs, context) => {\n return resolve(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n connections: args.connections\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectIdentity: async (\n _,\n args: IWebsocketsMutationDisconnectIdentityArgs,\n context\n ) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n identityId: args.identityId\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectTenant: async (_, args: IWebsocketsMutationDisconnectTenantArgs, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n tenant: args.tenant\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectAll: async (_, __, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect();\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n }\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"graphql/createResolvers.js","sources":["../../src/graphql/createResolvers.ts"],"sourcesContent":["import type { Resolvers } from \"@webiny/handler-graphql/types.js\";\nimport type { Context } from \"~/types.js\";\nimport { emptyResolver, resolve } from \"./utils.js\";\nimport type { IWebsocketsContextListConnectionsParams } from \"~/context/index.js\";\nimport type { IWebsocketsConnectionRegistryData } from \"~/registry/index.js\";\nimport { checkPermissions } from \"~/graphql/checkPermissions.js\";\n\nexport interface IWebsocketsMutationDisconnectConnectionsArgs {\n connections: string[];\n}\n\nexport interface IWebsocketsMutationDisconnectIdentityArgs {\n identityId: string;\n}\n\nexport interface IWebsocketsMutationDisconnectTenantArgs {\n tenant: 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 const result = await context.websockets.listConnections(args);\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n }\n },\n WebsocketsMutation: {\n disconnect: async (_, args: IWebsocketsMutationDisconnectConnectionsArgs, context) => {\n return resolve(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n connections: args.connections\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectIdentity: async (\n _,\n args: IWebsocketsMutationDisconnectIdentityArgs,\n context\n ) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n identityId: args.identityId\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectTenant: async (_, args: IWebsocketsMutationDisconnectTenantArgs, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect({\n where: {\n tenant: args.tenant\n }\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n },\n disconnectAll: async (_, __, context) => {\n return resolve<IWebsocketsConnectionRegistryData[]>(async () => {\n await checkPermissions(context);\n const result = await context.websockets.disconnect();\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return result.value;\n });\n }\n }\n };\n};\n"],"names":["createResolvers","emptyResolver","_","args","context","resolve","checkPermissions","result","__"],"mappings":";;AAmBO,MAAMA,kBAAkB,IACpB;QACH,OAAO;YACH,YAAYC;QAChB;QACA,UAAU;YACN,YAAYA;QAChB;QACA,iBAAiB;YACb,iBAAiB,OAAOC,GAAGC,MAA+CC,UAC/DC,QAAQ;oBACX,MAAMC,iBAAiBF;oBACvB,MAAMG,SAAS,MAAMH,QAAQ,UAAU,CAAC,eAAe,CAACD;oBAExD,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;QAER;QACA,oBAAoB;YAChB,YAAY,OAAOL,GAAGC,MAAoDC,UAC/DC,QAAQ;oBACX,MAAMC,iBAAiBF;oBACvB,MAAMG,SAAS,MAAMH,QAAQ,UAAU,CAAC,UAAU,CAAC;wBAC/C,OAAO;4BACH,aAAaD,KAAK,WAAW;wBACjC;oBACJ;oBAEA,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;YAEJ,oBAAoB,OAChBL,GACAC,MACAC,UAEOC,QAA6C;oBAChD,MAAMC,iBAAiBF;oBACvB,MAAMG,SAAS,MAAMH,QAAQ,UAAU,CAAC,UAAU,CAAC;wBAC/C,OAAO;4BACH,YAAYD,KAAK,UAAU;wBAC/B;oBACJ;oBAEA,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;YAEJ,kBAAkB,OAAOL,GAAGC,MAA+CC,UAChEC,QAA6C;oBAChD,MAAMC,iBAAiBF;oBACvB,MAAMG,SAAS,MAAMH,QAAQ,UAAU,CAAC,UAAU,CAAC;wBAC/C,OAAO;4BACH,QAAQD,KAAK,MAAM;wBACvB;oBACJ;oBAEA,IAAII,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;YAEJ,eAAe,OAAOL,GAAGM,IAAIJ,UAClBC,QAA6C;oBAChD,MAAMC,iBAAiBF;oBACvB,MAAMG,SAAS,MAAMH,QAAQ,UAAU,CAAC,UAAU;oBAElD,IAAIG,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;oBAGtB,OAAOA,OAAO,KAAK;gBACvB;QAER;IACJ"}
@@ -1,5 +1,4 @@
1
- export const createTypeDefs = () => {
2
- return /* GraphQL */`
1
+ const createTypeDefs = ()=>`
3
2
  type WebsocketsIdentity {
4
3
  id: String!
5
4
  type: String
@@ -64,6 +63,6 @@ export const createTypeDefs = () => {
64
63
  disconnectAll: WebsocketsDisconnectResponse!
65
64
  }
66
65
  `;
67
- };
66
+ export { createTypeDefs };
68
67
 
69
68
  //# sourceMappingURL=createTypeDefs.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createTypeDefs"],"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 }\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 }\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!): WebsocketsDisconnectResponse!\n disconnectAll: WebsocketsDisconnectResponse!\n }\n `;\n};\n"],"mappings":"AAAA,OAAO,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,KAAK;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"graphql/createTypeDefs.js","sources":["../../src/graphql/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 }\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 }\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!): WebsocketsDisconnectResponse!\n disconnectAll: WebsocketsDisconnectResponse!\n }\n `;\n};\n"],"names":["createTypeDefs"],"mappings":"AAAO,MAAMA,iBAAiB,IACL,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgEtB,CAAC"}