@@ -10,7 +10,6 @@ import {
1010 getClientId ,
1111 getPathId ,
1212} from './common.ts' ;
13- import { SyncletDurableObject } from './synclet.ts' ;
1413
1514export const createDurableObjectBrokerTransport : typeof createDurableObjectBrokerTransportDecl =
1615 ( { path, brokerPaths, ...options } ) => {
@@ -27,62 +26,48 @@ export const createDurableObjectBrokerTransport: typeof createDurableObjectBroke
2726
2827 const sendPacket = async ( _packet : string ) : Promise < void > => { } ;
2928
30- const fetch = async ( _request : Request ) : Promise < Response | undefined > => {
31- return undefined ;
29+ const fetch = async (
30+ ctx : DurableObjectState ,
31+ request : Request ,
32+ ) : Promise < Response | undefined > => {
33+ const pathId = getPathId ( request ) ;
34+ return ifNotNull (
35+ getClientId ( request ) ,
36+ ( clientId ) => {
37+ const [ webSocket , client ] = objValues ( new WebSocketPair ( ) ) ;
38+ ctx . acceptWebSocket ( client , [ clientId , pathId ] ) ;
39+ return createResponse ( 101 , webSocket ) ;
40+ } ,
41+ createUpgradeRequiredResponse ,
42+ ) as Response ;
3243 } ;
3344
45+ const webSocketMessage = async (
46+ ctx : DurableObjectState ,
47+ ws : WebSocket ,
48+ message : ArrayBuffer | string ,
49+ ) : Promise < boolean | undefined > =>
50+ ifNotUndefined ( ctx . getTags ( ws ) [ 0 ] , ( clientId ) => {
51+ const packet = message . toString ( ) ;
52+ const splitAt = packet . indexOf ( SPACE ) ;
53+ if ( splitAt !== - 1 ) {
54+ const to = slice ( packet , 0 , splitAt ) ;
55+ const remainder = slice ( packet , splitAt + 1 ) ;
56+ const forwardedPacket = clientId + SPACE + remainder ;
57+ if ( to === ASTERISK ) {
58+ arrayForEach ( ctx . getWebSockets ( ) , ( otherClient ) =>
59+ otherClient !== ws ? otherClient . send ( forwardedPacket ) : 0 ,
60+ ) ;
61+ } else if ( to != clientId ) {
62+ ctx . getWebSockets ( to ) [ 0 ] ?. send ( forwardedPacket ) ;
63+ }
64+ }
65+ return true ;
66+ } ) ;
67+
3468 return createDurableObjectTransport (
3569 { connect, disconnect, sendPacket} ,
36- { fetch} ,
70+ { fetch, webSocketMessage } ,
3771 options ,
3872 ) ;
3973 } ;
40-
41- export class BrokerOnlyDurableObject <
42- Env = unknown ,
43- > extends SyncletDurableObject < Env > {
44- constructor ( ctx : DurableObjectState , env : Env ) {
45- super ( ctx , env ) ;
46- }
47-
48- async fetch ( request : Request ) : Promise < Response > {
49- const pathId = getPathId ( request ) ;
50- return ifNotNull (
51- getClientId ( request ) ,
52- ( clientId ) => {
53- const [ webSocket , client ] = objValues ( new WebSocketPair ( ) ) ;
54- this . ctx . acceptWebSocket ( client , [ clientId , pathId ] ) ;
55- return createResponse ( 101 , webSocket ) ;
56- } ,
57- createUpgradeRequiredResponse ,
58- ) as Response ;
59- }
60-
61- webSocketMessage ( client : WebSocket , message : ArrayBuffer | string ) {
62- ifNotUndefined ( this . ctx . getTags ( client ) [ 0 ] , ( clientId ) =>
63- this . #handleMessage( clientId , message . toString ( ) , client ) ,
64- ) ;
65- }
66-
67- webSocketClose ( _client : WebSocket ) { }
68-
69- #handleMessage( id : string , packet : string , fromClient ?: WebSocket ) {
70- const splitAt = packet . indexOf ( SPACE ) ;
71- if ( splitAt !== - 1 ) {
72- const to = slice ( packet , 0 , splitAt ) ;
73- const remainder = slice ( packet , splitAt + 1 ) ;
74- const forwardedPacket = id + SPACE + remainder ;
75- if ( to === ASTERISK ) {
76- arrayForEach ( this . #getClients( ) , ( otherClient ) =>
77- otherClient !== fromClient ? otherClient . send ( forwardedPacket ) : 0 ,
78- ) ;
79- } else if ( to != id ) {
80- this . #getClients( to ) [ 0 ] ?. send ( forwardedPacket ) ;
81- }
82- }
83- }
84-
85- #getClients( tag ?: string ) {
86- return this . ctx . getWebSockets ( tag ) ;
87- }
88- }
0 commit comments