11import {
2- ReactPyClient ,
2+ BaseReactPyClient ,
33 createReconnectingWebSocket ,
44 type GenericReactPyClientProps ,
5+ type ReactPyClientInterface ,
6+ type ReactPyModule ,
7+ type ReactPyUrls ,
58} from "@reactpy/client" ;
69
7- export class ReactPyDjangoClient extends ReactPyClient {
10+ export class ReactPyDjangoClient
11+ extends BaseReactPyClient
12+ implements ReactPyClientInterface
13+ {
14+ urls : ReactPyUrls ;
15+ socket : { current ?: WebSocket } ;
16+ mountElement : HTMLElement ;
817 prerenderElement : HTMLElement | null = null ;
918 offlineElement : HTMLElement | null = null ;
19+ private readonly messageQueue : any [ ] = [ ] ;
1020
1121 constructor ( props : GenericReactPyClientProps ) {
12- super ( props ) ;
22+ super ( ) ;
23+
24+ this . urls = props . urls ;
25+ this . mountElement = props . mountElement ;
1326 this . prerenderElement = document . getElementById (
1427 props . mountElement . id + "-prerender" ,
1528 ) ;
1629 this . offlineElement = document . getElementById (
1730 props . mountElement . id + "-offline" ,
1831 ) ;
32+
1933 this . socket = createReconnectingWebSocket ( {
2034 url : this . urls . componentUrl ,
2135 readyPromise : this . ready ,
@@ -42,4 +56,19 @@ export class ReactPyDjangoClient extends ReactPyClient {
4256 } ,
4357 } ) ;
4458 }
59+
60+ sendMessage ( message : any ) : void {
61+ if (
62+ this . socket . current &&
63+ this . socket . current . readyState === WebSocket . OPEN
64+ ) {
65+ this . socket . current . send ( JSON . stringify ( message ) ) ;
66+ } else {
67+ this . messageQueue . push ( message ) ;
68+ }
69+ }
70+
71+ loadModule ( moduleName : string ) : Promise < ReactPyModule > {
72+ return import ( `${ this . urls . jsModulesPath } ${ moduleName } ` ) ;
73+ }
4574}
0 commit comments