1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | "use strict";
|
15 |
|
16 | var fluid = require("infusion"),
|
17 | kettle = fluid.registerNamespace("kettle");
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | fluid.defaults("kettle.request.ws", {
|
23 | gradeNames: ["kettle.request"],
|
24 | members: {
|
25 |
|
26 | },
|
27 | events: {
|
28 | onBindWs: null,
|
29 | onReceiveMessage: null,
|
30 | onSendMessage: null
|
31 | },
|
32 | receiveMessageJSON: true,
|
33 | sendMessageJSON: true,
|
34 | listeners: {
|
35 | "onBindWs.ensureResponseDisposes": {
|
36 | funcName: "kettle.request.ws.ensureResponseDisposes",
|
37 | priority: "before:handleRequest"
|
38 | },
|
39 | "onBindWs.listen": {
|
40 | funcName: "kettle.request.ws.listen",
|
41 | priority: "after:ensureResponseDisposes"
|
42 | },
|
43 | "onSendMessage.encode": {
|
44 | funcName: "kettle.request.ws.sendEncode",
|
45 | args: ["{that}", "{that}.options.sendMessageJSON", "{arguments}.0"],
|
46 | priority: "before:send"
|
47 | },
|
48 | "onSendMessage.send": {
|
49 | funcName: "kettle.request.ws.sendMessageImpl",
|
50 | args: ["{that}", "{arguments}.0"]
|
51 | }
|
52 | },
|
53 | invokers: {
|
54 | sendMessage: {
|
55 | funcName: "kettle.request.ws.sendMessage",
|
56 | args: ["{that}", "{arguments}.0"]
|
57 | },
|
58 | sendTypedMessage: {
|
59 | funcName: "kettle.request.ws.sendTypedMessage",
|
60 | args: ["{that}", "{arguments}.0", "{arguments}.1"]
|
61 | },
|
62 | handleRequest: "{request}.handlerPromise.resolve()",
|
63 | handleFullRequest: "kettle.request.ws.handleFullRequest"
|
64 | }
|
65 | });
|
66 |
|
67 | fluid.defaults("kettle.request.ws.mismatch", {
|
68 | gradeNames: ["kettle.request.ws", "kettle.request.mismatch"]
|
69 | });
|
70 |
|
71 |
|
72 | kettle.request.ws.handleFullRequest = function (request, fullRequestPromise, verifyCallback) {
|
73 | fullRequestPromise.then(function () {
|
74 | request.events.onRequestSuccess.fire();
|
75 | verifyCallback(true);
|
76 | }, function (err) {
|
77 |
|
78 | request.events.onRequestError.fire(err);
|
79 |
|
80 | verifyCallback(false, err.statusCode, err.message);
|
81 | });
|
82 | };
|
83 |
|
84 | kettle.request.ws.listen = function (that) {
|
85 | that.ws.on("message", function (message) {
|
86 | kettle.withRequest(that, function () {
|
87 | message = that.options.receiveMessageJSON ? kettle.JSON.parse(message) : message;
|
88 | that.events.onReceiveMessage.fire(that, message);
|
89 | })();
|
90 | });
|
91 | };
|
92 |
|
93 |
|
94 |
|
95 |
|
96 |
|
97 | kettle.request.ws.ensureResponseDisposes = function (that) {
|
98 | that.ws.on("close", kettle.withRequest(that, function () {
|
99 | if (!fluid.isDestroyed(that)) {
|
100 | that.events.onRequestEnd.fire();
|
101 | that.destroy();
|
102 | }
|
103 | }));
|
104 | };
|
105 |
|
106 | kettle.request.ws.sendEncode = function (that, encode, data) {
|
107 | return encode ? JSON.stringify(data) : data;
|
108 | };
|
109 |
|
110 | kettle.request.ws.sendMessage = function (that, message) {
|
111 | var options = {};
|
112 | var promise = fluid.promise.fireTransformEvent(that.events.onSendMessage, message, options);
|
113 | return promise;
|
114 | };
|
115 |
|
116 | kettle.request.ws.sendMessageImpl = function (that, message) {
|
117 | var promise = fluid.promise();
|
118 | that.ws.send(message, function (err) {
|
119 | promise[err ? "reject" : "resolve"](err);
|
120 | });
|
121 | return promise;
|
122 | };
|
123 |
|
124 | kettle.request.ws.sendTypedMessage = function (that, type, payload) {
|
125 | return that.sendMessage({
|
126 | type: type,
|
127 | payload: payload
|
128 | });
|
129 | };
|