UNPKG

4.3 kBJavaScriptView Raw
1/**
2 * Kettle Request for use with WebSockets
3 *
4 * Copyright 2012-2013 OCAD University
5 * Copyright 2015 Raising the Floor (International)
6 *
7 * Licensed under the New BSD license. You may not use this file except in
8 * compliance with this License.
9 *
10 * You may obtain a copy of the License at
11 * https://github.com/fluid-project/kettle/blob/master/LICENSE.txt
12 */
13
14"use strict";
15
16var fluid = require("infusion"),
17 kettle = fluid.registerNamespace("kettle");
18
19/**
20 * WebSockets refinement of request object.
21 */
22fluid.defaults("kettle.request.ws", {
23 gradeNames: ["kettle.request"],
24 members: {
25// ws: null // arrives on the onBindWs event after connection
26 },
27 events: {
28 onBindWs: null,
29 onReceiveMessage: null,
30 onSendMessage: null
31 },
32 receiveMessageJSON: true, // deserialize all received data as JSON
33 sendMessageJSON: true, // serialize all sent data as JSON
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"] // message
57 },
58 sendTypedMessage: {
59 funcName: "kettle.request.ws.sendTypedMessage",
60 args: ["{that}", "{arguments}.0", "{arguments}.1"] // type, payload
61 },
62 handleRequest: "{request}.handlerPromise.resolve()", // by default we simply proceed
63 handleFullRequest: "kettle.request.ws.handleFullRequest"
64 }
65});
66
67fluid.defaults("kettle.request.ws.mismatch", {
68 gradeNames: ["kettle.request.ws", "kettle.request.mismatch"]
69});
70
71// This is handed the verifyClient callback from ws
72kettle.request.ws.handleFullRequest = function (request, fullRequestPromise, verifyCallback) {
73 fullRequestPromise.then(function () {
74 request.events.onRequestSuccess.fire();
75 verifyCallback(true);
76 }, function (err) {
77 // note that these onRequestXxxx events by default have no listeners on a ws request
78 request.events.onRequestError.fire(err);
79 // note that this message cannot be read by the standard client, but we send it anyway. The status code can be read ok
80 verifyCallback(false, err.statusCode, err.message);
81 });
82};
83
84kettle.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 * Ensure that the request object is cleared on socket diconnect.
95 * @param {Object} that Fluid request object.
96 */
97kettle.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
106kettle.request.ws.sendEncode = function (that, encode, data) {
107 return encode ? JSON.stringify(data) : data;
108};
109
110kettle.request.ws.sendMessage = function (that, message) {
111 var options = {}; // none currently supported
112 var promise = fluid.promise.fireTransformEvent(that.events.onSendMessage, message, options);
113 return promise;
114};
115
116kettle.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
124kettle.request.ws.sendTypedMessage = function (that, type, payload) {
125 return that.sendMessage({
126 type: type,
127 payload: payload
128 });
129};