@authup/core-realtime-kit 1.0.0-beta.27 → 1.0.0-beta.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/client/manager/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG1E,qBAAa,aAAa,CACtB,YAAY,SAAS,aAAa,GAAG,SAAS,EAC9C,UAAU,SAAS,aAAa,GAAG,SAAS;IAE5C,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAEtD,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,OAAO,EAAG,oBAAoB,CAAC;gBAE7B,GAAG,EAAE,oBAAoB;IA8BrC,IAAI,OAAO,4BAEV;IAEK,OAAO,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAmBpE,UAAU,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,IAAI,CAAC;IA4B3C,SAAS,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAWtE,YAAY,IAAK,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;IAgBlE,MAAM,CAAC,SAAS,SAAM,GAAI,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;IAqB1D,KAAK,CAAC,SAAS,SAAM;CAMxB"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../src/client/manager/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAG1E,qBAAa,aAAa,CACtB,YAAY,SAAS,aAAa,GAAG,SAAS,EAC9C,UAAU,SAAS,aAAa,GAAG,SAAS;IAE5C,SAAS,CAAC,OAAO,EAAG,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAEtD,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IAEjE,SAAS,CAAC,OAAO,EAAG,oBAAoB,CAAC;gBAE7B,GAAG,EAAE,oBAAoB;IA8BrC,IAAI,OAAO,4BAEV;IAEK,OAAO,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAmBpE,UAAU,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,IAAI,CAAC;IA4B3C,SAAS,CAAC,SAAS,SAAM,GAAI,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAWtE,YAAY,IAAK,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,EAAE,CAAC;IAgBlE,MAAM,CAAC,SAAS,SAAM,GAAI,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC;IAsB1D,KAAK,CAAC,SAAS,SAAM;CAQxB"}
@@ -1,5 +1,5 @@
1
1
  import type { DisconnectDescription } from '../../types';
2
2
  import type { ClientManagerTokenFn } from './types';
3
- export declare function toClientManagerTokenAsyncFn(input?: string | ClientManagerTokenFn): () => any;
3
+ export declare function toClientManagerTokenAsyncFn(input?: string | ClientManagerTokenFn): ClientManagerTokenFn;
4
4
  export declare function isDisconnectDescription(input: unknown): input is DisconnectDescription;
5
5
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/client/manager/utils.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,2BAA2B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,oBAAoB,aAUhF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,qBAAqB,CAGvF"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/client/manager/utils.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAEpD,wBAAgB,2BAA2B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,oBAAoB,wBAUhF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAI,KAAK,IAAI,qBAAqB,CAGvF"}
@@ -1,3 +1,3 @@
1
1
  import type { EventFullName } from './types';
2
2
  export declare function buildEventFullName<ENTITY extends string, VERB extends string>(entity: ENTITY, event: VERB): EventFullName<ENTITY, VERB>;
3
- //# sourceMappingURL=utils.d.ts.map
3
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/event/helpers.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,wBAAgB,kBAAkB,CAC9B,MAAM,SAAS,MAAM,EACrB,IAAI,SAAS,MAAM,EAEnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,GACX,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAI9B"}
@@ -1,4 +1,4 @@
1
1
  export * from './constants';
2
2
  export * from './types';
3
- export * from './utils';
3
+ export * from './helpers.ts';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/event/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC"}
package/dist/index.mjs CHANGED
@@ -27,6 +27,33 @@ function isDisconnectDescription(input) {
27
27
  }
28
28
 
29
29
  class ClientManager {
30
+ manager;
31
+ sockets;
32
+ tokenFn;
33
+ constructor(ctx){
34
+ this.sockets = new Map();
35
+ const url = new URL(ctx.url);
36
+ const baseURL = `${url.protocol}//${url.host}`;
37
+ const options = {
38
+ ...ctx.options || {}
39
+ };
40
+ if (options.path) {
41
+ if (url.pathname.endsWith(options.path)) {
42
+ options.path = url.pathname;
43
+ } else if (url.pathname !== '/') {
44
+ options.path = cleanDoubleSlashes(url.pathname + options.path);
45
+ }
46
+ } else if (url.pathname.endsWith('/socket.io')) {
47
+ options.path = url.pathname;
48
+ } else if (url.pathname !== '/') {
49
+ options.path = cleanDoubleSlashes(`${url.pathname}/socket.io`);
50
+ }
51
+ this.manager = new Manager(baseURL, {
52
+ autoConnect: false,
53
+ ...options
54
+ });
55
+ this.tokenFn = toClientManagerTokenAsyncFn(ctx.token);
56
+ }
30
57
  get options() {
31
58
  return this.manager.opts;
32
59
  }
@@ -87,10 +114,11 @@ class ClientManager {
87
114
  return Promise.all(promises);
88
115
  }
89
116
  inject(namespace = '/') {
90
- if (this.sockets.has(namespace)) {
91
- return this.sockets.get(namespace);
117
+ let socket = this.sockets.get(namespace);
118
+ if (socket) {
119
+ return socket;
92
120
  }
93
- const socket = this.manager.socket(namespace, {
121
+ socket = this.manager.socket(namespace, {
94
122
  auth: (cb)=>{
95
123
  Promise.resolve().then(()=>this.tokenFn()).then((token)=>{
96
124
  cb({
@@ -103,34 +131,11 @@ class ClientManager {
103
131
  return socket;
104
132
  }
105
133
  eject(namespace = '/') {
106
- if (this.sockets[namespace]) {
107
- this.sockets[namespace].disconnect();
108
- delete this.sockets[namespace];
109
- }
110
- }
111
- constructor(ctx){
112
- this.sockets = new Map();
113
- const url = new URL(ctx.url);
114
- const baseURL = `${url.protocol}//${url.host}`;
115
- const options = {
116
- ...ctx.options || {}
117
- };
118
- if (options.path) {
119
- if (url.pathname.endsWith(options.path)) {
120
- options.path = url.pathname;
121
- } else if (url.pathname !== '/') {
122
- options.path = cleanDoubleSlashes(url.pathname + options.path);
123
- }
124
- } else if (url.pathname.endsWith('/socket.io')) {
125
- options.path = url.pathname;
126
- } else if (url.pathname !== '/') {
127
- options.path = cleanDoubleSlashes(`${url.pathname}/socket.io`);
134
+ const socket = this.sockets.get(namespace);
135
+ if (socket) {
136
+ socket.disconnect();
137
+ this.sockets.delete(namespace);
128
138
  }
129
- this.manager = new Manager(baseURL, {
130
- autoConnect: false,
131
- ...options
132
- });
133
- this.tokenFn = toClientManagerTokenAsyncFn(ctx.token);
134
139
  }
135
140
  }
136
141
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","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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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/utils/url.ts","../src/client/manager/utils.ts","../src/client/manager/module.ts","../src/event/constants.ts","../src/event/helpers.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 let socket = this.sockets.get(namespace);\n if (socket) {\n return socket;\n }\n\n 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 const socket = this.sockets.get(namespace);\n\n if (socket) {\n socket.disconnect();\n this.sockets.delete(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","manager","sockets","tokenFn","ctx","Map","url","URL","baseURL","protocol","host","options","path","pathname","endsWith","Manager","autoConnect","token","opts","connect","namespace","socket","inject","connected","Promise","resolve","reject","once","err","disconnect","reason","Error","reconnect","setTimeout","then","catch","reconnectAll","keys","promises","key","next","done","push","value","all","get","auth","cb","set","eject","delete","EventNameSuffix","buildEventFullName","entity","event","eventCapitalized","substring","toUpperCase","isEventTarget","isEventCallback","fnArgs","length"],"mappings":"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"}
package/package.json CHANGED
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@authup/core-realtime-kit",
3
- "version": "1.0.0-beta.27",
3
+ "type": "module",
4
+ "version": "1.0.0-beta.29",
4
5
  "description": "Package containing a toolkit for the core realtime service.",
5
6
  "license": "Apache-2.0",
6
7
  "exports": {
7
8
  "./package.json": "./package.json",
8
9
  ".": {
9
10
  "types": "./dist/index.d.ts",
10
- "import": "./dist/index.mjs",
11
- "require": "./dist/index.cjs"
11
+ "import": "./dist/index.mjs"
12
12
  }
13
13
  },
14
- "main": "./dist/index.cjs",
15
14
  "module": "./dist/index.mjs",
16
15
  "types": "./dist/index.d.ts",
17
16
  "files": [
@@ -22,8 +21,11 @@
22
21
  "build:js": "rollup -c",
23
22
  "build": "rimraf ./dist && cross-env NODE_ENV=production npm run build:js && npm run build:types",
24
23
  "build:watch": "npm run build -- --watch",
25
- "test": "cross-env NODE_ENV=test jest --config ./test/jest.config.js",
26
- "test:coverage": "cross-env NODE_ENV=test jest --config ./test/jest.config.js --coverage"
24
+ "test": "cross-env NODE_ENV=test vitest run test/unit",
25
+ "test:coverage": "cross-env NODE_ENV=test vitest run --coverage"
26
+ },
27
+ "engines": {
28
+ "node": "^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0"
27
29
  },
28
30
  "keywords": [
29
31
  "realtime",
@@ -44,13 +46,14 @@
44
46
  },
45
47
  "homepage": "https://github.com/authup/authup#readme",
46
48
  "devDependencies": {
47
- "@authup/kit": "^1.0.0-beta.27",
48
- "socket.io": "^4.8.1",
49
- "socket.io-client": "^4.8.1"
49
+ "@authup/kit": "^1.0.0-beta.29",
50
+ "socket.io": "^4.8.3",
51
+ "socket.io-client": "^4.8.3",
52
+ "vitest": "^4.0.14"
50
53
  },
51
54
  "peerDependencies": {
52
- "@authup/kit": "^1.0.0-beta.27",
53
- "socket.io-client": "^4.8.1"
55
+ "@authup/kit": "^1.0.0-beta.29",
56
+ "socket.io-client": "^4.8.3"
54
57
  },
55
58
  "publishConfig": {
56
59
  "access": "public"
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/event/utils.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,wBAAgB,kBAAkB,CAC9B,MAAM,SAAS,MAAM,EACrB,IAAI,SAAS,MAAM,EAEnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,IAAI,GACX,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAI9B"}
package/dist/index.cjs DELETED
@@ -1,183 +0,0 @@
1
- 'use strict';
2
-
3
- var socket_ioClient = require('socket.io-client');
4
- var kit = require('@authup/kit');
5
-
6
- /*
7
- * Copyright (c) 2025.
8
- * Author Peter Placzek (tada5hi)
9
- * For the full copyright and license information,
10
- * view the LICENSE file that was distributed with this source code.
11
- */ function cleanDoubleSlashes(input = '') {
12
- if (input.indexOf('://') !== -1) {
13
- return input.split('://').map((str)=>cleanDoubleSlashes(str)).join('://');
14
- }
15
- return input.replace(/\/+/g, '/');
16
- }
17
-
18
- function toClientManagerTokenAsyncFn(input) {
19
- if (typeof input === 'undefined') {
20
- return ()=>undefined;
21
- }
22
- if (typeof input === 'string') {
23
- return ()=>input;
24
- }
25
- return input;
26
- }
27
- function isDisconnectDescription(input) {
28
- return kit.isObject(input) && typeof input.description === 'string';
29
- }
30
-
31
- class ClientManager {
32
- get options() {
33
- return this.manager.opts;
34
- }
35
- async connect(namespace = '/') {
36
- const socket = this.inject(namespace);
37
- if (socket.connected) {
38
- return socket;
39
- }
40
- return new Promise((resolve, reject)=>{
41
- socket.once('connect', ()=>{
42
- resolve(socket);
43
- });
44
- socket.once('connect_error', (err)=>{
45
- reject(err);
46
- });
47
- socket.connect();
48
- });
49
- }
50
- async disconnect(namespace = '/') {
51
- const socket = this.inject(namespace);
52
- if (!socket.connected) {
53
- return;
54
- }
55
- await new Promise((resolve, reject)=>{
56
- socket.once('disconnect', (reason, description)=>{
57
- if (reason === 'io client disconnect') {
58
- resolve();
59
- return;
60
- }
61
- if (isDisconnectDescription(description)) {
62
- reject(new Error(description.description));
63
- return;
64
- }
65
- reject(description);
66
- });
67
- socket.disconnect();
68
- });
69
- }
70
- async reconnect(namespace = '/') {
71
- await this.disconnect(namespace);
72
- return new Promise((resolve, reject)=>{
73
- setTimeout(()=>{
74
- this.connect(namespace).then((socket)=>resolve(socket)).catch((err)=>reject(err));
75
- });
76
- });
77
- }
78
- async reconnectAll() {
79
- const keys = this.sockets.keys();
80
- const promises = [];
81
- // eslint-disable-next-line no-constant-condition
82
- while(true){
83
- const key = keys.next();
84
- if (key.done) {
85
- break;
86
- }
87
- promises.push(this.reconnect(key.value));
88
- }
89
- return Promise.all(promises);
90
- }
91
- inject(namespace = '/') {
92
- if (this.sockets.has(namespace)) {
93
- return this.sockets.get(namespace);
94
- }
95
- const socket = this.manager.socket(namespace, {
96
- auth: (cb)=>{
97
- Promise.resolve().then(()=>this.tokenFn()).then((token)=>{
98
- cb({
99
- token
100
- });
101
- }).catch(()=>cb());
102
- }
103
- });
104
- this.sockets.set(namespace, socket);
105
- return socket;
106
- }
107
- eject(namespace = '/') {
108
- if (this.sockets[namespace]) {
109
- this.sockets[namespace].disconnect();
110
- delete this.sockets[namespace];
111
- }
112
- }
113
- constructor(ctx){
114
- this.sockets = new Map();
115
- const url = new URL(ctx.url);
116
- const baseURL = `${url.protocol}//${url.host}`;
117
- const options = {
118
- ...ctx.options || {}
119
- };
120
- if (options.path) {
121
- if (url.pathname.endsWith(options.path)) {
122
- options.path = url.pathname;
123
- } else if (url.pathname !== '/') {
124
- options.path = cleanDoubleSlashes(url.pathname + options.path);
125
- }
126
- } else if (url.pathname.endsWith('/socket.io')) {
127
- options.path = url.pathname;
128
- } else if (url.pathname !== '/') {
129
- options.path = cleanDoubleSlashes(`${url.pathname}/socket.io`);
130
- }
131
- this.manager = new socket_ioClient.Manager(baseURL, {
132
- autoConnect: false,
133
- ...options
134
- });
135
- this.tokenFn = toClientManagerTokenAsyncFn(ctx.token);
136
- }
137
- }
138
-
139
- /*
140
- * Copyright (c) 2024-2024.
141
- * Author Peter Placzek (tada5hi)
142
- * For the full copyright and license information,
143
- * view the LICENSE file that was distributed with this source code.
144
- */ var EventNameSuffix = /*#__PURE__*/ function(EventNameSuffix) {
145
- EventNameSuffix["CREATED"] = "created";
146
- EventNameSuffix["DELETED"] = "deleted";
147
- EventNameSuffix["UPDATED"] = "updated";
148
- EventNameSuffix["SUBSCRIBE"] = "subscribe";
149
- EventNameSuffix["UNSUBSCRIBE"] = "unsubscribe";
150
- return EventNameSuffix;
151
- }({});
152
-
153
- /*
154
- * Copyright (c) 2023-2024.
155
- * Author Peter Placzek (tada5hi)
156
- * For the full copyright and license information,
157
- * view the LICENSE file that was distributed with this source code.
158
- */ function buildEventFullName(entity, event) {
159
- const eventCapitalized = event.substring(0, 1).toUpperCase() + event.substring(1);
160
- return entity + eventCapitalized;
161
- }
162
-
163
- /*
164
- * Copyright (c) 2021-2024.
165
- * Author Peter Placzek (tada5hi)
166
- * For the full copyright and license information,
167
- * view the LICENSE file that was distributed with this source code.
168
- */ function isEventTarget(input) {
169
- return typeof input === 'number' || typeof input === 'string' || typeof input === 'undefined';
170
- }
171
- function isEventCallback(input, fnArgs) {
172
- if (typeof fnArgs === 'undefined') {
173
- return typeof input === 'function';
174
- }
175
- return typeof input === 'function' && input.length >= fnArgs;
176
- }
177
-
178
- exports.ClientManager = ClientManager;
179
- exports.EventNameSuffix = EventNameSuffix;
180
- exports.buildEventFullName = buildEventFullName;
181
- exports.isEventCallback = isEventCallback;
182
- exports.isEventTarget = isEventTarget;
183
- //# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"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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"}