@@ -43,25 +43,24 @@ import {getListenerFunctions} from '../../common/listeners.ts';
4343import { ifNotUndefined } from '../../common/other.ts' ;
4444import { objFreeze } from '../../common/obj.ts' ;
4545
46- type ServerClient = {
47- persister : Persister <
48- Persists . MergeableStoreOnly | Persists . StoreOrMergeableStore
49- > ;
50- synchronizer : Synchronizer ;
51- send : ( payload : string ) => void ;
52- } ;
53-
5446const PATH_REGEX = / \/ ( [ ^ ? ] * ) / ;
5547const SERVER_CLIENT_ID = 'S' ;
5648
57- export const createWsServer = ( (
49+ export const createWsServer = ( <
50+ PathPersister extends Persister <
51+ Persists . MergeableStoreOnly | Persists . StoreOrMergeableStore
52+ > ,
53+ > (
5854 webSocketServer : WebSocketServer ,
59- createPersister ?: (
60- path : Id ,
61- ) =>
62- | Persister < Persists . MergeableStoreOnly | Persists . StoreOrMergeableStore >
63- | undefined ,
55+ createPersisterForPath ?: ( pathId : Id ) => Promise < PathPersister | undefined > ,
56+ destroyPersisterForPath ?: ( pathId : Id , persister : PathPersister ) => void ,
6457) => {
58+ type ServerClient = {
59+ persister : PathPersister ;
60+ synchronizer : Synchronizer ;
61+ send : ( payload : string ) => void ;
62+ } ;
63+
6564 const pathIdListeners : IdSet2 = mapNew ( ) ;
6665 const clientIdListeners : IdSet2 = mapNew ( ) ;
6766 const clientsByPath : IdMap2 < WebSocket > = mapNew ( ) ;
@@ -71,34 +70,34 @@ export const createWsServer = ((
7170 ( ) => wsServer ,
7271 ) ;
7372
74- const startServerClient = ( pathId : Id ) =>
75- ifNotUndefined ( createPersister ?. ( pathId ) , async ( persister ) => {
76- const serverClient = mapEnsure (
77- serverClientsByPath ,
78- pathId ,
79- ( ) => ( { persister } ) as ServerClient ,
80- ) ;
81- const messageHandler = getMessageHandler ( SERVER_CLIENT_ID , pathId ) ;
82-
83- serverClient . synchronizer = await createCustomSynchronizer (
84- persister . getStore ( ) as MergeableStore ,
85- ( toClientId , requestId , message , body ) =>
86- messageHandler ( createPayload ( toClientId , requestId , message , body ) ) ,
87- ( receive : Receive ) =>
88- ( serverClient . send = ( payload ) => receivePayload ( payload , receive ) ) ,
89- ( ) => { } ,
90- 0.1 ,
91- ) . startSync ( ) ;
92- await persister . startAutoLoad ( ) ;
93- await persister . startAutoSave ( ) ;
94- } ) ;
73+ const startServerClient = async ( pathId : Id ) =>
74+ ifNotUndefined (
75+ await createPersisterForPath ?. ( pathId ) ,
76+ async ( persister ) => {
77+ const serverClient = mapEnsure (
78+ serverClientsByPath ,
79+ pathId ,
80+ ( ) => ( { persister } ) as ServerClient ,
81+ ) ;
82+ const messageHandler = getMessageHandler ( SERVER_CLIENT_ID , pathId ) ;
83+ serverClient . synchronizer = await createCustomSynchronizer (
84+ persister . getStore ( ) as MergeableStore ,
85+ ( toClientId , requestId , message , body ) =>
86+ messageHandler ( createPayload ( toClientId , requestId , message , body ) ) ,
87+ ( receive : Receive ) =>
88+ ( serverClient . send = ( payload ) => receivePayload ( payload , receive ) ) ,
89+ ( ) => { } ,
90+ 0.1 ,
91+ ) . startSync ( ) ;
92+ } ,
93+ ) ;
9594
9695 const stopServerClient = ( pathId : Id ) =>
9796 ifNotUndefined (
9897 mapGet ( serverClientsByPath , pathId ) ,
9998 ( { persister, synchronizer} ) => {
100- persister . destroy ( ) ;
10199 synchronizer ?. destroy ( ) ;
100+ destroyPersisterForPath ?.( pathId , persister ) ;
102101 collDel ( serverClientsByPath , pathId ) ;
103102 } ,
104103 ) ;
@@ -129,11 +128,11 @@ export const createWsServer = ((
129128
130129 webSocketServer . on ( 'connection' , ( webSocket , request ) =>
131130 ifNotUndefined ( request . url ?. match ( PATH_REGEX ) , ( [ , pathId ] ) =>
132- ifNotUndefined ( request . headers [ 'sec-websocket-key' ] , ( clientId ) => {
131+ ifNotUndefined ( request . headers [ 'sec-websocket-key' ] , async ( clientId ) => {
133132 const clients = mapEnsure ( clientsByPath , pathId , mapNew < Id , WebSocket > ) ;
134133 if ( collIsEmpty ( clients ) ) {
135134 callListeners ( pathIdListeners , undefined , pathId , 1 ) ;
136- startServerClient ( pathId ) ;
135+ await startServerClient ( pathId ) ;
137136 }
138137 mapSet ( clients , clientId , webSocket ) ;
139138 callListeners ( clientIdListeners , [ pathId ] , clientId , 1 ) ;
0 commit comments