@loopeco/socketio
Version:
A enhanced LoopBack's WebSocket server based on socket.io
47 lines (40 loc) • 1.67 kB
text/typescript
import {Socket} from 'socket.io';
import {IncomingMessage, OutgoingMessage} from 'http';
import express from 'express';
import {SocketIoNextFunction} from './types';
import setPrototypeOf = require('setprototypeof');
export function expressInit(socket: Socket, next?: SocketIoNextFunction): [express.Request, express.Response];
export function expressInit(
request: IncomingMessage,
response?: OutgoingMessage | SocketIoNextFunction,
next?: SocketIoNextFunction,
): [express.Request, express.Response];
export function expressInit(
request: IncomingMessage | Socket,
response?: OutgoingMessage | SocketIoNextFunction,
next?: SocketIoNextFunction,
): [express.Request, express.Response] {
if (typeof (request as Socket).use === 'function') {
request = (request as Socket).request;
}
if (typeof response === 'function') {
next = response as SocketIoNextFunction;
response = undefined;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const req = (request ?? {}) as any;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const res = (response ?? req.res ?? {}) as any;
if (!req.res) req.res = res;
if (!res.req) res.req = req;
req.next = next;
if (!isExpressRequest(req)) setPrototypeOf(req, express.request);
if (!isExpressResponse(res)) setPrototypeOf(res, express.response);
return [req, res];
}
export function isExpressRequest(x?: object): x is express.Request {
return !!x && typeof (x as express.Request).header === 'function';
}
export function isExpressResponse(x?: object): x is express.Response {
return !!x && typeof (x as express.Response).header === 'function';
}