@socket.io/postgres-adapter
Version:
The Socket.IO Postgres adapter, allowing to broadcast events between several Socket.IO servers
74 lines (73 loc) • 2.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PostgresAdapter = exports.createAdapter = void 0;
const socket_io_adapter_1 = require("socket.io-adapter");
const debug_1 = require("debug");
const util_1 = require("./util");
const debug = (0, debug_1.default)("socket.io-postgres-adapter");
/**
* Returns a function that will create a PostgresAdapter instance.
*
* @param pool - a pg.Pool instance
* @param opts - additional options
*
* @public
*/
function createAdapter(pool, opts = {}) {
const options = Object.assign({
channelPrefix: "socket.io",
tableName: "socket_io_attachments",
payloadThreshold: 8000,
cleanupInterval: 30000,
errorHandler: (err) => debug(err),
}, opts);
const namespaces = new Map();
const client = new util_1.PubSubClient(pool, options, (msg) => {
var _a;
// @ts-expect-error uid is protected
return ((_a = namespaces.get(msg.nsp)) === null || _a === void 0 ? void 0 : _a.uid) === msg.uid;
}, (msg) => {
var _a;
(_a = namespaces.get(msg.nsp)) === null || _a === void 0 ? void 0 : _a.onMessage(msg);
});
return function (nsp) {
let adapter = new PostgresAdapter(nsp, opts, client);
namespaces.set(nsp.name, adapter);
client.addNamespace(nsp.name);
const defaultClose = adapter.close;
adapter.close = () => {
namespaces.delete(nsp.name);
if (namespaces.size === 0) {
client.close();
}
defaultClose.call(adapter);
};
return adapter;
};
}
exports.createAdapter = createAdapter;
class PostgresAdapter extends socket_io_adapter_1.ClusterAdapterWithHeartbeat {
/**
* Adapter constructor.
*
* @param nsp - the namespace
* @param opts - additional options
* @param client
*
* @public
*/
constructor(nsp, opts, client) {
super(nsp, opts);
this.client = client;
}
doPublish(message) {
return this.client.publish(message).then(() => {
// connection state recovery is not currently supported
return "";
});
}
doPublishResponse(_requesterUid, response) {
return this.client.publish(response);
}
}
exports.PostgresAdapter = PostgresAdapter;