@azure/web-pubsub-express 1.0.0-beta.3 → 1.0.1-alpha.20220103.2
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/CHANGELOG.md +40 -0
- package/README.md +127 -31
- package/dist/index.js +66 -36
- package/dist/index.js.map +1 -1
- package/dist-esm/samples-dev/server.js +3 -3
- package/dist-esm/samples-dev/server.js.map +1 -1
- package/dist-esm/src/cloudEventsDispatcher.js +45 -25
- package/dist-esm/src/cloudEventsDispatcher.js.map +1 -1
- package/dist-esm/src/cloudEventsProtocols.js.map +1 -1
- package/dist-esm/src/logger.js +10 -0
- package/dist-esm/src/logger.js.map +1 -0
- package/dist-esm/src/utils.js +5 -3
- package/dist-esm/src/utils.js.map +1 -1
- package/dist-esm/src/webPubSubEventHandler.js +8 -8
- package/dist-esm/src/webPubSubEventHandler.js.map +1 -1
- package/dist-esm/test/connect.spec.js +57 -56
- package/dist-esm/test/connect.spec.js.map +1 -1
- package/dist-esm/test/connected.spec.js +13 -12
- package/dist-esm/test/connected.spec.js.map +1 -1
- package/dist-esm/test/ctor.spec.js +4 -4
- package/dist-esm/test/ctor.spec.js.map +1 -1
- package/dist-esm/test/disconnected.spec.js +13 -12
- package/dist-esm/test/disconnected.spec.js.map +1 -1
- package/dist-esm/test/user.spec.js +50 -49
- package/dist-esm/test/user.spec.js.map +1 -1
- package/dist-esm/test/validate.spec.js +26 -10
- package/dist-esm/test/validate.spec.js.map +1 -1
- package/package.json +17 -31
- package/types/web-pubsub-express.d.ts +24 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.spec.js","sourceRoot":"","sources":["../../test/connect.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable no-invalid-this */\nimport { CloudEventsDispatcher } from \"../src/cloudEventsDispatcher\";\nimport { assert } from \"chai\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Socket } from \"net\";\nimport * as sinon from \"sinon\";\nimport { toBase64JsonString } from \"../src/utils\";\n\nfunction buildRequest(\n req: IncomingMessage,\n hub: string,\n connectionId: string,\n userId?: string,\n states?: string\n): void {\n req.headers[\"webhook-request-origin\"] = \"xxx.webpubsub.azure.com\";\n req.headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\n req.headers[\"ce-specversion\"] = \"1.0\";\n req.headers[\"ce-type\"] = \"azure.webpubsub.sys.connect\";\n req.headers[\"ce-source\"] = `/hubs/${hub}/client/${connectionId}`;\n req.headers[\"ce-id\"] = \"1\";\n req.headers[\"ce-time\"] = new Date().toUTCString();\n if (userId !== undefined) {\n req.headers[\"ce-userId\"] = userId;\n }\n req.headers[\"ce-connectionId\"] = connectionId;\n req.headers[\"ce-hub\"] = hub;\n req.headers[\"ce-event\"] = \"connect\";\n req.headers[\"ce-connectionState\"] = states;\n}\n\nfunction mockBody(req: IncomingMessage, body: string): void {\n req.emit(\"data\", Buffer.from(body, \"utf-8\"));\n req.emit(\"end\");\n}\n\ndescribe(\"Can handle connect event\", function() {\n let req: IncomingMessage;\n let res: ServerResponse;\n\n beforeEach(function() {\n req = new IncomingMessage(new Socket());\n res = new ServerResponse(req);\n });\n\n it(\"Should not handle the request if request is not cloud events\", async function() {\n const endSpy = sinon.spy(res.end);\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\", [\"*\"]);\n var result = await dispatcher.processRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should not handle the request if hub does not match\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\", [\"*\"]);\n var result = await dispatcher.processRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should response with 401 when option is not specified\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"]);\n var result = await dispatcher.processRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(401, res.statusCode, \"should be 401\");\n });\n\n it(\"Should response with 401 when handler is not specified\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"], {});\n var result = await dispatcher.processRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(401, res.statusCode, \"should be 401\");\n });\n\n it(\"Should response with error when handler returns error\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"], {\n handleConnect: async (_, res) => {\n res.fail(400);\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(400, res.statusCode, \"should be error\");\n });\n\n it(\"Should response with success when handler returns success\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"], {\n handleConnect: async (_, res) => {\n res.success();\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Should response with success when handler returns success value\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"], {\n handleConnect: async (_, res) => {\n res.success({ userId: \"vic\" });\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Should be able to set connection state\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", [\"*\"], {\n handleConnect: async (_, res) => {\n res.setState(\"key1\", \"val1\");\n res.setState(\"key2\", \"val2\");\n res.setState(\"key1\", [\"val3\"]);\n res.setState(\"key3\", \"\");\n res.success({ userId: \"vic\" });\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(\n toBase64JsonString({\n key1: [\"val3\"],\n key2: \"val2\",\n key3: \"\"\n }),\n res.getHeader(\"ce-connectionState\"),\n \"should contain multiple state headers\"\n );\n });\n\n it(\"Should be able to get the connection states if it exists in the header\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n const states = toBase64JsonString({\n key1: [\"val3\"],\n key2: \"val2\",\n key3: \"\"\n });\n buildRequest(req, \"hub1\", \"conn1\", undefined, states);\n const dispatcher = new CloudEventsDispatcher(\"hub1\", [\"*\"], {\n handleConnect: (req, response) => {\n assert.equal(\"val3\", req.context.states[\"key1\"][0]);\n assert.equal(\"val2\", req.context.states[\"key2\"]);\n assert.equal(\"\", req.context.states[\"key3\"]);\n response.success();\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Invalid state header gets ignored\", async function() {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub1\", \"conn1\", undefined, \"\");\n const dispatcher = new CloudEventsDispatcher(\"hub1\", [\"*\"], {\n handleConnect: (req, response) => {\n assert.deepEqual({}, req.context.states);\n response.success();\n }\n });\n var process = dispatcher.processRequest(req, res);\n mockBody(req, JSON.stringify({}));\n var result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"connect.spec.js","sourceRoot":"","sources":["../../test/connect.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable no-invalid-this */\nimport { CloudEventsDispatcher } from \"../src/cloudEventsDispatcher\";\nimport { assert } from \"chai\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Socket } from \"net\";\nimport * as sinon from \"sinon\";\nimport { toBase64JsonString } from \"../src/utils\";\n\nfunction buildRequest(\n req: IncomingMessage,\n hub: string,\n connectionId: string,\n userId?: string,\n states?: string\n): void {\n req.headers[\"webhook-request-origin\"] = \"xxx.webpubsub.azure.com\";\n req.headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\n req.headers[\"ce-awpsversion\"] = \"1.0\";\n req.headers[\"ce-specversion\"] = \"1.0\";\n req.headers[\"ce-type\"] = \"azure.webpubsub.sys.connect\";\n req.headers[\"ce-source\"] = `/hubs/${hub}/client/${connectionId}`;\n req.headers[\"ce-id\"] = \"1\";\n req.headers[\"ce-time\"] = new Date().toUTCString();\n if (userId !== undefined) {\n req.headers[\"ce-userId\"] = userId;\n }\n req.headers[\"ce-connectionId\"] = connectionId;\n req.headers[\"ce-hub\"] = hub;\n req.headers[\"ce-event\"] = \"connect\";\n req.headers[\"ce-connectionState\"] = states;\n}\n\nfunction mockBody(req: IncomingMessage, body: string): void {\n req.emit(\"data\", Buffer.from(body, \"utf-8\"));\n req.emit(\"end\");\n}\n\ndescribe(\"Can handle connect event\", function () {\n let req: IncomingMessage;\n let res: ServerResponse;\n\n beforeEach(function () {\n req = new IncomingMessage(new Socket());\n res = new ServerResponse(req);\n });\n\n it(\"Should not handle the request if request is not cloud events\", async function () {\n const endSpy = sinon.spy(res.end);\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should not handle the request if hub does not match\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should response with 200 when option is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response with 200 when handler is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {});\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response with error when handler returns error\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n handleConnect: async (_, response) => {\n response.fail(400);\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(400, res.statusCode, \"should be error\");\n });\n\n it(\"Should response with success when handler returns success\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n handleConnect: async (_, response) => {\n response.success();\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Should response with success when handler returns success value\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n handleConnect: async (_, response) => {\n response.success({ userId: \"vic\" });\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Should be able to set connection state\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n handleConnect: async (_, response) => {\n response.setState(\"key1\", \"val1\");\n response.setState(\"key2\", \"val2\");\n response.setState(\"key1\", [\"val3\"]);\n response.setState(\"key3\", \"\");\n response.success({ userId: \"vic\" });\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(\n toBase64JsonString({\n key1: [\"val3\"],\n key2: \"val2\",\n key3: \"\",\n }),\n res.getHeader(\"ce-connectionState\"),\n \"should contain multiple state headers\"\n );\n });\n\n it(\"Should be able to get the connection states if it exists in the header\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n const states = toBase64JsonString({\n key1: [\"val3\"],\n key2: \"val2\",\n key3: \"\",\n });\n buildRequest(req, \"hub1\", \"conn1\", undefined, states);\n const dispatcher = new CloudEventsDispatcher(\"hub1\", {\n handleConnect: (request, response) => {\n assert.equal(\"val3\", request.context.states[\"key1\"][0]);\n assert.equal(\"val2\", request.context.states[\"key2\"]);\n assert.equal(\"\", request.context.states[\"key3\"]);\n response.success();\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n\n it(\"Invalid state header gets ignored\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub1\", \"conn1\", undefined, \"\");\n const dispatcher = new CloudEventsDispatcher(\"hub1\", {\n handleConnect: (request, response) => {\n assert.deepEqual({}, request.context.states);\n response.success();\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be success\");\n });\n});\n"]}
|
|
@@ -9,6 +9,7 @@ import * as sinon from "sinon";
|
|
|
9
9
|
function buildRequest(req, hub, connectionId, userId) {
|
|
10
10
|
req.headers["webhook-request-origin"] = "xxx.webpubsub.azure.com";
|
|
11
11
|
req.headers["Content-Type"] = "application/json; charset=utf-8";
|
|
12
|
+
req.headers["ce-awpsversion"] = "1.0";
|
|
12
13
|
req.headers["ce-specversion"] = "1.0";
|
|
13
14
|
req.headers["ce-type"] = "azure.webpubsub.user.connected";
|
|
14
15
|
req.headers["ce-source"] = `/hubs/${hub}/client/${connectionId}`;
|
|
@@ -34,24 +35,24 @@ describe("Can handle connected event", function () {
|
|
|
34
35
|
});
|
|
35
36
|
it("Should not handle the request if request is not cloud events", async function () {
|
|
36
37
|
const endSpy = sinon.spy(res.end);
|
|
37
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
38
|
-
|
|
38
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
39
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
39
40
|
assert.isFalse(result);
|
|
40
41
|
assert.isTrue(endSpy.notCalled);
|
|
41
42
|
});
|
|
42
43
|
it("Should not handle the request if hub does not match", async function () {
|
|
43
44
|
const endSpy = sinon.spy(res.end);
|
|
44
45
|
buildRequest(req, "hub", "conn1");
|
|
45
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
46
|
-
|
|
46
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
47
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
47
48
|
assert.isFalse(result);
|
|
48
49
|
assert.isTrue(endSpy.notCalled);
|
|
49
50
|
});
|
|
50
51
|
it("Should response with 200 when option is not specified", async function () {
|
|
51
52
|
const endSpy = sinon.spy(res, "end");
|
|
52
53
|
buildRequest(req, "hub", "conn1");
|
|
53
|
-
const dispatcher = new CloudEventsDispatcher("hub"
|
|
54
|
-
|
|
54
|
+
const dispatcher = new CloudEventsDispatcher("hub");
|
|
55
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
55
56
|
assert.isTrue(result, "should handle");
|
|
56
57
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
57
58
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -59,8 +60,8 @@ describe("Can handle connected event", function () {
|
|
|
59
60
|
it("Should response with 200 when handler is not specified", async function () {
|
|
60
61
|
const endSpy = sinon.spy(res, "end");
|
|
61
62
|
buildRequest(req, "hub", "conn1");
|
|
62
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
63
|
-
|
|
63
|
+
const dispatcher = new CloudEventsDispatcher("hub", {});
|
|
64
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
64
65
|
assert.isTrue(result, "should handle");
|
|
65
66
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
66
67
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -68,14 +69,14 @@ describe("Can handle connected event", function () {
|
|
|
68
69
|
it("Should response 200 even the event handler throws", async function () {
|
|
69
70
|
const endSpy = sinon.spy(res, "end");
|
|
70
71
|
buildRequest(req, "hub", "conn1");
|
|
71
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
72
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
72
73
|
onConnected: async (_) => {
|
|
73
74
|
throw new Error();
|
|
74
|
-
}
|
|
75
|
+
},
|
|
75
76
|
});
|
|
76
|
-
|
|
77
|
+
const process = dispatcher.handleRequest(req, res);
|
|
77
78
|
mockBody(req, JSON.stringify({}));
|
|
78
|
-
|
|
79
|
+
const result = await process;
|
|
79
80
|
assert.isTrue(result, "should handle");
|
|
80
81
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
81
82
|
assert.equal(200, res.statusCode, "should be error");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connected.spec.js","sourceRoot":"","sources":["../../test/connected.spec.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,oCAAoC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,SAAS,YAAY,CACnB,GAAoB,EACpB,GAAW,EACX,YAAoB,EACpB,MAAe;IAEf,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,GAAG,yBAAyB,CAAC;IAClE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;IAChE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IACtC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,gCAAgC,CAAC;IAC1D,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,GAAG,WAAW,YAAY,EAAE,CAAC;IACjE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;IAC3B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;KACnC;IACD,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;IAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAC5B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAoB,EAAE,IAAY;IAClD,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE;IACrC,IAAI,GAAoB,CAAC;IACzB,IAAI,GAAmB,CAAC;IAExB,UAAU,CAAC;QACT,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACxC,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"connected.spec.js","sourceRoot":"","sources":["../../test/connected.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable no-invalid-this */\nimport { CloudEventsDispatcher } from \"../src/cloudEventsDispatcher\";\nimport { assert } from \"chai\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Socket } from \"net\";\nimport * as sinon from \"sinon\";\n\nfunction buildRequest(\n req: IncomingMessage,\n hub: string,\n connectionId: string,\n userId?: string\n): void {\n req.headers[\"webhook-request-origin\"] = \"xxx.webpubsub.azure.com\";\n req.headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\n req.headers[\"ce-awpsversion\"] = \"1.0\";\n req.headers[\"ce-specversion\"] = \"1.0\";\n req.headers[\"ce-type\"] = \"azure.webpubsub.user.connected\";\n req.headers[\"ce-source\"] = `/hubs/${hub}/client/${connectionId}`;\n req.headers[\"ce-id\"] = \"1\";\n req.headers[\"ce-time\"] = new Date().toUTCString();\n if (userId !== undefined) {\n req.headers[\"ce-userId\"] = userId;\n }\n req.headers[\"ce-connectionId\"] = connectionId;\n req.headers[\"ce-hub\"] = hub;\n req.headers[\"ce-event\"] = \"connected\";\n}\n\nfunction mockBody(req: IncomingMessage, body: string): void {\n req.emit(\"data\", body);\n req.emit(\"end\");\n}\n\ndescribe(\"Can handle connected event\", function () {\n let req: IncomingMessage;\n let res: ServerResponse;\n\n beforeEach(function () {\n req = new IncomingMessage(new Socket());\n res = new ServerResponse(req);\n });\n\n it(\"Should not handle the request if request is not cloud events\", async function () {\n const endSpy = sinon.spy(res.end);\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should not handle the request if hub does not match\", async function () {\n const endSpy = sinon.spy(res.end);\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should response with 200 when option is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response with 200 when handler is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {});\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response 200 even the event handler throws\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n onConnected: async (_) => {\n throw new Error();\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be error\");\n });\n});\n"]}
|
|
@@ -5,18 +5,18 @@ import { WebPubSubEventHandler } from "../src/webPubSubEventHandler";
|
|
|
5
5
|
import { assert } from "chai";
|
|
6
6
|
describe("Can creat event handler", function () {
|
|
7
7
|
it("Can provide default path", function () {
|
|
8
|
-
const dispatcher = new WebPubSubEventHandler("hub"
|
|
8
|
+
const dispatcher = new WebPubSubEventHandler("hub");
|
|
9
9
|
assert.equal("/api/webpubsub/hubs/hub/", dispatcher.path);
|
|
10
10
|
});
|
|
11
11
|
it("Supports custom path", function () {
|
|
12
|
-
const dispatcher = new WebPubSubEventHandler("hub",
|
|
13
|
-
path: "/custom"
|
|
12
|
+
const dispatcher = new WebPubSubEventHandler("hub", {
|
|
13
|
+
path: "/custom",
|
|
14
14
|
});
|
|
15
15
|
assert.equal("/custom/", dispatcher.path);
|
|
16
16
|
});
|
|
17
17
|
it("Throw with invalid endpoints", function () {
|
|
18
18
|
try {
|
|
19
|
-
new WebPubSubEventHandler("hub", ["b.com"]);
|
|
19
|
+
new WebPubSubEventHandler("hub", { allowedEndpoints: ["b.com"] });
|
|
20
20
|
assert.fail("Should have thrown ERROR_INVALID_URL");
|
|
21
21
|
}
|
|
22
22
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ctor.spec.js","sourceRoot":"","sources":["../../test/ctor.spec.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,oCAAoC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,QAAQ,CAAC,yBAAyB,EAAE;IAClC,EAAE,CAAC,0BAA0B,EAAE;QAC7B,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"ctor.spec.js","sourceRoot":"","sources":["../../test/ctor.spec.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,oCAAoC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B,QAAQ,CAAC,yBAAyB,EAAE;IAClC,EAAE,CAAC,0BAA0B,EAAE;QAC7B,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE;QACzB,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,KAAK,EAAE;YAClD,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE;QACjC,IAAI;YACF,IAAI,qBAAqB,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;SACrD;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,MAAM,CAAE,GAAW,CAAC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;SAC/D;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable no-invalid-this */\nimport { WebPubSubEventHandler } from \"../src/webPubSubEventHandler\";\nimport { assert } from \"chai\";\n\ndescribe(\"Can creat event handler\", function () {\n it(\"Can provide default path\", function () {\n const dispatcher = new WebPubSubEventHandler(\"hub\");\n assert.equal(\"/api/webpubsub/hubs/hub/\", dispatcher.path);\n });\n\n it(\"Supports custom path\", function () {\n const dispatcher = new WebPubSubEventHandler(\"hub\", {\n path: \"/custom\",\n });\n assert.equal(\"/custom/\", dispatcher.path);\n });\n\n it(\"Throw with invalid endpoints\", function () {\n try {\n new WebPubSubEventHandler(\"hub\", { allowedEndpoints: [\"b.com\"] });\n assert.fail(\"Should have thrown ERROR_INVALID_URL\");\n } catch (err) {\n assert.isTrue((err as any).message.startsWith(\"Invalid URL\"));\n }\n });\n});\n"]}
|
|
@@ -9,6 +9,7 @@ import * as sinon from "sinon";
|
|
|
9
9
|
function buildRequest(req, hub, connectionId, userId) {
|
|
10
10
|
req.headers["webhook-request-origin"] = "xxx.webpubsub.azure.com";
|
|
11
11
|
req.headers["Content-Type"] = "application/json; charset=utf-8";
|
|
12
|
+
req.headers["ce-awpsversion"] = "1.0";
|
|
12
13
|
req.headers["ce-specversion"] = "1.0";
|
|
13
14
|
req.headers["ce-type"] = "azure.webpubsub.user.disconnected";
|
|
14
15
|
req.headers["ce-source"] = `/hubs/${hub}/client/${connectionId}`;
|
|
@@ -34,24 +35,24 @@ describe("Can handle disconnected event", function () {
|
|
|
34
35
|
});
|
|
35
36
|
it("Should not handle the request if request is not cloud events", async function () {
|
|
36
37
|
const endSpy = sinon.spy(res.end);
|
|
37
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
38
|
-
|
|
38
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
39
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
39
40
|
assert.isFalse(result);
|
|
40
41
|
assert.isTrue(endSpy.notCalled);
|
|
41
42
|
});
|
|
42
43
|
it("Should not handle the request if hub does not match", async function () {
|
|
43
44
|
const endSpy = sinon.spy(res.end);
|
|
44
45
|
buildRequest(req, "hub", "conn1");
|
|
45
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
46
|
-
|
|
46
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
47
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
47
48
|
assert.isFalse(result);
|
|
48
49
|
assert.isTrue(endSpy.notCalled);
|
|
49
50
|
});
|
|
50
51
|
it("Should response with 200 when option is not specified", async function () {
|
|
51
52
|
const endSpy = sinon.spy(res, "end");
|
|
52
53
|
buildRequest(req, "hub", "conn1");
|
|
53
|
-
const dispatcher = new CloudEventsDispatcher("hub"
|
|
54
|
-
|
|
54
|
+
const dispatcher = new CloudEventsDispatcher("hub");
|
|
55
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
55
56
|
assert.isTrue(result, "should handle");
|
|
56
57
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
57
58
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -59,8 +60,8 @@ describe("Can handle disconnected event", function () {
|
|
|
59
60
|
it("Should response with 200 when handler is not specified", async function () {
|
|
60
61
|
const endSpy = sinon.spy(res, "end");
|
|
61
62
|
buildRequest(req, "hub", "conn1");
|
|
62
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
63
|
-
|
|
63
|
+
const dispatcher = new CloudEventsDispatcher("hub", {});
|
|
64
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
64
65
|
assert.isTrue(result, "should handle");
|
|
65
66
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
66
67
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -68,14 +69,14 @@ describe("Can handle disconnected event", function () {
|
|
|
68
69
|
it("Should response 200 even the event handler throws", async function () {
|
|
69
70
|
const endSpy = sinon.spy(res, "end");
|
|
70
71
|
buildRequest(req, "hub", "conn1");
|
|
71
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
72
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
72
73
|
onConnected: async (_) => {
|
|
73
74
|
throw new Error();
|
|
74
|
-
}
|
|
75
|
+
},
|
|
75
76
|
});
|
|
76
|
-
|
|
77
|
+
const process = dispatcher.handleRequest(req, res);
|
|
77
78
|
mockBody(req, JSON.stringify({}));
|
|
78
|
-
|
|
79
|
+
const result = await process;
|
|
79
80
|
assert.isTrue(result, "should handle");
|
|
80
81
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
81
82
|
assert.equal(200, res.statusCode, "should be error");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"disconnected.spec.js","sourceRoot":"","sources":["../../test/disconnected.spec.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,kCAAkC;AAClC,oCAAoC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,SAAS,YAAY,CACnB,GAAoB,EACpB,GAAW,EACX,YAAoB,EACpB,MAAe;IAEf,GAAG,CAAC,OAAO,CAAC,wBAAwB,CAAC,GAAG,yBAAyB,CAAC;IAClE,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;IAChE,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC;IACtC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,mCAAmC,CAAC;IAC7D,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS,GAAG,WAAW,YAAY,EAAE,CAAC;IACjE,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;IAC3B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,MAAM,CAAC;KACnC;IACD,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,GAAG,YAAY,CAAC;IAC9C,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAC5B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,cAAc,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,GAAoB,EAAE,IAAY;IAClD,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAClB,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE;IACxC,IAAI,GAAoB,CAAC;IACzB,IAAI,GAAmB,CAAC;IAExB,UAAU,CAAC;QACT,GAAG,GAAG,IAAI,eAAe,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC;QACxC,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAElC,MAAM,UAAU,GAAG,IAAI,qBAAqB,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"disconnected.spec.js","sourceRoot":"","sources":["../../test/disconnected.spec.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation.\n// Licensed under the MIT license.\n/* eslint-disable no-invalid-this */\nimport { CloudEventsDispatcher } from \"../src/cloudEventsDispatcher\";\nimport { assert } from \"chai\";\nimport { IncomingMessage, ServerResponse } from \"http\";\nimport { Socket } from \"net\";\nimport * as sinon from \"sinon\";\n\nfunction buildRequest(\n req: IncomingMessage,\n hub: string,\n connectionId: string,\n userId?: string\n): void {\n req.headers[\"webhook-request-origin\"] = \"xxx.webpubsub.azure.com\";\n req.headers[\"Content-Type\"] = \"application/json; charset=utf-8\";\n req.headers[\"ce-awpsversion\"] = \"1.0\";\n req.headers[\"ce-specversion\"] = \"1.0\";\n req.headers[\"ce-type\"] = \"azure.webpubsub.user.disconnected\";\n req.headers[\"ce-source\"] = `/hubs/${hub}/client/${connectionId}`;\n req.headers[\"ce-id\"] = \"1\";\n req.headers[\"ce-time\"] = new Date().toUTCString();\n if (userId !== undefined) {\n req.headers[\"ce-userId\"] = userId;\n }\n req.headers[\"ce-connectionId\"] = connectionId;\n req.headers[\"ce-hub\"] = hub;\n req.headers[\"ce-event\"] = \"disconnected\";\n}\n\nfunction mockBody(req: IncomingMessage, body: string): void {\n req.emit(\"data\", body);\n req.emit(\"end\");\n}\n\ndescribe(\"Can handle disconnected event\", function () {\n let req: IncomingMessage;\n let res: ServerResponse;\n\n beforeEach(function () {\n req = new IncomingMessage(new Socket());\n res = new ServerResponse(req);\n });\n\n it(\"Should not handle the request if request is not cloud events\", async function () {\n const endSpy = sinon.spy(res.end);\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should not handle the request if hub does not match\", async function () {\n const endSpy = sinon.spy(res.end);\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub1\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isFalse(result);\n assert.isTrue(endSpy.notCalled);\n });\n\n it(\"Should response with 200 when option is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\");\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response with 200 when handler is not specified\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {});\n const result = await dispatcher.handleRequest(req, res);\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be 200\");\n });\n\n it(\"Should response 200 even the event handler throws\", async function () {\n const endSpy = sinon.spy(res, \"end\");\n buildRequest(req, \"hub\", \"conn1\");\n\n const dispatcher = new CloudEventsDispatcher(\"hub\", {\n onConnected: async (_) => {\n throw new Error();\n },\n });\n const process = dispatcher.handleRequest(req, res);\n mockBody(req, JSON.stringify({}));\n const result = await process;\n assert.isTrue(result, \"should handle\");\n assert.isTrue(endSpy.calledOnce, \"should call once\");\n assert.equal(200, res.statusCode, \"should be error\");\n });\n});\n"]}
|
|
@@ -9,6 +9,7 @@ import * as sinon from "sinon";
|
|
|
9
9
|
function buildRequest(req, hub, connectionId, userId) {
|
|
10
10
|
req.headers["webhook-request-origin"] = "xxx.webpubsub.azure.com";
|
|
11
11
|
req.headers["Content-Type"] = "application/json; charset=utf-8";
|
|
12
|
+
req.headers["ce-awpsversion"] = "1.0";
|
|
12
13
|
req.headers["ce-specversion"] = "1.0";
|
|
13
14
|
req.headers["ce-type"] = "azure.webpubsub.user.connect";
|
|
14
15
|
req.headers["ce-source"] = `/hubs/${hub}/client/${connectionId}`;
|
|
@@ -34,24 +35,24 @@ describe("Can handle user event", function () {
|
|
|
34
35
|
});
|
|
35
36
|
it("Should not handle the request if request is not cloud events", async function () {
|
|
36
37
|
const endSpy = sinon.spy(res.end);
|
|
37
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
38
|
-
|
|
38
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
39
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
39
40
|
assert.isFalse(result);
|
|
40
41
|
assert.isTrue(endSpy.notCalled);
|
|
41
42
|
});
|
|
42
43
|
it("Should not handle the request if hub does not match", async function () {
|
|
43
44
|
const endSpy = sinon.spy(res.end);
|
|
44
45
|
buildRequest(req, "hub", "conn1");
|
|
45
|
-
const dispatcher = new CloudEventsDispatcher("hub1"
|
|
46
|
-
|
|
46
|
+
const dispatcher = new CloudEventsDispatcher("hub1");
|
|
47
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
47
48
|
assert.isFalse(result);
|
|
48
49
|
assert.isTrue(endSpy.notCalled);
|
|
49
50
|
});
|
|
50
51
|
it("Should response with 200 when option is not specified", async function () {
|
|
51
52
|
const endSpy = sinon.spy(res, "end");
|
|
52
53
|
buildRequest(req, "hub", "conn1");
|
|
53
|
-
const dispatcher = new CloudEventsDispatcher("hub"
|
|
54
|
-
|
|
54
|
+
const dispatcher = new CloudEventsDispatcher("hub");
|
|
55
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
55
56
|
assert.isTrue(result, "should handle");
|
|
56
57
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
57
58
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -59,8 +60,8 @@ describe("Can handle user event", function () {
|
|
|
59
60
|
it("Should response with 200 when handler is not specified", async function () {
|
|
60
61
|
const endSpy = sinon.spy(res, "end");
|
|
61
62
|
buildRequest(req, "hub", "conn1");
|
|
62
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
63
|
-
|
|
63
|
+
const dispatcher = new CloudEventsDispatcher("hub", {});
|
|
64
|
+
const result = await dispatcher.handleRequest(req, res);
|
|
64
65
|
assert.isTrue(result, "should handle");
|
|
65
66
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
66
67
|
assert.equal(200, res.statusCode, "should be 200");
|
|
@@ -68,14 +69,14 @@ describe("Can handle user event", function () {
|
|
|
68
69
|
it("Should response with error when handler returns error", async function () {
|
|
69
70
|
const endSpy = sinon.spy(res, "end");
|
|
70
71
|
buildRequest(req, "hub", "conn1");
|
|
71
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
72
|
-
handleUserEvent: async (_,
|
|
73
|
-
|
|
74
|
-
}
|
|
72
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
73
|
+
handleUserEvent: async (_, response) => {
|
|
74
|
+
response.fail(500);
|
|
75
|
+
},
|
|
75
76
|
});
|
|
76
|
-
|
|
77
|
+
const process = dispatcher.handleRequest(req, res);
|
|
77
78
|
mockBody(req, JSON.stringify({}));
|
|
78
|
-
|
|
79
|
+
const result = await process;
|
|
79
80
|
assert.isTrue(result, "should handle");
|
|
80
81
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
81
82
|
assert.equal(500, res.statusCode, "should be error");
|
|
@@ -83,14 +84,14 @@ describe("Can handle user event", function () {
|
|
|
83
84
|
it("Should response with success when handler returns success", async function () {
|
|
84
85
|
const endSpy = sinon.spy(res, "end");
|
|
85
86
|
buildRequest(req, "hub", "conn1");
|
|
86
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
87
|
-
handleUserEvent: async (_,
|
|
88
|
-
|
|
89
|
-
}
|
|
87
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
88
|
+
handleUserEvent: async (_, response) => {
|
|
89
|
+
response.success();
|
|
90
|
+
},
|
|
90
91
|
});
|
|
91
|
-
|
|
92
|
+
const process = dispatcher.handleRequest(req, res);
|
|
92
93
|
mockBody(req, JSON.stringify({}));
|
|
93
|
-
|
|
94
|
+
const result = await process;
|
|
94
95
|
assert.isTrue(result, "should handle");
|
|
95
96
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
96
97
|
assert.equal(200, res.statusCode, "should be success");
|
|
@@ -98,14 +99,14 @@ describe("Can handle user event", function () {
|
|
|
98
99
|
it("Should response with success when returns success binary", async function () {
|
|
99
100
|
const endSpy = sinon.spy(res, "end");
|
|
100
101
|
buildRequest(req, "hub", "conn1");
|
|
101
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
102
|
-
handleUserEvent: async (_,
|
|
103
|
-
|
|
104
|
-
}
|
|
102
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
103
|
+
handleUserEvent: async (_, response) => {
|
|
104
|
+
response.success("a");
|
|
105
|
+
},
|
|
105
106
|
});
|
|
106
|
-
|
|
107
|
+
const process = dispatcher.handleRequest(req, res);
|
|
107
108
|
mockBody(req, JSON.stringify({}));
|
|
108
|
-
|
|
109
|
+
const result = await process;
|
|
109
110
|
assert.isTrue(result, "should handle");
|
|
110
111
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
111
112
|
assert.equal(200, res.statusCode, "should be success");
|
|
@@ -114,14 +115,14 @@ describe("Can handle user event", function () {
|
|
|
114
115
|
it("Should response with success when returns success text", async function () {
|
|
115
116
|
const endSpy = sinon.spy(res, "end");
|
|
116
117
|
buildRequest(req, "hub", "conn1");
|
|
117
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
118
|
-
handleUserEvent: async (_,
|
|
119
|
-
|
|
120
|
-
}
|
|
118
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
119
|
+
handleUserEvent: async (_, response) => {
|
|
120
|
+
response.success("a", "text");
|
|
121
|
+
},
|
|
121
122
|
});
|
|
122
|
-
|
|
123
|
+
const process = dispatcher.handleRequest(req, res);
|
|
123
124
|
mockBody(req, JSON.stringify({}));
|
|
124
|
-
|
|
125
|
+
const result = await process;
|
|
125
126
|
assert.isTrue(result, "should handle");
|
|
126
127
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
127
128
|
assert.equal(200, res.statusCode, "should be success");
|
|
@@ -130,14 +131,14 @@ describe("Can handle user event", function () {
|
|
|
130
131
|
it("Should response with success when returns success json", async function () {
|
|
131
132
|
const endSpy = sinon.spy(res, "end");
|
|
132
133
|
buildRequest(req, "hub", "conn1");
|
|
133
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
134
|
-
handleUserEvent: async (_,
|
|
135
|
-
|
|
136
|
-
}
|
|
134
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
135
|
+
handleUserEvent: async (_, response) => {
|
|
136
|
+
response.success("a", "json");
|
|
137
|
+
},
|
|
137
138
|
});
|
|
138
|
-
|
|
139
|
+
const process = dispatcher.handleRequest(req, res);
|
|
139
140
|
mockBody(req, JSON.stringify({}));
|
|
140
|
-
|
|
141
|
+
const result = await process;
|
|
141
142
|
assert.isTrue(result, "should handle");
|
|
142
143
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
143
144
|
assert.equal(200, res.statusCode, "should be success");
|
|
@@ -146,25 +147,25 @@ describe("Can handle user event", function () {
|
|
|
146
147
|
it("Should be able to set connection state", async function () {
|
|
147
148
|
const endSpy = sinon.spy(res, "end");
|
|
148
149
|
buildRequest(req, "hub", "conn1");
|
|
149
|
-
const dispatcher = new CloudEventsDispatcher("hub",
|
|
150
|
-
handleUserEvent: async (_,
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
}
|
|
150
|
+
const dispatcher = new CloudEventsDispatcher("hub", {
|
|
151
|
+
handleUserEvent: async (_, response) => {
|
|
152
|
+
response.setState("key1", "val1");
|
|
153
|
+
response.setState("key2", "val2");
|
|
154
|
+
response.setState("key1", "val3");
|
|
155
|
+
response.setState("key3", "");
|
|
156
|
+
response.success();
|
|
157
|
+
},
|
|
157
158
|
});
|
|
158
|
-
|
|
159
|
+
const process = dispatcher.handleRequest(req, res);
|
|
159
160
|
mockBody(req, JSON.stringify({}));
|
|
160
|
-
|
|
161
|
+
const result = await process;
|
|
161
162
|
assert.isTrue(result, "should handle");
|
|
162
163
|
assert.isTrue(endSpy.calledOnce, "should call once");
|
|
163
164
|
assert.equal(200, res.statusCode, "should be success");
|
|
164
165
|
assert.equal(Buffer.from(JSON.stringify({
|
|
165
166
|
key1: "val3",
|
|
166
167
|
key2: "val2",
|
|
167
|
-
key3: ""
|
|
168
|
+
key3: "",
|
|
168
169
|
})).toString("base64"), res.getHeader("ce-connectionState"), "should contain multiple state headers");
|
|
169
170
|
});
|
|
170
171
|
});
|