subscriptions-transport-ws
Version:
A websocket transport for GraphQL subscriptions
104 lines • 4.36 kB
JavaScript
;
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;
if (!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;
try {
graphqlSubId = _this.subscriptionManager.subscribe(params);
}
catch (e) {
_this.sendSubscriptionFail(connection, subId, { errors: e.errors });
return;
}
connectionSubscriptions[subId] = graphqlSubId;
_this.sendSubscriptionSuccess(connection, subId);
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