All files server.js

92% Statements 46/50
71.43% Branches 5/7
100% Functions 11/11
91.84% Lines 45/49
1 2 3 4 5 6 7 8 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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102  1x 1x   1x   1x 1x 1x     1x 1x 1x       1x 9x 9x 9x     1x 9x 9x   15x 15x                   15x 15x   8x                 8x 8x 6x   8x 8x 7x 7x   1x 1x   8x   7x 3x 3x   7x           1x 6x         6x   1x 1x         1x   1x 7x       7x   1x        
"use strict";
var websocket_1 = require('websocket');
var messageTypes_1 = require('./messageTypes');
;
var Server = (function () {
    function Server(options, httpServer) {
        var _this = this;
        var subscriptionManager = options.subscriptionManager, onSubscribe = options.onSubscribe;
        Iif (!subscriptionManager) {
            throw new Error('Must provide `subscriptionManager` to websocket server constructor.');
        }
        this.subscriptionManager = subscriptionManager;
        this.onSubscribe = onSubscribe;
        this.wsServer = new websocket_1.server({
            httpServer: httpServer,
            autoAcceptConnections: false,
        });
        this.wsServer.on('request', function (request) {
            var connection = request.accept('graphql-subscriptions', request.origin);
            var connectionSubscriptions = {};
            connection.on('message', _this.onMessage(connection, connectionSubscriptions));
        });
    }
    Server.prototype.onMessage = function (connection, connectionSubscriptions) {
        var _this = this;
        return function (message) {
            var parsedMessage;
            try {
                parsedMessage = JSON.parse(message.utf8Data);
            }
            catch (e) {
                var failMessage = {
                    type: messageTypes_1.SUBSCRIPTION_FAIL,
                    errors: ['Message must be JSON-parseable.'],
                    id: parsedMessage.id,
                };
                connection.sendUTF(JSON.stringify(failMessage));
            }
            var subId = parsedMessage.id;
            switch (parsedMessage.type) {
                case messageTypes_1.SUBSCRIPTION_START:
                    var params = {
                        query: parsedMessage.query,
                        variables: parsedMessage.variables,
                        operationName: parsedMessage.operationName,
                        context: {},
                        formatResponse: undefined,
                        formatError: undefined,
                        callback: undefined,
                    };
                    params = _this.onSubscribe(parsedMessage, params);
                    params['callback'] = function (errors, data) {
                        _this.sendSubscriptionData(connection, subId, data);
                    };
                    var graphqlSubId = void 0;
                    _this.subscriptionManager.subscribe(params).then(function (graphqlSubId) {
                        connectionSubscriptions[subId] = graphqlSubId;
                        _this.sendSubscriptionSuccess(connection, subId);
                    }).catch(function (e) {
                        _this.sendSubscriptionFail(connection, subId, { errors: e.errors });
                        return;
                    });
                    break;
                case messageTypes_1.SUBSCRIPTION_END:
                    if (connectionSubscriptions[subId]) {
                        _this.subscriptionManager.unsubscribe(connectionSubscriptions[subId]);
                        delete connectionSubscriptions[subId];
                    }
                    break;
                default:
                    throw new Error('Invalid message type. Message type must be `subscription_start` or `subscription_end`.');
            }
        };
    };
    Server.prototype.sendSubscriptionData = function (connection, subId, payload) {
        var message = {
            type: messageTypes_1.SUBSCRIPTION_DATA,
            id: subId,
            payload: payload,
        };
        connection.sendUTF(JSON.stringify(message));
    };
    Server.prototype.sendSubscriptionFail = function (connection, subId, payload) {
        var message = {
            type: messageTypes_1.SUBSCRIPTION_FAIL,
            id: subId,
            payload: payload,
        };
        connection.sendUTF(JSON.stringify(message));
    };
    Server.prototype.sendSubscriptionSuccess = function (connection, subId) {
        var message = {
            type: messageTypes_1.SUBSCRIPTION_SUCCESS,
            id: subId,
        };
        connection.sendUTF(JSON.stringify(message));
    };
    return Server;
}());
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = Server;
//# sourceMappingURL=server.js.map