diff --git a/packages/core/jsr.json b/packages/core/jsr.json index ab3fd47..b63532f 100644 --- a/packages/core/jsr.json +++ b/packages/core/jsr.json @@ -1,6 +1,6 @@ { "name": "@sinkr/core", "license": "MIT", - "version": "0.1.0", + "version": "0.2.0", "exports": "./mod.ts" } \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index 71fbd4b..52ddd0f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@sinkr/core", - "version": "0.1.0", + "version": "0.2.0", "type": "module", "main": "src/index.ts", "exports": { diff --git a/packages/core/src/browser.ts b/packages/core/src/browser.ts index 2e30d71..ba7760c 100644 --- a/packages/core/src/browser.ts +++ b/packages/core/src/browser.ts @@ -15,7 +15,8 @@ import type { } from "@sinkr/validators"; import { ClientReceiveSchema } from "@sinkr/validators"; -import type { EventMap, UserInfo } from "./index"; +import type { RealEventMap } from "./event-fallback"; +import type { UserInfo } from "./index"; import { connectSymbol, countEventSymbol, @@ -47,7 +48,7 @@ type GenericMessageEvent = Prettify< >; type MappedEvents = { - [K in keyof EventMap]: GenericMessageEvent; + [K in keyof RealEventMap]: GenericMessageEvent; }; type _EventMapWithDefaults = MappedEvents & DefaultEvents; @@ -156,7 +157,7 @@ interface DefaultChannelEventMap { [countEventSymbol]: { count: number }; } -type ChannelEventMap = Prettify; +type ChannelEventMap = Prettify; class ChannelSinker extends Emittery { private _count = 0; @@ -214,7 +215,7 @@ interface DefaultPresenceChannelEventMap { } type PresenceChannelEventMap = Prettify< - DefaultPresenceChannelEventMap & EventMap + DefaultPresenceChannelEventMap & RealEventMap >; class PresenceSinker extends Emittery { diff --git a/packages/core/src/event-fallback.ts b/packages/core/src/event-fallback.ts new file mode 100644 index 0000000..78ff747 --- /dev/null +++ b/packages/core/src/event-fallback.ts @@ -0,0 +1,7 @@ +import type { EventMap } from "./index"; + +type DefaultMap = Record; + +type EventKey = keyof EventMap; + +export type RealEventMap = EventKey extends never ? DefaultMap : EventMap; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d710afd..2e98adf 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,17 +1,10 @@ -/** - * Default event map which is used if no custom events are specified. - * - * Supports sending any event with a string key. - */ -export type DefaultEventMap = Record; - /** * Event map for customizing which events can be sent or received. * * Override this with module augmentation to specify your own types. */ // eslint-disable-next-line @typescript-eslint/no-empty-object-type -export interface EventMap extends DefaultEventMap {} +export interface EventMap {} /** * User information for presence channels. diff --git a/packages/core/src/server.ts b/packages/core/src/server.ts index 277620c..5f46647 100644 --- a/packages/core/src/server.ts +++ b/packages/core/src/server.ts @@ -7,7 +7,8 @@ import type { StreamedServerEndpointSchema, } from "@sinkr/validators"; -import type { EventMap, UserInfo } from "./index"; +import type { RealEventMap } from "./event-fallback"; +import type { UserInfo } from "./index"; type SendDataParam = | z.infer @@ -165,8 +166,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. */ async sendToChannel< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >(channel: string, event: TEvent, message: TData): Promise { return await this.sendData({ route: "channel", @@ -184,8 +185,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. The function may return before the stream is finished. */ async streamToChannel< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >( channel: string, event: TEvent, @@ -209,8 +210,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. */ async directMessage< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >(userId: string, event: TEvent, message: TData): Promise { return await this.sendData({ route: "direct", @@ -228,8 +229,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. The function may return before the stream is finished. */ async streamDirectMessage< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >( userId: string, event: TEvent, @@ -252,8 +253,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. */ async broadcastMessage< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >(event: TEvent, message: TData): Promise { return await this.sendData({ route: "broadcast", @@ -269,8 +270,8 @@ class Sourcerer { * @returns The HTTP status code Sinkr returned. The function may return before the stream is finished. */ async streamBroadcastMessage< - TEvent extends keyof EventMap, - TData extends EventMap[TEvent], + TEvent extends keyof RealEventMap, + TData extends RealEventMap[TEvent], >(event: TEvent, stream: ReadableStream): Promise { return await this.sendData( { diff --git a/packages/react/jsr.json b/packages/react/jsr.json index 229fce4..37dd02d 100644 --- a/packages/react/jsr.json +++ b/packages/react/jsr.json @@ -1,6 +1,6 @@ { "name": "@sinkr/react", - "version": "0.1.0", + "version": "0.2.0", "license": "MIT", "exports": "./mod.ts" } \ No newline at end of file diff --git a/packages/react/package.json b/packages/react/package.json index 9f5081f..d5ba159 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@sinkr/react", - "version": "0.1.0", + "version": "0.2.0", "type": "module", "main": "src/index.ts", "exports": { @@ -25,7 +25,7 @@ }, "prettier": "@sinkr/prettier-config", "dependencies": { - "@sinkr/core": "npm:@jsr/sinkr__core@0.1.0", + "@sinkr/core": "npm:@jsr/sinkr__core@0.2.0", "react": "^18.3.1", "react-dom": "^18.3.1" }