ms/packages/websocket/src/socket.io-client/index.ts

106 lines
2.3 KiB
TypeScript

import { url } from "./url"
import { Manager, ManagerOptions } from "./manager"
import { Socket, SocketOptions } from "./socket"
const debug = require("../debug")("socket.io-client")
/**
* Module exports.
*/
module.exports = exports = lookup
/**
* Managers cache.
*/
const cache: Record<string, Manager> = (exports.managers = {})
/**
* Looks up an existing `Manager` for multiplexing.
* If the user summons:
*
* `io('http://localhost/a');`
* `io('http://localhost/b');`
*
* We reuse the existing instance based on same scheme/port/host,
* and we initialize sockets for each namespace.
*
* @public
*/
function lookup(opts?: Partial<ManagerOptions & SocketOptions>): Socket
function lookup(
uri: string,
opts?: Partial<ManagerOptions & SocketOptions>
): Socket
function lookup(
uri: string | Partial<ManagerOptions & SocketOptions>,
opts?: Partial<ManagerOptions & SocketOptions>
): Socket
function lookup(
uri: string | Partial<ManagerOptions & SocketOptions>,
opts?: Partial<ManagerOptions & SocketOptions>
): Socket {
if (typeof uri === "object") {
opts = uri
uri = undefined
}
opts = opts || {}
const parsed = url(uri as string, opts.path || "/socket.io")
const source = parsed.source
const id = parsed.id
const path = parsed.path
const sameNamespace = cache[id] && path in cache[id]["nsps"]
const newConnection =
opts.forceNew ||
opts["force new connection"] ||
false === opts.multiplex ||
sameNamespace
let io: Manager
if (newConnection) {
debug("ignoring socket cache for %s", source)
io = new Manager(source, opts)
} else {
if (!cache[id]) {
debug("new io instance for %s", source)
cache[id] = new Manager(source, opts)
}
io = cache[id]
}
if (parsed.query && !opts.query) {
opts.query = parsed.queryKey
}
return io.socket(parsed.path, opts)
}
/**
* Protocol version.
*
* @public
*/
export { protocol } from "../socket.io-parser"
/**
* `connect`.
*
* @param {String} uri
* @public
*/
exports.connect = lookup
/**
* Expose constructors for standalone build.
*
* @public
*/
export { Manager, ManagerOptions } from "./manager"
export { Socket } from "./socket"
export { lookup as io, SocketOptions }
export default lookup