@gravito/radiance 1.0.0-beta.1 → 1.0.0

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.
package/README.md CHANGED
@@ -24,7 +24,7 @@ bun add @gravito/radiance
24
24
  ### 1. Configure OrbitRadiance
25
25
 
26
26
  ```typescript
27
- import { PlanetCore } from 'gravito-core'
27
+ import { PlanetCore } from '@gravito/core'
28
28
  import { OrbitRadiance } from '@gravito/radiance'
29
29
 
30
30
  const core = await PlanetCore.boot({
@@ -49,7 +49,7 @@ const core = await PlanetCore.boot({
49
49
  ### 2. Create a broadcastable event
50
50
 
51
51
  ```typescript
52
- import { Event, ShouldBroadcast } from 'gravito-core'
52
+ import { Event, ShouldBroadcast } from '@gravito/core'
53
53
  import { PrivateChannel } from '@gravito/radiance'
54
54
 
55
55
  class OrderShipped extends Event implements ShouldBroadcast {
package/README.zh-TW.md CHANGED
@@ -11,7 +11,7 @@ bun add @gravito/radiance
11
11
  ## 快速開始
12
12
 
13
13
  ```typescript
14
- import { PlanetCore } from 'gravito-core'
14
+ import { PlanetCore } from '@gravito/core'
15
15
  import { OrbitRadiance } from '@gravito/radiance'
16
16
 
17
17
  const core = await PlanetCore.boot({
package/dist/index.js.map CHANGED
@@ -2,13 +2,13 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/BroadcastManager.ts", "../src/channels/Channel.ts", "../src/drivers/AblyDriver.ts", "../src/drivers/PusherDriver.ts", "../src/drivers/RedisDriver.ts", "../src/drivers/WebSocketDriver.ts", "../src/OrbitRadiance.ts"],
4
4
  "sourcesContent": [
5
- "import type { PlanetCore } from 'gravito-core'\nimport type { BroadcastDriver } from './drivers/BroadcastDriver'\n\n/**\n * Channel authorization callback.\n */\nexport type ChannelAuthorizationCallback = (\n channel: string,\n socketId: string,\n userId?: string | number\n) => Promise<boolean>\n\n/**\n * Broadcast manager.\n *\n * Responsible for managing the broadcast driver and handling broadcast requests.\n */\nexport class BroadcastManager {\n private driver: BroadcastDriver | null = null\n private authCallback?: ChannelAuthorizationCallback\n\n constructor(private core: PlanetCore) {}\n\n /**\n * Set the broadcast driver.\n *\n * @param driver - The broadcast driver to use.\n */\n setDriver(driver: BroadcastDriver): void {\n this.driver = driver\n }\n\n /**\n * Set the channel authorization callback.\n *\n * @param callback - The callback function for channel authorization.\n */\n setAuthCallback(callback: ChannelAuthorizationCallback): void {\n this.authCallback = callback\n }\n\n /**\n * Broadcast an event.\n *\n * @param _event - Event instance (unused in current implementation, but kept for signature compatibility).\n * @param channel - Channel object containing name and type.\n * @param data - Event payload.\n * @param eventName - Event name.\n * @returns A promise that resolves when the event is broadcast.\n */\n async broadcast(\n _event: unknown,\n channel: { name: string; type: string },\n data: Record<string, unknown>,\n eventName: string\n ): Promise<void> {\n if (!this.driver) {\n this.core.logger.warn('[BroadcastManager] No broadcast driver set, skipping broadcast')\n return\n }\n\n try {\n await this.driver.broadcast(channel, eventName, data)\n } catch (error) {\n this.core.logger.error(`[BroadcastManager] Failed to broadcast event ${eventName}:`, error)\n throw error\n }\n }\n\n /**\n * Authorize channel access.\n *\n * @param channel - Channel name.\n * @param socketId - Socket ID.\n * @param userId - User ID (optional).\n * @returns A promise resolving to the authorization payload or null if unauthorized.\n */\n async authorizeChannel(\n channel: string,\n socketId: string,\n userId?: string | number\n ): Promise<{ auth: string; channel_data?: string } | null> {\n // Check authorization callback first.\n if (this.authCallback) {\n const authorized = await this.authCallback(channel, socketId, userId)\n if (!authorized) {\n return null\n }\n }\n\n // If the driver supports authorization, use it.\n if (this.driver?.authorizeChannel) {\n return await this.driver.authorizeChannel(channel, socketId, userId)\n }\n\n // Default deny for private/presence channels.\n if (channel.startsWith('private-') || channel.startsWith('presence-')) {\n return null\n }\n\n // Public channels do not require authorization.\n return { auth: '' }\n }\n}\n",
5
+ "import type { PlanetCore } from '@gravito/core'\nimport type { BroadcastDriver } from './drivers/BroadcastDriver'\n\n/**\n * Channel authorization callback.\n */\nexport type ChannelAuthorizationCallback = (\n channel: string,\n socketId: string,\n userId?: string | number\n) => Promise<boolean>\n\n/**\n * Broadcast manager.\n *\n * Responsible for managing the broadcast driver and handling broadcast requests.\n */\nexport class BroadcastManager {\n private driver: BroadcastDriver | null = null\n private authCallback?: ChannelAuthorizationCallback\n\n constructor(private core: PlanetCore) {}\n\n /**\n * Set the broadcast driver.\n *\n * @param driver - The broadcast driver to use.\n */\n setDriver(driver: BroadcastDriver): void {\n this.driver = driver\n }\n\n /**\n * Set the channel authorization callback.\n *\n * @param callback - The callback function for channel authorization.\n */\n setAuthCallback(callback: ChannelAuthorizationCallback): void {\n this.authCallback = callback\n }\n\n /**\n * Broadcast an event.\n *\n * @param _event - Event instance (unused in current implementation, but kept for signature compatibility).\n * @param channel - Channel object containing name and type.\n * @param data - Event payload.\n * @param eventName - Event name.\n * @returns A promise that resolves when the event is broadcast.\n */\n async broadcast(\n _event: unknown,\n channel: { name: string; type: string },\n data: Record<string, unknown>,\n eventName: string\n ): Promise<void> {\n if (!this.driver) {\n this.core.logger.warn('[BroadcastManager] No broadcast driver set, skipping broadcast')\n return\n }\n\n try {\n await this.driver.broadcast(channel, eventName, data)\n } catch (error) {\n this.core.logger.error(`[BroadcastManager] Failed to broadcast event ${eventName}:`, error)\n throw error\n }\n }\n\n /**\n * Authorize channel access.\n *\n * @param channel - Channel name.\n * @param socketId - Socket ID.\n * @param userId - User ID (optional).\n * @returns A promise resolving to the authorization payload or null if unauthorized.\n */\n async authorizeChannel(\n channel: string,\n socketId: string,\n userId?: string | number\n ): Promise<{ auth: string; channel_data?: string } | null> {\n // Check authorization callback first.\n if (this.authCallback) {\n const authorized = await this.authCallback(channel, socketId, userId)\n if (!authorized) {\n return null\n }\n }\n\n // If the driver supports authorization, use it.\n if (this.driver?.authorizeChannel) {\n return await this.driver.authorizeChannel(channel, socketId, userId)\n }\n\n // Default deny for private/presence channels.\n if (channel.startsWith('private-') || channel.startsWith('presence-')) {\n return null\n }\n\n // Public channels do not require authorization.\n return { auth: '' }\n }\n}\n",
6
6
  "/**\n * Base channel interface.\n */\nexport interface Channel {\n /**\n * Channel name.\n */\n name: string\n\n /**\n * Channel type.\n */\n type: 'public' | 'private' | 'presence'\n}\n\n/**\n * Public channel.\n */\nexport class PublicChannel implements Channel {\n type = 'public' as const\n\n constructor(public name: string) {}\n}\n\n/**\n * Private channel.\n */\nexport class PrivateChannel implements Channel {\n type = 'private' as const\n\n constructor(public name: string) {}\n}\n\n/**\n * Presence channel (can track online users).\n */\nexport class PresenceChannel implements Channel {\n type = 'presence' as const\n\n constructor(public name: string) {}\n}\n",
7
7
  "import type { BroadcastDriver } from './BroadcastDriver'\n\n/**\n * Ably driver configuration.\n */\nexport interface AblyDriverConfig {\n apiKey: string\n}\n\n/**\n * Ably driver.\n *\n * Broadcasts through the Ably service.\n */\nexport class AblyDriver implements BroadcastDriver {\n private baseUrl = 'https://rest.ably.io'\n\n constructor(private config: AblyDriverConfig) {}\n\n async broadcast(\n channel: { name: string; type: string },\n event: string,\n data: Record<string, unknown>\n ): Promise<void> {\n const path = `/channels/${channel.name}/messages`\n const auth = btoa(this.config.apiKey)\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: {\n Authorization: `Basic ${auth}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: event,\n data,\n }),\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to broadcast via Ably: ${error}`)\n }\n }\n\n async authorizeChannel(\n channel: string,\n _socketId: string,\n userId?: string | number\n ): Promise<{ auth: string; channel_data?: string }> {\n // Ably uses a different authorization mechanism.\n // This is only a basic implementation.\n return {\n auth: this.config.apiKey,\n ...(channel.startsWith('presence-') && userId\n ? {\n channel_data: JSON.stringify({\n clientId: userId.toString(),\n }),\n }\n : {}),\n }\n }\n}\n",
8
8
  "import type { BroadcastDriver } from './BroadcastDriver'\n\n/**\n * Pusher driver configuration.\n */\nexport interface PusherDriverConfig {\n appId: string\n key: string\n secret: string\n cluster?: string\n useTLS?: boolean\n}\n\n/**\n * Pusher driver.\n *\n * Broadcasts through the Pusher service.\n */\nexport class PusherDriver implements BroadcastDriver {\n private baseUrl: string\n\n constructor(private config: PusherDriverConfig) {\n const cluster = this.config.cluster || 'mt1'\n this.baseUrl = `https://api-${cluster}.pusher.com`\n }\n\n async broadcast(\n channel: { name: string; type: string },\n event: string,\n data: Record<string, unknown>\n ): Promise<void> {\n const path = `/apps/${this.config.appId}/events`\n const body = {\n name: event,\n channel: channel.name,\n data: JSON.stringify(data),\n }\n\n const timestamp = Math.floor(Date.now() / 1000)\n const queryString = new URLSearchParams({\n auth_key: this.config.key,\n auth_timestamp: timestamp.toString(),\n auth_version: '1.0',\n body_md5: this.md5(JSON.stringify(body)),\n })\n\n const authString = `POST\\n${path}\\n${queryString.toString()}`\n const authSignature = await this.hmacSHA256(authString, this.config.secret)\n\n queryString.append('auth_signature', authSignature)\n\n const response = await fetch(`${this.baseUrl}${path}?${queryString.toString()}`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`Failed to broadcast via Pusher: ${error}`)\n }\n }\n\n async authorizeChannel(\n channel: string,\n socketId: string,\n userId?: string | number\n ): Promise<{ auth: string; channel_data?: string }> {\n const stringToSign = `${socketId}:${channel}`\n const signature = await this.hmacSHA256(stringToSign, this.config.secret)\n\n if (channel.startsWith('presence-')) {\n const channelData = JSON.stringify({\n user_id: userId?.toString(),\n user_info: {},\n })\n return {\n auth: `${this.config.key}:${signature}`,\n channel_data: channelData,\n }\n }\n\n return {\n auth: `${this.config.key}:${signature}`,\n }\n }\n\n private async hmacSHA256(message: string, secret: string): Promise<string> {\n // Uses the Web Crypto API.\n const encoder = new TextEncoder()\n const keyData = encoder.encode(secret)\n const messageData = encoder.encode(message)\n\n const key = await crypto.subtle.importKey(\n 'raw',\n keyData,\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n ['sign']\n )\n\n const signature = await crypto.subtle.sign('HMAC', key, messageData)\n const hashArray = Array.from(new Uint8Array(signature))\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('')\n }\n\n private md5(text: string): string {\n // Simplified MD5 implementation (production should use a proper MD5 implementation).\n return btoa(text).replace(/[+/=]/g, '').substring(0, 32)\n }\n}\n",
9
9
  "import type { BroadcastDriver } from './BroadcastDriver'\n\n/**\n * Redis driver configuration.\n */\nexport interface RedisDriverConfig {\n url?: string\n host?: string\n port?: number\n password?: string\n db?: number\n keyPrefix?: string\n}\n\n/**\n * Redis driver.\n *\n * Broadcasts via Redis Pub/Sub.\n * Requires an external Redis client.\n */\nexport class RedisDriver implements BroadcastDriver {\n private redis: {\n publish(channel: string, message: string): Promise<number>\n } | null = null\n\n constructor(private config: RedisDriverConfig) {\n // The Redis client should be injected from the outside.\n // This class only provides the adapter interface.\n }\n\n /**\n * Set Redis client.\n */\n setRedisClient(client: { publish(channel: string, message: string): Promise<number> }): void {\n this.redis = client\n }\n\n async broadcast(\n channel: { name: string; type: string },\n event: string,\n data: Record<string, unknown>\n ): Promise<void> {\n if (!this.redis) {\n throw new Error(\n 'Redis client not set. Please install a Redis client and call setRedisClient()'\n )\n }\n\n const prefix = this.config.keyPrefix || 'gravito:broadcast:'\n const channelName = `${prefix}${channel.name}`\n const message = JSON.stringify({\n event,\n data,\n channel: channel.name,\n type: channel.type,\n })\n\n await this.redis.publish(channelName, message)\n }\n}\n",
10
10
  "import type { BroadcastDriver } from './BroadcastDriver'\n\n/**\n * WebSocket connection interface.\n */\nexport interface WebSocketConnection {\n send(data: string): void\n close(): void\n readyState: number\n}\n\n/**\n * WebSocket driver configuration.\n */\nexport interface WebSocketDriverConfig {\n /**\n * Get all active connections.\n */\n getConnections(): WebSocketConnection[]\n\n /**\n * Filter connections by channel (optional).\n */\n filterConnectionsByChannel?(channel: string): WebSocketConnection[]\n}\n\n/**\n * WebSocket driver.\n *\n * Broadcasts via WebSocket.\n * Suitable for single-node deployments or when direct WebSocket connections are required.\n */\nexport class WebSocketDriver implements BroadcastDriver {\n constructor(private config: WebSocketDriverConfig) {}\n\n async broadcast(\n channel: { name: string; type: string },\n event: string,\n data: Record<string, unknown>\n ): Promise<void> {\n const message = JSON.stringify({\n channel: channel.name,\n event,\n data,\n })\n\n let connections = this.config.getConnections()\n\n // If channel filtering is supported, use it.\n if (this.config.filterConnectionsByChannel) {\n connections = this.config.filterConnectionsByChannel(channel.name)\n }\n\n // Send to all connections.\n for (const connection of connections) {\n if (connection.readyState === 1) {\n // WebSocket.OPEN\n try {\n connection.send(message)\n } catch (error) {\n // Ignore failed sends.\n console.error('Failed to send WebSocket message:', error)\n }\n }\n }\n }\n}\n",
11
- "import type { GravitoOrbit, PlanetCore } from 'gravito-core'\nimport { BroadcastManager } from './BroadcastManager'\nimport type { AblyDriverConfig } from './drivers/AblyDriver'\nimport { AblyDriver } from './drivers/AblyDriver'\nimport type { BroadcastDriver } from './drivers/BroadcastDriver'\nimport type { PusherDriverConfig } from './drivers/PusherDriver'\nimport { PusherDriver } from './drivers/PusherDriver'\nimport type { RedisDriverConfig } from './drivers/RedisDriver'\nimport { RedisDriver } from './drivers/RedisDriver'\nimport type { WebSocketDriverConfig } from './drivers/WebSocketDriver'\nimport { WebSocketDriver } from './drivers/WebSocketDriver'\n\n/**\n * OrbitRadiance options.\n */\nexport interface OrbitRadianceOptions {\n /**\n * Driver type.\n */\n driver: 'pusher' | 'ably' | 'redis' | 'websocket'\n\n /**\n * Driver configuration.\n */\n config: PusherDriverConfig | AblyDriverConfig | RedisDriverConfig | WebSocketDriverConfig\n\n /**\n * Channel authorization callback (optional).\n */\n authorizeChannel?: (\n channel: string,\n socketId: string,\n userId?: string | number\n ) => Promise<boolean>\n}\n\n/**\n * Broadcasting Orbit\n *\n * Provides broadcasting capabilities with multiple drivers (Pusher, Ably, Redis, WebSocket).\n */\nexport class OrbitRadiance implements GravitoOrbit {\n private options: OrbitRadianceOptions\n\n constructor(options: OrbitRadianceOptions) {\n this.options = options\n }\n\n /**\n * Configure OrbitRadiance.\n */\n static configure(options: OrbitRadianceOptions): OrbitRadiance {\n return new OrbitRadiance(options)\n }\n\n async install(core: PlanetCore): Promise<void> {\n const manager = new BroadcastManager(core)\n\n // Create and set driver.\n let driver: BroadcastDriver\n\n switch (this.options.driver) {\n case 'pusher':\n driver = new PusherDriver(this.options.config as PusherDriverConfig)\n break\n case 'ably':\n driver = new AblyDriver(this.options.config as AblyDriverConfig)\n break\n case 'redis': {\n driver = new RedisDriver(this.options.config as RedisDriverConfig)\n // If a Redis client is provided via core services, set it.\n const redisClient = core.services.get('redis') as\n | { publish(channel: string, message: string): Promise<number> }\n | undefined\n if (redisClient) {\n ;(driver as RedisDriver).setRedisClient(redisClient)\n }\n break\n }\n case 'websocket':\n driver = new WebSocketDriver(this.options.config as WebSocketDriverConfig)\n break\n default:\n throw new Error(`Unsupported broadcast driver: ${this.options.driver}`)\n }\n\n manager.setDriver(driver)\n\n // Set auth callback.\n if (this.options.authorizeChannel) {\n manager.setAuthCallback(this.options.authorizeChannel)\n }\n\n // Register into core services.\n core.services.set('broadcast', manager)\n\n // Integrate with EventManager.\n if (core.events) {\n core.events.setBroadcastManager({\n broadcast: async (event: any, channel: any, data: any, eventName: any) => {\n await manager.broadcast(event, channel, data, eventName)\n },\n })\n }\n\n core.logger.info(`[OrbitRadiance] Installed with ${this.options.driver} driver`)\n }\n}\n"
11
+ "import type { GravitoOrbit, PlanetCore } from '@gravito/core'\nimport { BroadcastManager } from './BroadcastManager'\nimport type { AblyDriverConfig } from './drivers/AblyDriver'\nimport { AblyDriver } from './drivers/AblyDriver'\nimport type { BroadcastDriver } from './drivers/BroadcastDriver'\nimport type { PusherDriverConfig } from './drivers/PusherDriver'\nimport { PusherDriver } from './drivers/PusherDriver'\nimport type { RedisDriverConfig } from './drivers/RedisDriver'\nimport { RedisDriver } from './drivers/RedisDriver'\nimport type { WebSocketDriverConfig } from './drivers/WebSocketDriver'\nimport { WebSocketDriver } from './drivers/WebSocketDriver'\n\n/**\n * OrbitRadiance options.\n */\nexport interface OrbitRadianceOptions {\n /**\n * Driver type.\n */\n driver: 'pusher' | 'ably' | 'redis' | 'websocket'\n\n /**\n * Driver configuration.\n */\n config: PusherDriverConfig | AblyDriverConfig | RedisDriverConfig | WebSocketDriverConfig\n\n /**\n * Channel authorization callback (optional).\n */\n authorizeChannel?: (\n channel: string,\n socketId: string,\n userId?: string | number\n ) => Promise<boolean>\n}\n\n/**\n * Broadcasting Orbit\n *\n * Provides broadcasting capabilities with multiple drivers (Pusher, Ably, Redis, WebSocket).\n */\nexport class OrbitRadiance implements GravitoOrbit {\n private options: OrbitRadianceOptions\n\n constructor(options: OrbitRadianceOptions) {\n this.options = options\n }\n\n /**\n * Configure OrbitRadiance.\n */\n static configure(options: OrbitRadianceOptions): OrbitRadiance {\n return new OrbitRadiance(options)\n }\n\n async install(core: PlanetCore): Promise<void> {\n const manager = new BroadcastManager(core)\n\n // Create and set driver.\n let driver: BroadcastDriver\n\n switch (this.options.driver) {\n case 'pusher':\n driver = new PusherDriver(this.options.config as PusherDriverConfig)\n break\n case 'ably':\n driver = new AblyDriver(this.options.config as AblyDriverConfig)\n break\n case 'redis': {\n driver = new RedisDriver(this.options.config as RedisDriverConfig)\n // If a Redis client is provided via core services, set it.\n const redisClient = core.services.get('redis') as\n | { publish(channel: string, message: string): Promise<number> }\n | undefined\n if (redisClient) {\n ;(driver as RedisDriver).setRedisClient(redisClient)\n }\n break\n }\n case 'websocket':\n driver = new WebSocketDriver(this.options.config as WebSocketDriverConfig)\n break\n default:\n throw new Error(`Unsupported broadcast driver: ${this.options.driver}`)\n }\n\n manager.setDriver(driver)\n\n // Set auth callback.\n if (this.options.authorizeChannel) {\n manager.setAuthCallback(this.options.authorizeChannel)\n }\n\n // Register into core services.\n core.services.set('broadcast', manager)\n\n // Integrate with EventManager.\n if (core.events) {\n core.events.setBroadcastManager({\n broadcast: async (event: any, channel: any, data: any, eventName: any) => {\n await manager.broadcast(event, channel, data, eventName)\n },\n })\n }\n\n core.logger.info(`[OrbitRadiance] Installed with ${this.options.driver} driver`)\n }\n}\n"
12
12
  ],
13
13
  "mappings": "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",
14
14
  "debugId": "01B589AE84540A2064756E2164756E21",
package/package.json CHANGED
@@ -1,18 +1,18 @@
1
1
  {
2
2
  "name": "@gravito/radiance",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
7
  "description": "Lightweight, high-performance broadcasting system for Gravito framework. Supports multiple drivers (Pusher, Ably, Redis, WebSocket) with zero runtime overhead.",
8
- "module": "./dist/index.mjs",
9
8
  "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
10
  "type": "module",
11
11
  "types": "./dist/index.d.ts",
12
12
  "exports": {
13
13
  ".": {
14
14
  "types": "./dist/index.d.ts",
15
- "import": "./dist/index.mjs",
15
+ "import": "./dist/index.js",
16
16
  "require": "./dist/index.cjs"
17
17
  }
18
18
  },
@@ -24,7 +24,9 @@
24
24
  "scripts": {
25
25
  "build": "bun run build.ts",
26
26
  "test": "bun test",
27
- "typecheck": "tsc --noEmit"
27
+ "typecheck": "bun tsc -p tsconfig.json --noEmit --skipLibCheck",
28
+ "test:coverage": "bun test --coverage --coverage-threshold=80",
29
+ "test:ci": "bun test --coverage --coverage-threshold=80"
28
30
  },
29
31
  "keywords": [
30
32
  "gravito",
@@ -39,7 +41,7 @@
39
41
  "author": "Carl Lee <carllee0520@gmail.com>",
40
42
  "license": "MIT",
41
43
  "dependencies": {
42
- "gravito-core": "1.0.0-beta.6"
44
+ "@gravito/core": "workspace:*"
43
45
  },
44
46
  "devDependencies": {
45
47
  "bun-types": "latest",
@@ -51,4 +53,4 @@
51
53
  "url": "git+https://github.com/gravito-framework/gravito.git",
52
54
  "directory": "packages/radiance"
53
55
  }
54
- }
56
+ }