@webiny/api-websockets-standalone 0.0.0-unstable.0156a4c312

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 (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/WebsocketsStandaloneFeature.d.ts +10 -0
  4. package/WebsocketsStandaloneFeature.js +11 -0
  5. package/WebsocketsStandaloneFeature.js.map +1 -0
  6. package/adapter/NodeWsAdapter.d.ts +27 -0
  7. package/adapter/NodeWsAdapter.js +111 -0
  8. package/adapter/NodeWsAdapter.js.map +1 -0
  9. package/adapter/abstractions.d.ts +18 -0
  10. package/adapter/abstractions.js +5 -0
  11. package/adapter/abstractions.js.map +1 -0
  12. package/adapter/types.d.ts +2 -0
  13. package/adapter/types.js +0 -0
  14. package/bus/InProcessMessageBus.d.ts +11 -0
  15. package/bus/InProcessMessageBus.js +24 -0
  16. package/bus/InProcessMessageBus.js.map +1 -0
  17. package/bus/abstractions.d.ts +30 -0
  18. package/bus/abstractions.js +5 -0
  19. package/bus/abstractions.js.map +1 -0
  20. package/bus/createBusMessageHandler.d.ts +10 -0
  21. package/bus/createBusMessageHandler.js +20 -0
  22. package/bus/createBusMessageHandler.js.map +1 -0
  23. package/connectionManager/ServerConnectionManager.d.ts +21 -0
  24. package/connectionManager/ServerConnectionManager.js +85 -0
  25. package/connectionManager/ServerConnectionManager.js.map +1 -0
  26. package/connectionManager/abstractions.d.ts +34 -0
  27. package/connectionManager/abstractions.js +5 -0
  28. package/connectionManager/abstractions.js.map +1 -0
  29. package/delivery/disconnectLocalSockets.d.ts +10 -0
  30. package/delivery/disconnectLocalSockets.js +24 -0
  31. package/delivery/disconnectLocalSockets.js.map +1 -0
  32. package/delivery/sendToLocalSockets.d.ts +12 -0
  33. package/delivery/sendToLocalSockets.js +24 -0
  34. package/delivery/sendToLocalSockets.js.map +1 -0
  35. package/heartbeat/HeartbeatManager.d.ts +13 -0
  36. package/heartbeat/HeartbeatManager.js +46 -0
  37. package/heartbeat/HeartbeatManager.js.map +1 -0
  38. package/index.d.ts +12 -0
  39. package/index.js +11 -0
  40. package/package.json +42 -0
  41. package/server/WebsocketsServer.d.ts +55 -0
  42. package/server/WebsocketsServer.js +211 -0
  43. package/server/WebsocketsServer.js.map +1 -0
  44. package/server/types.d.ts +44 -0
  45. package/server/types.js +0 -0
  46. package/transport/ServerWebsocketsTransport.d.ts +21 -0
  47. package/transport/ServerWebsocketsTransport.js +77 -0
  48. package/transport/ServerWebsocketsTransport.js.map +1 -0
  49. package/upgradeHandler/DefaultUpgradeHandler.d.ts +8 -0
  50. package/upgradeHandler/DefaultUpgradeHandler.js +15 -0
  51. package/upgradeHandler/DefaultUpgradeHandler.js.map +1 -0
  52. package/upgradeHandler/abstractions.d.ts +17 -0
  53. package/upgradeHandler/abstractions.js +5 -0
  54. package/upgradeHandler/abstractions.js.map +1 -0
  55. package/validator/ServerWebsocketsEventValidator.d.ts +4 -0
  56. package/validator/ServerWebsocketsEventValidator.js +53 -0
  57. package/validator/ServerWebsocketsEventValidator.js.map +1 -0
@@ -0,0 +1,8 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ import { WebsocketsUpgradeHandler } from "./abstractions.js";
3
+ export declare class DefaultUpgradeHandlerImpl implements WebsocketsUpgradeHandler.Interface {
4
+ shouldUpgrade(_request: IncomingMessage): Promise<WebsocketsUpgradeHandler.Decision>;
5
+ }
6
+ export declare const DefaultUpgradeHandler: typeof DefaultUpgradeHandlerImpl & {
7
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IWebsocketsUpgradeHandler>;
8
+ };
@@ -0,0 +1,15 @@
1
+ import { WebsocketsUpgradeHandler } from "./abstractions.js";
2
+ class DefaultUpgradeHandlerImpl {
3
+ async shouldUpgrade(_request) {
4
+ return {
5
+ allowed: true
6
+ };
7
+ }
8
+ }
9
+ const DefaultUpgradeHandler = WebsocketsUpgradeHandler.createImplementation({
10
+ implementation: DefaultUpgradeHandlerImpl,
11
+ dependencies: []
12
+ });
13
+ export { DefaultUpgradeHandler, DefaultUpgradeHandlerImpl };
14
+
15
+ //# sourceMappingURL=DefaultUpgradeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeHandler/DefaultUpgradeHandler.js","sources":["../../src/upgradeHandler/DefaultUpgradeHandler.ts"],"sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { WebsocketsUpgradeHandler } from \"./abstractions.js\";\n\nexport class DefaultUpgradeHandlerImpl implements WebsocketsUpgradeHandler.Interface {\n public async shouldUpgrade(\n _request: IncomingMessage\n ): Promise<WebsocketsUpgradeHandler.Decision> {\n return { allowed: true };\n }\n}\n\nexport const DefaultUpgradeHandler = WebsocketsUpgradeHandler.createImplementation({\n implementation: DefaultUpgradeHandlerImpl,\n dependencies: []\n});\n"],"names":["DefaultUpgradeHandlerImpl","_request","DefaultUpgradeHandler","WebsocketsUpgradeHandler"],"mappings":";AAGO,MAAMA;IACT,MAAa,cACTC,QAAyB,EACiB;QAC1C,OAAO;YAAE,SAAS;QAAK;IAC3B;AACJ;AAEO,MAAMC,wBAAwBC,yBAAyB,oBAAoB,CAAC;IAC/E,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,17 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ type UpgradeDecision = {
3
+ allowed: true;
4
+ } | {
5
+ allowed: false;
6
+ statusCode: number;
7
+ reason: string;
8
+ };
9
+ export interface IWebsocketsUpgradeHandler {
10
+ shouldUpgrade(request: IncomingMessage): Promise<UpgradeDecision>;
11
+ }
12
+ export declare const WebsocketsUpgradeHandler: import("@webiny/di").Abstraction<IWebsocketsUpgradeHandler>;
13
+ export declare namespace WebsocketsUpgradeHandler {
14
+ type Interface = IWebsocketsUpgradeHandler;
15
+ type Decision = UpgradeDecision;
16
+ }
17
+ export {};
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const WebsocketsUpgradeHandler = createAbstraction("WebsocketsUpgradeHandler");
3
+ export { WebsocketsUpgradeHandler };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgradeHandler/abstractions.js","sources":["../../src/upgradeHandler/abstractions.ts"],"sourcesContent":["import type { IncomingMessage } from \"node:http\";\nimport { createAbstraction } from \"@webiny/feature/api\";\n\ntype UpgradeDecision = { allowed: true } | { allowed: false; statusCode: number; reason: string };\n\nexport interface IWebsocketsUpgradeHandler {\n shouldUpgrade(request: IncomingMessage): Promise<UpgradeDecision>;\n}\n\nexport const WebsocketsUpgradeHandler = createAbstraction<IWebsocketsUpgradeHandler>(\n \"WebsocketsUpgradeHandler\"\n);\n\nexport namespace WebsocketsUpgradeHandler {\n export type Interface = IWebsocketsUpgradeHandler;\n export type Decision = UpgradeDecision;\n}\n"],"names":["WebsocketsUpgradeHandler","createAbstraction"],"mappings":";AASO,MAAMA,2BAA2BC,kBACpC"}
@@ -0,0 +1,4 @@
1
+ import { WebsocketsEventValidator, WebsocketsRunner } from "@webiny/api-websockets/exports/api.js";
2
+ export declare class ServerWebsocketsEventValidator implements WebsocketsEventValidator.Interface {
3
+ validate<T extends WebsocketsRunner.EventData = WebsocketsRunner.EventData>(input: unknown): Promise<WebsocketsRunner.Event<T>>;
4
+ }
@@ -0,0 +1,53 @@
1
+ import zod from "zod";
2
+ import { createZodError } from "@webiny/utils";
3
+ const eventTypeEnum = zod["enum"]([
4
+ "message",
5
+ "connect",
6
+ "disconnect"
7
+ ]);
8
+ const contextValidation = zod.object({
9
+ connectionId: zod.string(),
10
+ connectedAt: zod.number(),
11
+ host: zod.string(),
12
+ eventType: eventTypeEnum,
13
+ route: zod.string(),
14
+ endpoint: zod.string()
15
+ });
16
+ const bodyValidation = zod.looseObject({
17
+ token: zod.string().optional(),
18
+ tenant: zod.string().optional(),
19
+ messageId: zod.string().nullish(),
20
+ action: zod.string().optional(),
21
+ data: zod.looseObject({}).nullish()
22
+ }).optional();
23
+ const validation = zod.object({
24
+ headers: zod.looseObject({}).optional(),
25
+ context: contextValidation,
26
+ body: bodyValidation
27
+ }).superRefine((output, ctx)=>{
28
+ if ("message" !== output.context.eventType) return;
29
+ if (!output.body) ctx.addIssue({
30
+ path: [
31
+ "body"
32
+ ],
33
+ message: "Message event must have a body.",
34
+ code: zod.ZodIssueCode.custom,
35
+ fatal: true
36
+ });
37
+ });
38
+ class ServerWebsocketsEventValidator {
39
+ async validate(input) {
40
+ const result = await validation.safeParseAsync(input);
41
+ if (!result.success) throw createZodError(result.error);
42
+ const event = {
43
+ headers: result.data.headers,
44
+ context: result.data.context,
45
+ body: result.data.body
46
+ };
47
+ if ("message" === event.context.eventType && event.body?.action) event.context.route = event.body.action;
48
+ return event;
49
+ }
50
+ }
51
+ export { ServerWebsocketsEventValidator };
52
+
53
+ //# sourceMappingURL=ServerWebsocketsEventValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator/ServerWebsocketsEventValidator.js","sources":["../../src/validator/ServerWebsocketsEventValidator.ts"],"sourcesContent":["import zod from \"zod\";\nimport { WebsocketsEventValidator, WebsocketsRunner } from \"@webiny/api-websockets/exports/api.js\";\nimport { createZodError } from \"@webiny/utils\";\n\nconst eventTypeEnum = zod.enum([\"message\", \"connect\", \"disconnect\"]);\n\nconst contextValidation = zod.object({\n connectionId: zod.string(),\n connectedAt: zod.number(),\n host: zod.string(),\n eventType: eventTypeEnum,\n route: zod.string(),\n endpoint: zod.string()\n});\n\nconst bodyValidation = zod\n .looseObject({\n token: zod.string().optional(),\n tenant: zod.string().optional(),\n messageId: zod.string().nullish(),\n action: zod.string().optional(),\n data: zod.looseObject({}).nullish()\n })\n .optional();\n\nconst validation = zod\n .object({\n headers: zod.looseObject({}).optional(),\n context: contextValidation,\n body: bodyValidation\n })\n .superRefine((output, ctx) => {\n if (output.context.eventType !== \"message\") {\n return;\n }\n if (!output.body) {\n ctx.addIssue({\n path: [\"body\"],\n message: \"Message event must have a body.\",\n code: zod.ZodIssueCode.custom,\n fatal: true\n });\n }\n });\n\nexport class ServerWebsocketsEventValidator implements WebsocketsEventValidator.Interface {\n public async validate<T extends WebsocketsRunner.EventData = WebsocketsRunner.EventData>(\n input: unknown\n ): Promise<WebsocketsRunner.Event<T>> {\n const result = await validation.safeParseAsync(input);\n if (!result.success) {\n throw createZodError(result.error);\n }\n\n const event: WebsocketsRunner.Event<T> = {\n headers: result.data.headers as Record<string, string>,\n context: result.data.context,\n body: result.data.body as T\n };\n\n /* Use body.action as custom route if provided. */\n if (event.context.eventType === \"message\" && event.body?.action) {\n event.context.route = event.body.action;\n }\n\n return event;\n }\n}\n"],"names":["eventTypeEnum","zod","contextValidation","bodyValidation","validation","output","ctx","ServerWebsocketsEventValidator","input","result","createZodError","event"],"mappings":";;AAIA,MAAMA,gBAAgBC,GAAG,CAAHA,OAAQ,CAAC;IAAC;IAAW;IAAW;CAAa;AAEnE,MAAMC,oBAAoBD,IAAI,MAAM,CAAC;IACjC,cAAcA,IAAI,MAAM;IACxB,aAAaA,IAAI,MAAM;IACvB,MAAMA,IAAI,MAAM;IAChB,WAAWD;IACX,OAAOC,IAAI,MAAM;IACjB,UAAUA,IAAI,MAAM;AACxB;AAEA,MAAME,iBAAiBF,IAAAA,WACP,CAAC;IACT,OAAOA,IAAI,MAAM,GAAG,QAAQ;IAC5B,QAAQA,IAAI,MAAM,GAAG,QAAQ;IAC7B,WAAWA,IAAI,MAAM,GAAG,OAAO;IAC/B,QAAQA,IAAI,MAAM,GAAG,QAAQ;IAC7B,MAAMA,IAAI,WAAW,CAAC,CAAC,GAAG,OAAO;AACrC,GACC,QAAQ;AAEb,MAAMG,aAAaH,IAAAA,MACR,CAAC;IACJ,SAASA,IAAI,WAAW,CAAC,CAAC,GAAG,QAAQ;IACrC,SAASC;IACT,MAAMC;AACV,GACC,WAAW,CAAC,CAACE,QAAQC;IAClB,IAAID,AAA6B,cAA7BA,OAAO,OAAO,CAAC,SAAS,EACxB;IAEJ,IAAI,CAACA,OAAO,IAAI,EACZC,IAAI,QAAQ,CAAC;QACT,MAAM;YAAC;SAAO;QACd,SAAS;QACT,MAAML,IAAI,YAAY,CAAC,MAAM;QAC7B,OAAO;IACX;AAER;AAEG,MAAMM;IACT,MAAa,SACTC,KAAc,EACoB;QAClC,MAAMC,SAAS,MAAML,WAAW,cAAc,CAACI;QAC/C,IAAI,CAACC,OAAO,OAAO,EACf,MAAMC,eAAeD,OAAO,KAAK;QAGrC,MAAME,QAAmC;YACrC,SAASF,OAAO,IAAI,CAAC,OAAO;YAC5B,SAASA,OAAO,IAAI,CAAC,OAAO;YAC5B,MAAMA,OAAO,IAAI,CAAC,IAAI;QAC1B;QAGA,IAAIE,AAA4B,cAA5BA,MAAM,OAAO,CAAC,SAAS,IAAkBA,MAAM,IAAI,EAAE,QACrDA,MAAM,OAAO,CAAC,KAAK,GAAGA,MAAM,IAAI,CAAC,MAAM;QAG3C,OAAOA;IACX;AACJ"}