@gravito/radiance 1.0.0-alpha.2 → 1.0.0-alpha.6
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 +37 -44
- package/README.zh-TW.md +30 -0
- package/dist/index.js.map +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
# @gravito/radiance
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Lightweight, high-performance broadcasting for Gravito with multiple drivers (Pusher, Ably, Redis, WebSocket).
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Status**: v0.1.0 - core features complete with multiple broadcast drivers.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Features
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
- **AI
|
|
9
|
+
- **Zero runtime overhead**: Pure type wrappers that delegate to drivers
|
|
10
|
+
- **Multi-driver support**: Pusher, Ably, Redis, WebSocket
|
|
11
|
+
- **Modular**: Install only the driver you need
|
|
12
|
+
- **Events integration**: Events can implement `ShouldBroadcast`
|
|
13
|
+
- **Channel authorization**: Private and presence channels supported
|
|
14
|
+
- **AI-friendly**: Strong typing, clear JSDoc, and predictable APIs
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## Installation
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
bun add @gravito/radiance
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Quick Start
|
|
23
23
|
|
|
24
|
-
### 1.
|
|
24
|
+
### 1. Configure OrbitRadiance
|
|
25
25
|
|
|
26
26
|
```typescript
|
|
27
27
|
import { PlanetCore } from 'gravito-core'
|
|
@@ -38,7 +38,7 @@ const core = await PlanetCore.boot({
|
|
|
38
38
|
cluster: 'mt1',
|
|
39
39
|
},
|
|
40
40
|
authorizeChannel: async (channel, socketId, userId) => {
|
|
41
|
-
//
|
|
41
|
+
// Implement channel auth logic here
|
|
42
42
|
return true
|
|
43
43
|
},
|
|
44
44
|
}),
|
|
@@ -46,7 +46,7 @@ const core = await PlanetCore.boot({
|
|
|
46
46
|
})
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
### 2.
|
|
49
|
+
### 2. Create a broadcastable event
|
|
50
50
|
|
|
51
51
|
```typescript
|
|
52
52
|
import { Event, ShouldBroadcast } from 'gravito-core'
|
|
@@ -75,14 +75,13 @@ class OrderShipped extends Event implements ShouldBroadcast {
|
|
|
75
75
|
}
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
### 3.
|
|
78
|
+
### 3. Dispatch events (auto broadcast)
|
|
79
79
|
|
|
80
80
|
```typescript
|
|
81
|
-
// 分發事件時會自動廣播
|
|
82
81
|
await core.events.dispatch(new OrderShipped(order))
|
|
83
82
|
```
|
|
84
83
|
|
|
85
|
-
### 4.
|
|
84
|
+
### 4. Manual broadcast
|
|
86
85
|
|
|
87
86
|
```typescript
|
|
88
87
|
const broadcast = c.get('broadcast') as BroadcastManager
|
|
@@ -95,7 +94,7 @@ await broadcast.broadcast(
|
|
|
95
94
|
)
|
|
96
95
|
```
|
|
97
96
|
|
|
98
|
-
##
|
|
97
|
+
## Drivers
|
|
99
98
|
|
|
100
99
|
### Pusher
|
|
101
100
|
|
|
@@ -106,8 +105,8 @@ OrbitRadiance.configure({
|
|
|
106
105
|
appId: 'your-app-id',
|
|
107
106
|
key: 'your-key',
|
|
108
107
|
secret: 'your-secret',
|
|
109
|
-
cluster: 'mt1',
|
|
110
|
-
useTLS: true,
|
|
108
|
+
cluster: 'mt1',
|
|
109
|
+
useTLS: true,
|
|
111
110
|
},
|
|
112
111
|
})
|
|
113
112
|
```
|
|
@@ -128,19 +127,17 @@ OrbitRadiance.configure({
|
|
|
128
127
|
```typescript
|
|
129
128
|
import { RedisDriver } from '@gravito/radiance'
|
|
130
129
|
|
|
131
|
-
// 需要先設置 Redis 客戶端
|
|
132
130
|
const redisDriver = new RedisDriver({
|
|
133
131
|
url: 'redis://localhost:6379',
|
|
134
132
|
})
|
|
135
133
|
|
|
136
|
-
// 設置 Redis 客戶端
|
|
137
134
|
redisDriver.setRedisClient(redisClient)
|
|
138
135
|
|
|
139
136
|
OrbitRadiance.configure({
|
|
140
137
|
driver: 'redis',
|
|
141
138
|
config: {
|
|
142
139
|
url: 'redis://localhost:6379',
|
|
143
|
-
keyPrefix: 'gravito:broadcast:',
|
|
140
|
+
keyPrefix: 'gravito:broadcast:',
|
|
144
141
|
},
|
|
145
142
|
})
|
|
146
143
|
```
|
|
@@ -152,11 +149,9 @@ OrbitRadiance.configure({
|
|
|
152
149
|
driver: 'websocket',
|
|
153
150
|
config: {
|
|
154
151
|
getConnections: () => {
|
|
155
|
-
// 返回所有 WebSocket 連接
|
|
156
152
|
return Array.from(websocketConnections.values())
|
|
157
153
|
},
|
|
158
154
|
filterConnectionsByChannel: (channel) => {
|
|
159
|
-
// 根據頻道過濾連接(可選)
|
|
160
155
|
return Array.from(websocketConnections.values()).filter(
|
|
161
156
|
(conn) => conn.subscribedChannels.includes(channel)
|
|
162
157
|
)
|
|
@@ -165,9 +160,9 @@ OrbitRadiance.configure({
|
|
|
165
160
|
})
|
|
166
161
|
```
|
|
167
162
|
|
|
168
|
-
##
|
|
163
|
+
## Channel Types
|
|
169
164
|
|
|
170
|
-
###
|
|
165
|
+
### Public
|
|
171
166
|
|
|
172
167
|
```typescript
|
|
173
168
|
import { PublicChannel } from '@gravito/radiance'
|
|
@@ -179,7 +174,7 @@ class PublicEvent extends Event implements ShouldBroadcast {
|
|
|
179
174
|
}
|
|
180
175
|
```
|
|
181
176
|
|
|
182
|
-
###
|
|
177
|
+
### Private
|
|
183
178
|
|
|
184
179
|
```typescript
|
|
185
180
|
import { PrivateChannel } from '@gravito/radiance'
|
|
@@ -191,7 +186,7 @@ class PrivateEvent extends Event implements ShouldBroadcast {
|
|
|
191
186
|
}
|
|
192
187
|
```
|
|
193
188
|
|
|
194
|
-
###
|
|
189
|
+
### Presence
|
|
195
190
|
|
|
196
191
|
```typescript
|
|
197
192
|
import { PresenceChannel } from '@gravito/radiance'
|
|
@@ -203,16 +198,15 @@ class PresenceEvent extends Event implements ShouldBroadcast {
|
|
|
203
198
|
}
|
|
204
199
|
```
|
|
205
200
|
|
|
206
|
-
##
|
|
201
|
+
## Channel Authorization
|
|
207
202
|
|
|
208
|
-
|
|
203
|
+
Private and presence channels require authorization.
|
|
209
204
|
|
|
210
205
|
```typescript
|
|
211
206
|
OrbitRadiance.configure({
|
|
212
207
|
driver: 'pusher',
|
|
213
208
|
config: { /* ... */ },
|
|
214
209
|
authorizeChannel: async (channel, socketId, userId) => {
|
|
215
|
-
// 檢查使用者是否有權限存取此頻道
|
|
216
210
|
if (channel.startsWith('private-user.')) {
|
|
217
211
|
const channelUserId = channel.replace('private-user.', '')
|
|
218
212
|
return userId?.toString() === channelUserId
|
|
@@ -222,26 +216,25 @@ OrbitRadiance.configure({
|
|
|
222
216
|
})
|
|
223
217
|
```
|
|
224
218
|
|
|
225
|
-
## API
|
|
219
|
+
## API Reference
|
|
226
220
|
|
|
227
221
|
### BroadcastManager
|
|
228
222
|
|
|
229
|
-
####
|
|
223
|
+
#### Methods
|
|
230
224
|
|
|
231
|
-
- `broadcast(event, channel, data, eventName): Promise<void>` -
|
|
232
|
-
- `authorizeChannel(channel, socketId, userId): Promise<{ auth, channel_data? } | null>` -
|
|
233
|
-
- `setDriver(driver: BroadcastDriver): void` -
|
|
234
|
-
- `setAuthCallback(callback: ChannelAuthorizationCallback): void` -
|
|
225
|
+
- `broadcast(event, channel, data, eventName): Promise<void>` - Broadcast an event
|
|
226
|
+
- `authorizeChannel(channel, socketId, userId): Promise<{ auth, channel_data? } | null>` - Authorize channel access
|
|
227
|
+
- `setDriver(driver: BroadcastDriver): void` - Set the broadcast driver
|
|
228
|
+
- `setAuthCallback(callback: ChannelAuthorizationCallback): void` - Set the auth callback
|
|
235
229
|
|
|
236
230
|
### ShouldBroadcast
|
|
237
231
|
|
|
238
|
-
|
|
232
|
+
Events implementing `ShouldBroadcast` will be broadcast automatically:
|
|
239
233
|
|
|
240
|
-
- `broadcastOn(): string | Channel` -
|
|
241
|
-
- `broadcastWith?(): Record<string, unknown>` -
|
|
242
|
-
- `broadcastAs?(): string` -
|
|
234
|
+
- `broadcastOn(): string | Channel` - Broadcast channel (required)
|
|
235
|
+
- `broadcastWith?(): Record<string, unknown>` - Payload (optional)
|
|
236
|
+
- `broadcastAs?(): string` - Event name (optional)
|
|
243
237
|
|
|
244
|
-
##
|
|
238
|
+
## License
|
|
245
239
|
|
|
246
240
|
MIT © Carl Lee
|
|
247
|
-
|
package/README.zh-TW.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# @gravito/radiance
|
|
2
|
+
|
|
3
|
+
> Gravito 的廣播模組,支援 Pusher、Ably、Redis、WebSocket 等驅動。
|
|
4
|
+
|
|
5
|
+
## 安裝
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
bun add @gravito/radiance
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## 快速開始
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { PlanetCore } from 'gravito-core'
|
|
15
|
+
import { OrbitRadiance } from '@gravito/radiance'
|
|
16
|
+
|
|
17
|
+
const core = await PlanetCore.boot({
|
|
18
|
+
orbits: [
|
|
19
|
+
OrbitRadiance.configure({
|
|
20
|
+
driver: 'pusher',
|
|
21
|
+
config: {
|
|
22
|
+
appId: 'your-app-id',
|
|
23
|
+
key: 'your-key',
|
|
24
|
+
secret: 'your-secret',
|
|
25
|
+
cluster: 'mt1',
|
|
26
|
+
},
|
|
27
|
+
}),
|
|
28
|
+
],
|
|
29
|
+
})
|
|
30
|
+
```
|
package/dist/index.js.map
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
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 setDriver(driver: BroadcastDriver): void {\n this.driver = driver\n }\n\n /**\n * Set the channel authorization callback.\n */\n setAuthCallback(callback: ChannelAuthorizationCallback): void {\n this.authCallback = callback\n }\n\n /**\n * Broadcast an event.\n *\n * @param
|
|
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",
|
|
@@ -10,7 +10,7 @@
|
|
|
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
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
|
-
"mappings": ";AAiBO,MAAM,iBAAiB;AAAA,EAIR;AAAA,EAHZ,SAAiC;AAAA,EACjC;AAAA,EAER,WAAW,CAAS,MAAkB;AAAA,IAAlB;AAAA;AAAA,
|
|
13
|
+
"mappings": "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",
|
|
14
14
|
"debugId": "01B589AE84540A2064756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gravito/radiance",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.6",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"author": "Carl Lee <carllee0520@gmail.com>",
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"gravito-core": "1.0.0-beta.
|
|
42
|
+
"gravito-core": "1.0.0-beta.5"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
45
|
"bun-types": "latest",
|