@webiny/api-websockets 6.3.0-beta.4 → 6.4.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/context/WebsocketsContext.js +57 -72
- package/context/WebsocketsContext.js.map +1 -1
- package/context/abstractions/IWebsocketsContext.js +0 -3
- package/context/index.js +12 -15
- package/context/index.js.map +1 -1
- package/exports/api.d.ts +1 -0
- package/exports/api.js +5 -0
- package/exports/api.js.map +1 -0
- package/features/WebsocketService/abstractions.js +2 -1
- package/features/WebsocketService/abstractions.js.map +1 -1
- package/features/WebsocketService/errors.js +28 -30
- package/features/WebsocketService/errors.js.map +1 -1
- package/features/WebsocketService/index.js +0 -2
- package/graphql/checkPermissions.js +5 -11
- package/graphql/checkPermissions.js.map +1 -1
- package/graphql/createResolvers.js +55 -76
- package/graphql/createResolvers.js.map +1 -1
- package/graphql/createTypeDefs.js +2 -3
- package/graphql/createTypeDefs.js.map +1 -1
- package/graphql/index.js +8 -7
- package/graphql/index.js.map +1 -1
- package/graphql/utils.js +8 -7
- package/graphql/utils.js.map +1 -1
- package/handler/handler.js +58 -66
- package/handler/handler.js.map +1 -1
- package/handler/headers.js +21 -28
- package/handler/headers.js.map +1 -1
- package/handler/register.js +9 -19
- package/handler/register.js.map +1 -1
- package/handler/types.js +11 -10
- package/handler/types.js.map +1 -1
- package/index.js +5 -3
- package/index.js.map +1 -1
- package/package.json +20 -20
- package/plugins/WebsocketsActionPlugin.js +14 -13
- package/plugins/WebsocketsActionPlugin.js.map +1 -1
- package/plugins/WebsocketsRoutePlugin.js +14 -13
- package/plugins/WebsocketsRoutePlugin.js.map +1 -1
- package/plugins/abstrations/IWebsocketsActionPlugin.js +0 -3
- package/plugins/index.js +0 -2
- package/registry/WebsocketsConnectionRegistry.js +107 -146
- package/registry/WebsocketsConnectionRegistry.js.map +1 -1
- package/registry/abstractions/IWebsocketsConnectionRegistry.js +0 -3
- package/registry/entity.js +44 -43
- package/registry/entity.js.map +1 -1
- package/registry/index.js +0 -2
- package/response/WebsocketsResponse.js +20 -19
- package/response/WebsocketsResponse.js.map +1 -1
- package/response/abstractions/IWebsocketsResponse.js +0 -3
- package/response/index.js +0 -2
- package/runner/WebsocketsRunner.js +137 -164
- package/runner/WebsocketsRunner.js.map +1 -1
- package/runner/abstractions/IWebsocketsRunner.js +0 -3
- package/runner/index.js +0 -2
- package/runner/routes/connect.js +30 -40
- package/runner/routes/connect.js.map +1 -1
- package/runner/routes/default.js +16 -22
- package/runner/routes/default.js.map +1 -1
- package/runner/routes/disconnect.js +10 -13
- package/runner/routes/disconnect.js.map +1 -1
- package/runner/routes/index.js +6 -3
- package/runner/routes/index.js.map +1 -1
- package/transport/WebsocketsTransport.js +36 -39
- package/transport/WebsocketsTransport.js.map +1 -1
- package/transport/abstractions/IWebsocketsTransport.js +0 -3
- package/transport/index.js +0 -2
- package/types.js +0 -3
- package/utils/middleware.js +9 -14
- package/utils/middleware.js.map +1 -1
- package/validator/WebsocketsEventValidator.js +55 -63
- package/validator/WebsocketsEventValidator.js.map +1 -1
- package/validator/abstractions/IWebsocketsEventValidator.js +0 -3
- package/validator/index.js +0 -2
- package/context/abstractions/IWebsocketsContext.js.map +0 -1
- package/features/WebsocketService/index.js.map +0 -1
- package/plugins/abstrations/IWebsocketsActionPlugin.js.map +0 -1
- package/plugins/index.js.map +0 -1
- package/registry/abstractions/IWebsocketsConnectionRegistry.js.map +0 -1
- package/registry/index.js.map +0 -1
- package/response/abstractions/IWebsocketsResponse.js.map +0 -1
- package/response/index.js.map +0 -1
- package/runner/abstractions/IWebsocketsRunner.js.map +0 -1
- package/runner/index.js.map +0 -1
- package/transport/abstractions/IWebsocketsTransport.js.map +0 -1
- package/transport/index.js.map +0 -1
- package/types.js.map +0 -1
- package/validator/abstractions/IWebsocketsEventValidator.js.map +0 -1
- package/validator/index.js.map +0 -1
|
@@ -1,178 +1,151 @@
|
|
|
1
|
-
import
|
|
1
|
+
import error from "@webiny/error";
|
|
2
2
|
import { WebsocketsEventRequestContextEventType } from "../handler/types.js";
|
|
3
3
|
import { WebsocketsRoutePlugin } from "../plugins/index.js";
|
|
4
4
|
import { middleware } from "../utils/middleware.js";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
async run(input) {
|
|
13
|
-
let event;
|
|
14
|
-
try {
|
|
15
|
-
event = await this.validator.validate(input);
|
|
16
|
-
} catch (ex) {
|
|
17
|
-
const result = this.response.error({
|
|
18
|
-
message: "Validation failed.",
|
|
19
|
-
error: {
|
|
20
|
-
message: ex.message,
|
|
21
|
-
code: ex.code,
|
|
22
|
-
data: ex.data,
|
|
23
|
-
stack: ex.stack
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
const {
|
|
27
|
-
connectionId,
|
|
28
|
-
domainName,
|
|
29
|
-
stage,
|
|
30
|
-
eventType
|
|
31
|
-
} = input.requestContext || {};
|
|
32
|
-
let messageId;
|
|
33
|
-
try {
|
|
34
|
-
const body = typeof input.body === "string" ? input.body : JSON.stringify(input.body || {});
|
|
35
|
-
const json = JSON.parse(body);
|
|
36
|
-
messageId = json.messageId;
|
|
37
|
-
} catch {
|
|
38
|
-
// Do nothing
|
|
39
|
-
}
|
|
40
|
-
if (!connectionId || !stage || !domainName || !eventType) {
|
|
41
|
-
return result;
|
|
42
|
-
}
|
|
43
|
-
await this.respond({
|
|
44
|
-
connectionId,
|
|
45
|
-
domainName,
|
|
46
|
-
stage,
|
|
47
|
-
eventType,
|
|
48
|
-
messageId,
|
|
49
|
-
result
|
|
50
|
-
});
|
|
51
|
-
return result;
|
|
5
|
+
class WebsocketsRunner {
|
|
6
|
+
constructor(context, registry, validator, response){
|
|
7
|
+
this.context = context;
|
|
8
|
+
this.registry = registry;
|
|
9
|
+
this.validator = validator;
|
|
10
|
+
this.response = response;
|
|
52
11
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
12
|
+
async run(input) {
|
|
13
|
+
let event;
|
|
14
|
+
try {
|
|
15
|
+
event = await this.validator.validate(input);
|
|
16
|
+
} catch (ex) {
|
|
17
|
+
const result = this.response.error({
|
|
18
|
+
message: "Validation failed.",
|
|
19
|
+
error: {
|
|
20
|
+
message: ex.message,
|
|
21
|
+
code: ex.code,
|
|
22
|
+
data: ex.data,
|
|
23
|
+
stack: ex.stack
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
const { connectionId, domainName, stage, eventType } = input.requestContext || {};
|
|
27
|
+
let messageId;
|
|
28
|
+
try {
|
|
29
|
+
const body = "string" == typeof input.body ? input.body : JSON.stringify(input.body || {});
|
|
30
|
+
const json = JSON.parse(body);
|
|
31
|
+
messageId = json.messageId;
|
|
32
|
+
} catch {}
|
|
33
|
+
if (!connectionId || !stage || !domainName || !eventType) return result;
|
|
34
|
+
await this.respond({
|
|
35
|
+
connectionId,
|
|
36
|
+
domainName,
|
|
37
|
+
stage,
|
|
38
|
+
eventType,
|
|
39
|
+
messageId,
|
|
40
|
+
result
|
|
41
|
+
});
|
|
42
|
+
return result;
|
|
64
43
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
44
|
+
let result;
|
|
45
|
+
try {
|
|
46
|
+
result = await this.executeRoute(event);
|
|
47
|
+
} catch (ex) {
|
|
48
|
+
result = this.response.error({
|
|
49
|
+
message: `Route "${event.requestContext.routeKey}" action failed.`,
|
|
50
|
+
error: {
|
|
51
|
+
message: ex.message,
|
|
52
|
+
code: ex.code,
|
|
53
|
+
data: ex.data,
|
|
54
|
+
stack: ex.stack
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
await this.respond({
|
|
60
|
+
...event.requestContext,
|
|
61
|
+
messageId: event.body?.messageId,
|
|
62
|
+
result
|
|
63
|
+
});
|
|
64
|
+
return result;
|
|
65
|
+
} catch (ex) {
|
|
66
|
+
return this.response.error({
|
|
67
|
+
message: "Failed to respond to the request.",
|
|
68
|
+
error: {
|
|
69
|
+
message: ex.message,
|
|
70
|
+
code: ex.code,
|
|
71
|
+
data: {
|
|
72
|
+
...ex.data,
|
|
73
|
+
result
|
|
74
|
+
},
|
|
75
|
+
stack: ex.stack
|
|
76
|
+
}
|
|
77
|
+
});
|
|
85
78
|
}
|
|
86
|
-
});
|
|
87
79
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
throw new WebinyError(`There are no plugins for the route: ${route}.`, "NO_ROUTE_PLUGINS", {
|
|
95
|
-
route
|
|
96
|
-
});
|
|
80
|
+
getRoutePlugins(route) {
|
|
81
|
+
const plugins = this.context.plugins.byType(WebsocketsRoutePlugin.type).filter((plugin)=>plugin.route === route);
|
|
82
|
+
if (0 === plugins.length) throw new error(`There are no plugins for the route: ${route}.`, "NO_ROUTE_PLUGINS", {
|
|
83
|
+
route
|
|
84
|
+
});
|
|
85
|
+
return plugins;
|
|
97
86
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
87
|
+
async executeRoute(event) {
|
|
88
|
+
const plugins = this.getRoutePlugins(event.requestContext.routeKey).reverse();
|
|
89
|
+
const getTenant = ()=>{
|
|
90
|
+
const tenant = this.context.tenancy.getCurrentTenant();
|
|
91
|
+
return tenant?.id || null;
|
|
92
|
+
};
|
|
93
|
+
const getIdentity = ()=>{
|
|
94
|
+
const identity = this.context.security.getIdentity();
|
|
95
|
+
return identity || null;
|
|
96
|
+
};
|
|
97
|
+
const action = middleware(plugins.map((plugin)=>async (params, next)=>plugin.run({
|
|
98
|
+
registry: params.registry,
|
|
99
|
+
event: params.event,
|
|
100
|
+
context: params.context,
|
|
101
|
+
getTenant,
|
|
102
|
+
getIdentity,
|
|
103
|
+
response: this.response,
|
|
104
|
+
next
|
|
105
|
+
})));
|
|
106
|
+
const result = await action({
|
|
107
|
+
event,
|
|
108
|
+
registry: this.registry,
|
|
109
|
+
context: this.context
|
|
110
|
+
});
|
|
111
|
+
if (result) return result;
|
|
112
|
+
const message = "No response from the route action.";
|
|
113
|
+
return this.response.error({
|
|
114
|
+
message,
|
|
115
|
+
error: {
|
|
116
|
+
message,
|
|
117
|
+
code: "NO_RESPONSE"
|
|
118
|
+
},
|
|
119
|
+
statusCode: 404
|
|
123
120
|
});
|
|
124
|
-
};
|
|
125
|
-
}));
|
|
126
|
-
const result = await action({
|
|
127
|
-
event,
|
|
128
|
-
registry: this.registry,
|
|
129
|
-
context: this.context
|
|
130
|
-
});
|
|
131
|
-
if (result) {
|
|
132
|
-
return result;
|
|
133
121
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
domainName,
|
|
160
|
-
stage
|
|
161
|
-
};
|
|
162
|
-
console.error(message, JSON.stringify(data));
|
|
163
|
-
throw new WebinyError(message, "GENERAL_ERROR", data);
|
|
122
|
+
async respond(params) {
|
|
123
|
+
const { connectionId, domainName, stage, eventType, result, messageId } = params;
|
|
124
|
+
if (eventType !== WebsocketsEventRequestContextEventType.message) return;
|
|
125
|
+
if (!connectionId || !domainName || !stage) {
|
|
126
|
+
const message = "No connectionId, domainName or stage.";
|
|
127
|
+
const data = {
|
|
128
|
+
connectionId,
|
|
129
|
+
domainName,
|
|
130
|
+
stage
|
|
131
|
+
};
|
|
132
|
+
console.error(message, JSON.stringify(data));
|
|
133
|
+
throw new error(message, "GENERAL_ERROR", data);
|
|
134
|
+
}
|
|
135
|
+
const connection = {
|
|
136
|
+
connectionId,
|
|
137
|
+
domainName,
|
|
138
|
+
stage
|
|
139
|
+
};
|
|
140
|
+
const dataToSend = {
|
|
141
|
+
...result,
|
|
142
|
+
messageId
|
|
143
|
+
};
|
|
144
|
+
await this.context.websockets.sendToConnections([
|
|
145
|
+
connection
|
|
146
|
+
], dataToSend);
|
|
164
147
|
}
|
|
165
|
-
const connection = {
|
|
166
|
-
connectionId,
|
|
167
|
-
domainName,
|
|
168
|
-
stage
|
|
169
|
-
};
|
|
170
|
-
const dataToSend = {
|
|
171
|
-
...result,
|
|
172
|
-
messageId
|
|
173
|
-
};
|
|
174
|
-
await this.context.websockets.sendToConnections([connection], dataToSend);
|
|
175
|
-
}
|
|
176
148
|
}
|
|
149
|
+
export { WebsocketsRunner };
|
|
177
150
|
|
|
178
151
|
//# sourceMappingURL=WebsocketsRunner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["WebinyError","WebsocketsEventRequestContextEventType","WebsocketsRoutePlugin","middleware","WebsocketsRunner","constructor","context","registry","validator","response","run","input","event","validate","ex","result","error","message","code","data","stack","connectionId","domainName","stage","eventType","requestContext","messageId","body","JSON","stringify","json","parse","respond","executeRoute","routeKey","getRoutePlugins","route","plugins","byType","type","filter","plugin","length","reverse","getTenant","tenant","tenancy","getCurrentTenant","id","getIdentity","identity","security","action","map","params","next","statusCode","console","connection","dataToSend","websockets","sendToConnections"],"sources":["WebsocketsRunner.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IWebsocketsEvent,\n IWebsocketsEventData,\n IWebsocketsEventRequestContext,\n IWebsocketsIncomingEvent,\n WebsocketsEventRoute\n} from \"~/handler/types.js\";\nimport { WebsocketsEventRequestContextEventType } from \"~/handler/types.js\";\nimport type { Context } from \"~/types.js\";\nimport type { IWebsocketsEventValidator } from \"~/validator/index.js\";\nimport type {\n IWebsocketsRunner,\n IWebsocketsRunnerResponse\n} from \"./abstractions/IWebsocketsRunner.js\";\nimport type { IWebsocketsRoutePluginCallableParams } from \"~/plugins/index.js\";\nimport { WebsocketsRoutePlugin } from \"~/plugins/index.js\";\nimport { middleware } from \"~/utils/middleware.js\";\nimport type { IWebsocketsConnectionRegistry } from \"~/registry/index.js\";\nimport type {\n IWebsocketsResponse,\n IWebsocketsResponseErrorResult,\n IWebsocketsResponseOkResult\n} from \"~/response/index.js\";\nimport type { IWebsocketsTransportSendConnection } from \"~/transport/index.js\";\nimport type { IWebsocketsIdentity } from \"~/context/index.js\";\n\ntype MiddlewareParams<C extends Context = Context> = Pick<\n IWebsocketsRoutePluginCallableParams<C>,\n \"context\" | \"event\" | \"registry\"\n>;\n\ninterface IWebsocketsRunnerRespondParams extends Pick<\n IWebsocketsEventRequestContext,\n \"connectionId\" | \"domainName\" | \"stage\" | \"eventType\"\n> {\n messageId?: string;\n result: IWebsocketsResponseOkResult | IWebsocketsResponseErrorResult;\n}\n\nexport class WebsocketsRunner implements IWebsocketsRunner {\n private readonly context: Context;\n private readonly registry: IWebsocketsConnectionRegistry;\n private readonly validator: IWebsocketsEventValidator;\n private readonly response: IWebsocketsResponse;\n\n public constructor(\n context: Context,\n registry: IWebsocketsConnectionRegistry,\n validator: IWebsocketsEventValidator,\n response: IWebsocketsResponse\n ) {\n this.context = context;\n this.registry = registry;\n this.validator = validator;\n this.response = response;\n }\n\n public async run<T extends IWebsocketsEventData = IWebsocketsEventData>(\n input: IWebsocketsIncomingEvent\n ): Promise<IWebsocketsRunnerResponse> {\n let event: IWebsocketsEvent<T> | undefined;\n try {\n event = await this.validator.validate<T>(input);\n } catch (ex) {\n const result = this.response.error({\n message: \"Validation failed.\",\n error: {\n message: ex.message,\n code: ex.code,\n data: ex.data,\n stack: ex.stack\n }\n });\n\n const { connectionId, domainName, stage, eventType } = input.requestContext || {};\n let messageId: string | undefined;\n try {\n const body =\n typeof input.body === \"string\" ? input.body : JSON.stringify(input.body || {});\n const json = JSON.parse(body);\n messageId = json.messageId;\n } catch {\n // Do nothing\n }\n if (!connectionId || !stage || !domainName || !eventType) {\n return result;\n }\n\n await this.respond({\n connectionId,\n domainName,\n stage,\n eventType,\n messageId,\n result\n });\n return result;\n }\n\n let result: IWebsocketsResponseOkResult | IWebsocketsResponseErrorResult;\n try {\n result = await this.executeRoute(event);\n } catch (ex) {\n result = this.response.error({\n message: `Route \"${event.requestContext.routeKey}\" action failed.`,\n error: {\n message: ex.message,\n code: ex.code,\n data: ex.data,\n stack: ex.stack\n }\n });\n }\n try {\n await this.respond({\n ...event.requestContext,\n messageId: event.body?.messageId,\n result\n });\n return result;\n } catch (ex) {\n return this.response.error({\n message: \"Failed to respond to the request.\",\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n ...ex.data,\n result\n },\n stack: ex.stack\n }\n });\n }\n }\n\n private getRoutePlugins(route: WebsocketsEventRoute | string): WebsocketsRoutePlugin[] {\n const plugins = this.context.plugins\n .byType<WebsocketsRoutePlugin>(WebsocketsRoutePlugin.type)\n .filter(plugin => {\n return plugin.route === route;\n });\n if (plugins.length === 0) {\n throw new WebinyError(\n `There are no plugins for the route: ${route}.`,\n \"NO_ROUTE_PLUGINS\",\n {\n route\n }\n );\n }\n return plugins;\n }\n\n private async executeRoute(event: IWebsocketsEvent): Promise<IWebsocketsRunnerResponse> {\n /**\n * We will always fetch plugins in reverse order, so that users can override our default ones if necessary.\n */\n const plugins = this.getRoutePlugins(event.requestContext.routeKey).reverse();\n\n const getTenant = () => {\n const tenant = this.context.tenancy.getCurrentTenant();\n return tenant?.id || null;\n };\n\n const getIdentity = (): IWebsocketsIdentity | null => {\n const identity = this.context.security.getIdentity();\n return identity || null;\n };\n\n const action = middleware<MiddlewareParams, IWebsocketsRunnerResponse>(\n plugins.map(plugin => {\n return async (params, next) => {\n return plugin.run({\n registry: params.registry,\n event: params.event,\n context: params.context,\n getTenant,\n getIdentity,\n response: this.response,\n next\n });\n };\n })\n );\n\n const result = await action({\n event,\n registry: this.registry,\n context: this.context\n });\n if (result) {\n return result;\n }\n const message = \"No response from the route action.\";\n return this.response.error({\n message,\n error: {\n message,\n code: \"NO_RESPONSE\"\n },\n statusCode: 404\n });\n }\n\n private async respond(params: IWebsocketsRunnerRespondParams): Promise<void> {\n const { connectionId, domainName, stage, eventType, result, messageId } = params;\n if (eventType !== WebsocketsEventRequestContextEventType.message) {\n return;\n } else if (!connectionId || !domainName || !stage) {\n const message = \"No connectionId, domainName or stage.\";\n const data = {\n connectionId,\n domainName,\n stage\n };\n console.error(message, JSON.stringify(data));\n throw new WebinyError(message, \"GENERAL_ERROR\", data);\n }\n const connection: IWebsocketsTransportSendConnection = {\n connectionId,\n domainName,\n stage\n };\n\n const dataToSend = {\n ...result,\n messageId\n };\n await this.context.websockets.sendToConnections([connection], dataToSend);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"runner/WebsocketsRunner.js","sources":["../../src/runner/WebsocketsRunner.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n IWebsocketsEvent,\n IWebsocketsEventData,\n IWebsocketsEventRequestContext,\n IWebsocketsIncomingEvent,\n WebsocketsEventRoute\n} from \"~/handler/types.js\";\nimport { WebsocketsEventRequestContextEventType } from \"~/handler/types.js\";\nimport type { Context } from \"~/types.js\";\nimport type { IWebsocketsEventValidator } from \"~/validator/index.js\";\nimport type {\n IWebsocketsRunner,\n IWebsocketsRunnerResponse\n} from \"./abstractions/IWebsocketsRunner.js\";\nimport type { IWebsocketsRoutePluginCallableParams } from \"~/plugins/index.js\";\nimport { WebsocketsRoutePlugin } from \"~/plugins/index.js\";\nimport { middleware } from \"~/utils/middleware.js\";\nimport type { IWebsocketsConnectionRegistry } from \"~/registry/index.js\";\nimport type {\n IWebsocketsResponse,\n IWebsocketsResponseErrorResult,\n IWebsocketsResponseOkResult\n} from \"~/response/index.js\";\nimport type { IWebsocketsTransportSendConnection } from \"~/transport/index.js\";\nimport type { IWebsocketsIdentity } from \"~/context/index.js\";\n\ntype MiddlewareParams<C extends Context = Context> = Pick<\n IWebsocketsRoutePluginCallableParams<C>,\n \"context\" | \"event\" | \"registry\"\n>;\n\ninterface IWebsocketsRunnerRespondParams extends Pick<\n IWebsocketsEventRequestContext,\n \"connectionId\" | \"domainName\" | \"stage\" | \"eventType\"\n> {\n messageId?: string;\n result: IWebsocketsResponseOkResult | IWebsocketsResponseErrorResult;\n}\n\nexport class WebsocketsRunner implements IWebsocketsRunner {\n private readonly context: Context;\n private readonly registry: IWebsocketsConnectionRegistry;\n private readonly validator: IWebsocketsEventValidator;\n private readonly response: IWebsocketsResponse;\n\n public constructor(\n context: Context,\n registry: IWebsocketsConnectionRegistry,\n validator: IWebsocketsEventValidator,\n response: IWebsocketsResponse\n ) {\n this.context = context;\n this.registry = registry;\n this.validator = validator;\n this.response = response;\n }\n\n public async run<T extends IWebsocketsEventData = IWebsocketsEventData>(\n input: IWebsocketsIncomingEvent\n ): Promise<IWebsocketsRunnerResponse> {\n let event: IWebsocketsEvent<T> | undefined;\n try {\n event = await this.validator.validate<T>(input);\n } catch (ex) {\n const result = this.response.error({\n message: \"Validation failed.\",\n error: {\n message: ex.message,\n code: ex.code,\n data: ex.data,\n stack: ex.stack\n }\n });\n\n const { connectionId, domainName, stage, eventType } = input.requestContext || {};\n let messageId: string | undefined;\n try {\n const body =\n typeof input.body === \"string\" ? input.body : JSON.stringify(input.body || {});\n const json = JSON.parse(body);\n messageId = json.messageId;\n } catch {\n // Do nothing\n }\n if (!connectionId || !stage || !domainName || !eventType) {\n return result;\n }\n\n await this.respond({\n connectionId,\n domainName,\n stage,\n eventType,\n messageId,\n result\n });\n return result;\n }\n\n let result: IWebsocketsResponseOkResult | IWebsocketsResponseErrorResult;\n try {\n result = await this.executeRoute(event);\n } catch (ex) {\n result = this.response.error({\n message: `Route \"${event.requestContext.routeKey}\" action failed.`,\n error: {\n message: ex.message,\n code: ex.code,\n data: ex.data,\n stack: ex.stack\n }\n });\n }\n try {\n await this.respond({\n ...event.requestContext,\n messageId: event.body?.messageId,\n result\n });\n return result;\n } catch (ex) {\n return this.response.error({\n message: \"Failed to respond to the request.\",\n error: {\n message: ex.message,\n code: ex.code,\n data: {\n ...ex.data,\n result\n },\n stack: ex.stack\n }\n });\n }\n }\n\n private getRoutePlugins(route: WebsocketsEventRoute | string): WebsocketsRoutePlugin[] {\n const plugins = this.context.plugins\n .byType<WebsocketsRoutePlugin>(WebsocketsRoutePlugin.type)\n .filter(plugin => {\n return plugin.route === route;\n });\n if (plugins.length === 0) {\n throw new WebinyError(\n `There are no plugins for the route: ${route}.`,\n \"NO_ROUTE_PLUGINS\",\n {\n route\n }\n );\n }\n return plugins;\n }\n\n private async executeRoute(event: IWebsocketsEvent): Promise<IWebsocketsRunnerResponse> {\n /**\n * We will always fetch plugins in reverse order, so that users can override our default ones if necessary.\n */\n const plugins = this.getRoutePlugins(event.requestContext.routeKey).reverse();\n\n const getTenant = () => {\n const tenant = this.context.tenancy.getCurrentTenant();\n return tenant?.id || null;\n };\n\n const getIdentity = (): IWebsocketsIdentity | null => {\n const identity = this.context.security.getIdentity();\n return identity || null;\n };\n\n const action = middleware<MiddlewareParams, IWebsocketsRunnerResponse>(\n plugins.map(plugin => {\n return async (params, next) => {\n return plugin.run({\n registry: params.registry,\n event: params.event,\n context: params.context,\n getTenant,\n getIdentity,\n response: this.response,\n next\n });\n };\n })\n );\n\n const result = await action({\n event,\n registry: this.registry,\n context: this.context\n });\n if (result) {\n return result;\n }\n const message = \"No response from the route action.\";\n return this.response.error({\n message,\n error: {\n message,\n code: \"NO_RESPONSE\"\n },\n statusCode: 404\n });\n }\n\n private async respond(params: IWebsocketsRunnerRespondParams): Promise<void> {\n const { connectionId, domainName, stage, eventType, result, messageId } = params;\n if (eventType !== WebsocketsEventRequestContextEventType.message) {\n return;\n } else if (!connectionId || !domainName || !stage) {\n const message = \"No connectionId, domainName or stage.\";\n const data = {\n connectionId,\n domainName,\n stage\n };\n console.error(message, JSON.stringify(data));\n throw new WebinyError(message, \"GENERAL_ERROR\", data);\n }\n const connection: IWebsocketsTransportSendConnection = {\n connectionId,\n domainName,\n stage\n };\n\n const dataToSend = {\n ...result,\n messageId\n };\n await this.context.websockets.sendToConnections([connection], dataToSend);\n }\n}\n"],"names":["WebsocketsRunner","context","registry","validator","response","input","event","ex","result","connectionId","domainName","stage","eventType","messageId","body","JSON","json","route","plugins","WebsocketsRoutePlugin","plugin","WebinyError","getTenant","tenant","getIdentity","identity","action","middleware","params","next","message","WebsocketsEventRequestContextEventType","data","console","connection","dataToSend"],"mappings":"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"}
|
package/runner/index.js
CHANGED
package/runner/routes/connect.js
CHANGED
|
@@ -1,47 +1,37 @@
|
|
|
1
1
|
import { WebsocketsEventRoute } from "../../handler/types.js";
|
|
2
2
|
import { createWebsocketsRoutePlugin } from "../../plugins/WebsocketsRoutePlugin.js";
|
|
3
|
-
const getConnectedOn = connectedAt
|
|
4
|
-
|
|
5
|
-
return new Date().toISOString();
|
|
6
|
-
}
|
|
7
|
-
return new Date(connectedAt).toISOString();
|
|
3
|
+
const getConnectedOn = (connectedAt)=>{
|
|
4
|
+
if (!connectedAt) return new Date().toISOString();
|
|
5
|
+
return new Date(connectedAt).toISOString();
|
|
8
6
|
};
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
type: identity.type
|
|
34
|
-
},
|
|
35
|
-
connectionId: event.requestContext.connectionId,
|
|
36
|
-
tenant,
|
|
37
|
-
domainName: event.requestContext.domainName,
|
|
38
|
-
stage: event.requestContext.stage,
|
|
39
|
-
connectedOn: getConnectedOn(event.requestContext.connectedAt)
|
|
7
|
+
const createWebsocketsRouteConnectPlugin = ()=>{
|
|
8
|
+
const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute.connect, async (params)=>{
|
|
9
|
+
const { registry, event, response, getTenant, getIdentity } = params;
|
|
10
|
+
const tenant = getTenant();
|
|
11
|
+
const identity = getIdentity();
|
|
12
|
+
if (!tenant) return response.error({
|
|
13
|
+
message: "Missing tenant."
|
|
14
|
+
});
|
|
15
|
+
if (!identity) return response.error({
|
|
16
|
+
message: "Missing identity."
|
|
17
|
+
});
|
|
18
|
+
await registry.register({
|
|
19
|
+
identity: {
|
|
20
|
+
id: identity.id,
|
|
21
|
+
displayName: identity.displayName,
|
|
22
|
+
type: identity.type
|
|
23
|
+
},
|
|
24
|
+
connectionId: event.requestContext.connectionId,
|
|
25
|
+
tenant,
|
|
26
|
+
domainName: event.requestContext.domainName,
|
|
27
|
+
stage: event.requestContext.stage,
|
|
28
|
+
connectedOn: getConnectedOn(event.requestContext.connectedAt)
|
|
29
|
+
});
|
|
30
|
+
return response.ok();
|
|
40
31
|
});
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
plugin.name = "websockets.route.connect.default";
|
|
44
|
-
return plugin;
|
|
32
|
+
plugin.name = "websockets.route.connect.default";
|
|
33
|
+
return plugin;
|
|
45
34
|
};
|
|
35
|
+
export { createWebsocketsRouteConnectPlugin };
|
|
46
36
|
|
|
47
37
|
//# sourceMappingURL=connect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"runner/routes/connect.js","sources":["../../../src/runner/routes/connect.ts"],"sourcesContent":["import { WebsocketsEventRoute } from \"~/handler/types.js\";\nimport { createWebsocketsRoutePlugin } from \"~/plugins/WebsocketsRoutePlugin.js\";\n\nconst getConnectedOn = (connectedAt?: number) => {\n if (!connectedAt) {\n return new Date().toISOString();\n }\n return new Date(connectedAt).toISOString();\n};\n\nexport const createWebsocketsRouteConnectPlugin = () => {\n const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute.connect, async params => {\n const { registry, event, response, getTenant, getIdentity } = params;\n\n const tenant = getTenant();\n const identity = getIdentity();\n if (!tenant) {\n return response.error({\n message: \"Missing tenant.\"\n });\n } else if (!identity) {\n return response.error({\n message: \"Missing identity.\"\n });\n }\n\n await registry.register({\n identity: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n connectionId: event.requestContext.connectionId,\n tenant,\n domainName: event.requestContext.domainName,\n stage: event.requestContext.stage,\n connectedOn: getConnectedOn(event.requestContext.connectedAt)\n });\n\n return response.ok();\n });\n plugin.name = \"websockets.route.connect.default\";\n return plugin;\n};\n"],"names":["getConnectedOn","connectedAt","Date","createWebsocketsRouteConnectPlugin","plugin","createWebsocketsRoutePlugin","WebsocketsEventRoute","params","registry","event","response","getTenant","getIdentity","tenant","identity"],"mappings":";;AAGA,MAAMA,iBAAiB,CAACC;IACpB,IAAI,CAACA,aACD,OAAO,IAAIC,OAAO,WAAW;IAEjC,OAAO,IAAIA,KAAKD,aAAa,WAAW;AAC5C;AAEO,MAAME,qCAAqC;IAC9C,MAAMC,SAASC,4BAA4BC,qBAAqB,OAAO,EAAE,OAAMC;QAC3E,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,WAAW,EAAE,GAAGL;QAE9D,MAAMM,SAASF;QACf,MAAMG,WAAWF;QACjB,IAAI,CAACC,QACD,OAAOH,SAAS,KAAK,CAAC;YAClB,SAAS;QACb;QACG,IAAI,CAACI,UACR,OAAOJ,SAAS,KAAK,CAAC;YAClB,SAAS;QACb;QAGJ,MAAMF,SAAS,QAAQ,CAAC;YACpB,UAAU;gBACN,IAAIM,SAAS,EAAE;gBACf,aAAaA,SAAS,WAAW;gBACjC,MAAMA,SAAS,IAAI;YACvB;YACA,cAAcL,MAAM,cAAc,CAAC,YAAY;YAC/CI;YACA,YAAYJ,MAAM,cAAc,CAAC,UAAU;YAC3C,OAAOA,MAAM,cAAc,CAAC,KAAK;YACjC,aAAaT,eAAeS,MAAM,cAAc,CAAC,WAAW;QAChE;QAEA,OAAOC,SAAS,EAAE;IACtB;IACAN,OAAO,IAAI,GAAG;IACd,OAAOA;AACX"}
|
package/runner/routes/default.js
CHANGED
|
@@ -1,27 +1,21 @@
|
|
|
1
1
|
import { WebsocketsEventRoute } from "../../handler/types.js";
|
|
2
2
|
import { createWebsocketsRoutePlugin } from "../../plugins/WebsocketsRoutePlugin.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
message: "Missing identity."
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
return response.ok();
|
|
22
|
-
});
|
|
23
|
-
plugin.name = "websockets.route.default.default";
|
|
24
|
-
return plugin;
|
|
3
|
+
const createWebsocketsRouteDefaultPlugin = ()=>{
|
|
4
|
+
const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute["default"], async (params)=>{
|
|
5
|
+
const { response, getIdentity, getTenant } = params;
|
|
6
|
+
const tenant = getTenant();
|
|
7
|
+
const identity = getIdentity();
|
|
8
|
+
if (!tenant) return response.error({
|
|
9
|
+
message: "Missing tenant."
|
|
10
|
+
});
|
|
11
|
+
if (!identity) return response.error({
|
|
12
|
+
message: "Missing identity."
|
|
13
|
+
});
|
|
14
|
+
return response.ok();
|
|
15
|
+
});
|
|
16
|
+
plugin.name = "websockets.route.default.default";
|
|
17
|
+
return plugin;
|
|
25
18
|
};
|
|
19
|
+
export { createWebsocketsRouteDefaultPlugin };
|
|
26
20
|
|
|
27
21
|
//# sourceMappingURL=default.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"runner/routes/default.js","sources":["../../../src/runner/routes/default.ts"],"sourcesContent":["import { WebsocketsEventRoute } from \"~/handler/types.js\";\nimport { createWebsocketsRoutePlugin } from \"~/plugins/WebsocketsRoutePlugin.js\";\n\nexport const createWebsocketsRouteDefaultPlugin = () => {\n const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute.default, async params => {\n const { response, getIdentity, getTenant } = params;\n const tenant = getTenant();\n const identity = getIdentity();\n if (!tenant) {\n return response.error({\n message: \"Missing tenant.\"\n });\n } else if (!identity) {\n return response.error({\n message: \"Missing identity.\"\n });\n }\n\n return response.ok();\n });\n\n plugin.name = \"websockets.route.default.default\";\n return plugin;\n};\n"],"names":["createWebsocketsRouteDefaultPlugin","plugin","createWebsocketsRoutePlugin","WebsocketsEventRoute","params","response","getIdentity","getTenant","tenant","identity"],"mappings":";;AAGO,MAAMA,qCAAqC;IAC9C,MAAMC,SAASC,4BAA4BC,oBAAoB,CAApBA,UAA4B,EAAE,OAAMC;QAC3E,MAAM,EAAEC,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAE,GAAGH;QAC7C,MAAMI,SAASD;QACf,MAAME,WAAWH;QACjB,IAAI,CAACE,QACD,OAAOH,SAAS,KAAK,CAAC;YAClB,SAAS;QACb;QACG,IAAI,CAACI,UACR,OAAOJ,SAAS,KAAK,CAAC;YAClB,SAAS;QACb;QAGJ,OAAOA,SAAS,EAAE;IACtB;IAEAJ,OAAO,IAAI,GAAG;IACd,OAAOA;AACX"}
|
|
@@ -1,19 +1,16 @@
|
|
|
1
1
|
import { WebsocketsEventRoute } from "../../handler/types.js";
|
|
2
2
|
import { createWebsocketsRoutePlugin } from "../../plugins/WebsocketsRoutePlugin.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
await registry.unregister({
|
|
11
|
-
connectionId: event.requestContext.connectionId
|
|
3
|
+
const createWebsocketsRouteDisconnectPlugin = ()=>{
|
|
4
|
+
const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute.disconnect, async (params)=>{
|
|
5
|
+
const { registry, event, response } = params;
|
|
6
|
+
await registry.unregister({
|
|
7
|
+
connectionId: event.requestContext.connectionId
|
|
8
|
+
});
|
|
9
|
+
return response.ok();
|
|
12
10
|
});
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
plugin.name = "websockets.route.disconnect.default";
|
|
16
|
-
return plugin;
|
|
11
|
+
plugin.name = "websockets.route.disconnect.default";
|
|
12
|
+
return plugin;
|
|
17
13
|
};
|
|
14
|
+
export { createWebsocketsRouteDisconnectPlugin };
|
|
18
15
|
|
|
19
16
|
//# sourceMappingURL=disconnect.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"runner/routes/disconnect.js","sources":["../../../src/runner/routes/disconnect.ts"],"sourcesContent":["import { WebsocketsEventRoute } from \"~/handler/types.js\";\nimport { createWebsocketsRoutePlugin } from \"~/plugins/WebsocketsRoutePlugin.js\";\n\nexport const createWebsocketsRouteDisconnectPlugin = () => {\n const plugin = createWebsocketsRoutePlugin(WebsocketsEventRoute.disconnect, async params => {\n const { registry, event, response } = params;\n await registry.unregister({\n connectionId: event.requestContext.connectionId\n });\n\n return response.ok();\n });\n plugin.name = \"websockets.route.disconnect.default\";\n return plugin;\n};\n"],"names":["createWebsocketsRouteDisconnectPlugin","plugin","createWebsocketsRoutePlugin","WebsocketsEventRoute","params","registry","event","response"],"mappings":";;AAGO,MAAMA,wCAAwC;IACjD,MAAMC,SAASC,4BAA4BC,qBAAqB,UAAU,EAAE,OAAMC;QAC9E,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGH;QACtC,MAAMC,SAAS,UAAU,CAAC;YACtB,cAAcC,MAAM,cAAc,CAAC,YAAY;QACnD;QAEA,OAAOC,SAAS,EAAE;IACtB;IACAN,OAAO,IAAI,GAAG;IACd,OAAOA;AACX"}
|
package/runner/routes/index.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { createWebsocketsRouteConnectPlugin } from "./connect.js";
|
|
2
2
|
import { createWebsocketsRouteDefaultPlugin } from "./default.js";
|
|
3
3
|
import { createWebsocketsRouteDisconnectPlugin } from "./disconnect.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
const createWebsocketsRoutePlugins = ()=>[
|
|
5
|
+
createWebsocketsRouteConnectPlugin(),
|
|
6
|
+
createWebsocketsRouteDisconnectPlugin(),
|
|
7
|
+
createWebsocketsRouteDefaultPlugin()
|
|
8
|
+
];
|
|
9
|
+
export { createWebsocketsRoutePlugins };
|
|
7
10
|
|
|
8
11
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"runner/routes/index.js","sources":["../../../src/runner/routes/index.ts"],"sourcesContent":["import { createWebsocketsRouteConnectPlugin } from \"./connect.js\";\nimport { createWebsocketsRouteDefaultPlugin } from \"./default.js\";\nimport { createWebsocketsRouteDisconnectPlugin } from \"./disconnect.js\";\n\nexport const createWebsocketsRoutePlugins = () => {\n return [\n createWebsocketsRouteConnectPlugin(),\n createWebsocketsRouteDisconnectPlugin(),\n createWebsocketsRouteDefaultPlugin()\n ];\n};\n"],"names":["createWebsocketsRoutePlugins","createWebsocketsRouteConnectPlugin","createWebsocketsRouteDisconnectPlugin","createWebsocketsRouteDefaultPlugin"],"mappings":";;;AAIO,MAAMA,+BAA+B,IACjC;QACHC;QACAC;QACAC;KACH"}
|