{"version":3,"file":"index.cjs","sources":["../src/utils/url.ts","../src/client/manager/utils.ts","../src/client/manager/module.ts","../src/event/constants.ts","../src/event/utils.ts","../src/helpers.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function cleanDoubleSlashes(input = ''): string {\n    if (input.indexOf('://') !== -1) {\n        return input.split('://')\n            .map((str) => cleanDoubleSlashes(str))\n            .join('://');\n    }\n\n    return input.replace(/\\/+/g, '/');\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from '@authup/kit';\nimport type { DisconnectDescription } from '../../types';\nimport type { ClientManagerTokenFn } from './types';\n\nexport function toClientManagerTokenAsyncFn(input?: string | ClientManagerTokenFn) {\n    if (typeof input === 'undefined') {\n        return () => undefined;\n    }\n\n    if (typeof input === 'string') {\n        return () => input;\n    }\n\n    return input;\n}\n\nexport function isDisconnectDescription(input: unknown) : input is DisconnectDescription {\n    return isObject(input) &&\n        typeof input.description === 'string';\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ManagerOptions, Socket } from 'socket.io-client';\nimport { Manager } from 'socket.io-client';\nimport type { CTSEvents, DefaultEvents, STCEvents } from '../../types';\nimport { cleanDoubleSlashes } from '../../utils';\nimport type { ClientManagerContext, ClientManagerTokenFn } from './types';\nimport { isDisconnectDescription, toClientManagerTokenAsyncFn } from './utils';\n\nexport class ClientManager<\n    ListenEvents extends DefaultEvents = STCEvents,\n    EmitEvents extends DefaultEvents = CTSEvents,\n> {\n    protected manager : Manager<ListenEvents, EmitEvents>;\n\n    protected sockets: Map<string, Socket<ListenEvents, EmitEvents>>;\n\n    protected tokenFn : ClientManagerTokenFn;\n\n    constructor(ctx: ClientManagerContext) {\n        this.sockets = new Map();\n\n        const url = new URL(ctx.url);\n        const baseURL = `${url.protocol}//${url.host}`;\n\n        const options : Partial<ManagerOptions> = {\n            ...(ctx.options || {}),\n        };\n\n        if (options.path) {\n            if (url.pathname.endsWith(options.path)) {\n                options.path = url.pathname;\n            } else if (url.pathname !== '/') {\n                options.path = cleanDoubleSlashes(url.pathname + options.path);\n            }\n        } else if (url.pathname.endsWith('/socket.io')) {\n            options.path = url.pathname;\n        } else if (url.pathname !== '/') {\n            options.path = cleanDoubleSlashes(`${url.pathname}/socket.io`);\n        }\n\n        this.manager = new Manager(baseURL, {\n            autoConnect: false,\n            ...options,\n        });\n\n        this.tokenFn = toClientManagerTokenAsyncFn(ctx.token);\n    }\n\n    get options() {\n        return this.manager.opts;\n    }\n\n    async connect(namespace = '/') : Promise<Socket<ListenEvents, EmitEvents>> {\n        const socket = this.inject(namespace);\n        if (socket.connected) {\n            return socket;\n        }\n\n        return new Promise((resolve, reject) => {\n            socket.once('connect', () => {\n                resolve(socket);\n            });\n\n            socket.once('connect_error', (err) => {\n                reject(err);\n            });\n\n            socket.connect();\n        });\n    }\n\n    async disconnect(namespace = '/') : Promise<void> {\n        const socket = this.inject(namespace);\n        if (!socket.connected) {\n            return;\n        }\n\n        await new Promise<void>((resolve, reject) => {\n            socket.once('disconnect', (\n                reason,\n                description,\n            ) => {\n                if (reason === 'io client disconnect') {\n                    resolve();\n                    return;\n                }\n\n                if (isDisconnectDescription(description)) {\n                    reject(new Error(description.description));\n                    return;\n                }\n\n                reject(description);\n            });\n\n            socket.disconnect();\n        });\n    }\n\n    async reconnect(namespace = '/') : Promise<Socket<ListenEvents, EmitEvents>> {\n        await this.disconnect(namespace);\n        return new Promise((resolve, reject) => {\n            setTimeout(() => {\n                this.connect(namespace)\n                    .then((socket) => resolve(socket))\n                    .catch((err) => reject(err));\n            });\n        });\n    }\n\n    async reconnectAll() : Promise<Socket<ListenEvents, EmitEvents>[]> {\n        const keys = this.sockets.keys();\n        const promises : Promise<Socket<ListenEvents, EmitEvents>>[] = [];\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n            const key = keys.next();\n            if (key.done) {\n                break;\n            }\n\n            promises.push(this.reconnect(key.value));\n        }\n\n        return Promise.all(promises);\n    }\n\n    inject(namespace = '/') : Socket<ListenEvents, EmitEvents> {\n        if (this.sockets.has(namespace)) {\n            return this.sockets.get(namespace);\n        }\n\n        const socket = this.manager.socket(namespace, {\n            auth: (cb: CallableFunction) => {\n                Promise.resolve()\n                    .then(() => this.tokenFn())\n                    .then((token) => {\n                        cb({ token });\n                    })\n                    .catch(() => cb());\n            },\n        });\n\n        this.sockets.set(namespace, socket);\n\n        return socket;\n    }\n\n    eject(namespace = '/') {\n        if (this.sockets[namespace]) {\n            this.sockets[namespace].disconnect();\n            delete this.sockets[namespace];\n        }\n    }\n}\n","/*\n * Copyright (c) 2024-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum EventNameSuffix {\n    CREATED = 'created',\n    DELETED = 'deleted',\n    UPDATED = 'updated',\n\n    SUBSCRIBE = 'subscribe',\n    UNSUBSCRIBE = 'unsubscribe',\n}\n","/*\n * Copyright (c) 2023-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EventFullName } from './types';\n\nexport function buildEventFullName<\n    ENTITY extends string,\n    VERB extends string,\n>(\n    entity: ENTITY,\n    event: VERB,\n) : EventFullName<ENTITY, VERB> {\n    const eventCapitalized = event.substring(0, 1).toUpperCase() + event.substring(1);\n\n    return entity + eventCapitalized as EventFullName<ENTITY, VERB>;\n}\n","/*\n * Copyright (c) 2021-2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { EventCallback, EventTarget } from './types';\n\nexport function isEventTarget(\n    input: unknown,\n) : input is EventTarget {\n    return typeof input === 'number' ||\n        typeof input === 'string' ||\n        typeof input === 'undefined';\n}\n\nexport function isEventCallback(\n    input: unknown,\n    fnArgs?: number,\n) : input is EventCallback {\n    if (typeof fnArgs === 'undefined') {\n        return typeof input === 'function';\n    }\n\n    return typeof input === 'function' &&\n        input.length >= fnArgs;\n}\n"],"names":["cleanDoubleSlashes","input","indexOf","split","map","str","join","replace","toClientManagerTokenAsyncFn","undefined","isDisconnectDescription","isObject","description","ClientManager","options","manager","opts","connect","namespace","socket","inject","connected","Promise","resolve","reject","once","err","disconnect","reason","Error","reconnect","setTimeout","then","catch","reconnectAll","keys","sockets","promises","key","next","done","push","value","all","has","get","auth","cb","tokenFn","token","set","eject","ctx","Map","url","URL","baseURL","protocol","host","path","pathname","endsWith","Manager","autoConnect","EventNameSuffix","buildEventFullName","entity","event","eventCapitalized","substring","toUpperCase","isEventTarget","isEventCallback","fnArgs","length"],"mappings":"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"}