@@ -10,6 +10,10 @@ import { Transport } from '../transport';
1010// workaround: `tsc --skipLibCheck`.
1111declare var self : WorkerGlobalScope ;
1212
13+ type ClientCallback = ( ) => void | Promise < void > ;
14+
15+ const connectEventName = 'worker-connect' ;
16+
1317export interface WorkerMainTransportOptions
1418 extends Partial < TransportOptions < TransferableWorker > > {
1519 /**
@@ -50,6 +54,41 @@ export abstract class WorkerMainTransport<
5054 listener,
5155 sender,
5256 } ) ;
57+
58+ this . emit ( {
59+ // @ts -ignore
60+ name : connectEventName ,
61+ respond : true ,
62+ silent : true ,
63+ } ) . then ( this . _handleConnectCallbacks ) ;
64+
65+ // @ts -ignore
66+ this . listen ( connectEventName , this . _handleConnectCallbacks ) ;
67+ }
68+
69+ private _connected = false ;
70+
71+ private _handleConnectCallbacks = async ( ) => {
72+ if ( this . _connected ) {
73+ return ;
74+ }
75+ this . _connected = true ;
76+ this . _onConnectCallback . forEach ( ( callback ) => {
77+ callback ( ) ;
78+ } ) ;
79+ this . _onConnectCallback . clear ( ) ;
80+ } ;
81+
82+ private _onConnectCallback = new Set < ClientCallback > ( ) ;
83+
84+ onConnect ( callback : ClientCallback ) {
85+ if ( this . _connected ) {
86+ return callback ( ) ;
87+ }
88+ this . _onConnectCallback . add ( callback ) ;
89+ return ( ) => {
90+ this . _onConnectCallback . delete ( callback ) ;
91+ } ;
5392 }
5493}
5594
@@ -79,6 +118,41 @@ export abstract class WorkerInternalTransport<
79118 listener,
80119 sender,
81120 } ) ;
121+
122+ this . emit ( {
123+ // @ts -ignore
124+ name : connectEventName ,
125+ respond : true ,
126+ silent : true ,
127+ } ) . then ( this . _handleConnectCallbacks ) ;
128+
129+ // @ts -ignore
130+ this . listen ( connectEventName , this . _handleConnectCallbacks ) ;
131+ }
132+
133+ private _handleConnectCallbacks = async ( ) => {
134+ if ( this . _connected ) {
135+ return ;
136+ }
137+ this . _connected = true ;
138+ this . _onConnectCallback . forEach ( ( callback ) => {
139+ callback ( ) ;
140+ } ) ;
141+ this . _onConnectCallback . clear ( ) ;
142+ } ;
143+
144+ private _connected = false ;
145+
146+ private _onConnectCallback = new Set < ClientCallback > ( ) ;
147+
148+ onConnect ( callback : ClientCallback ) {
149+ if ( this . _connected ) {
150+ return callback ( ) ;
151+ }
152+ this . _onConnectCallback . add ( callback ) ;
153+ return ( ) => {
154+ this . _onConnectCallback . delete ( callback ) ;
155+ } ;
82156 }
83157}
84158
0 commit comments