1- import { FPCCMessage , FPCCMsgBase , FPCCPong , FPCCSendMessage , isFPCCPing , validateFPCCMessage } from "./protocol-fp-cloud-conn.js" ;
2- import { Logger } from "@adviser/cement" ;
1+ import {
2+ FPCCError ,
3+ FPCCEvtApp ,
4+ FPCCEvtConnectorReady ,
5+ FPCCEvtNeedsLogin ,
6+ FPCCMessage ,
7+ FPCCMsgBase ,
8+ FPCCPing ,
9+ FPCCPong ,
10+ FPCCReqRegisterLocalDbName ,
11+ FPCCReqWaitConnectorReady ,
12+ FPCCSendMessage ,
13+ isFPCCError ,
14+ isFPCCEvtApp ,
15+ isFPCCEvtConnectorReady ,
16+ isFPCCEvtNeedsLogin ,
17+ isFPCCPing ,
18+ isFPCCPong ,
19+ isFPCCReqRegisterLocalDbName ,
20+ isFPCCReqWaitConnectorReady ,
21+ validateFPCCMessage ,
22+ } from "./protocol-fp-cloud-conn.js" ;
23+ import { Logger , OnFunc } from "@adviser/cement" ;
324import { ensureLogger } from "@fireproof/core-runtime" ;
425import { SuperThis } from "@fireproof/core-types-base" ;
526
627export interface FPCCProtocol {
728 // handle must be this bound method
8- handleMessage : ( event : MessageEvent < unknown > ) => void ;
9- handleFPCCMessage ?: ( event : FPCCMessage , srcEvent : MessageEvent < unknown > ) => void ;
29+ hash : ( ) => string ;
30+
1031 sendMessage < T extends FPCCMsgBase > ( event : FPCCSendMessage < T > , srcEvent : MessageEvent < unknown > ) : void ;
1132 handleError : ( error : unknown ) => void ;
12- injectSend ( send : ( evt : FPCCMessage , srcEvent : MessageEvent < unknown > ) => FPCCMessage ) : void ;
33+ injectSend ( send : ( evt : FPCCMessage , srcEvent : MessageEvent < unknown > | string ) => FPCCMessage ) : void ;
1334 ready ( ) : Promise < FPCCProtocol > ;
1435 stop ( ) : void ;
1536}
1637
1738export class FPCCProtocolBase implements FPCCProtocol {
1839 protected readonly sthis : SuperThis ;
1940 protected readonly logger : Logger ;
20- readonly #fpccMessageHandlers: ( ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > ) => boolean | undefined ) [ ] = [ ] ;
2141 readonly onStartFns : ( ( ) => void ) [ ] = [ ] ;
22- #sendFn: ( ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > ) => FPCCMessage ) | undefined = undefined ;
42+ #sendFn: ( ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > | string ) => FPCCMessage ) | undefined = undefined ;
43+
44+ readonly onMessage = OnFunc < ( event : MessageEvent < unknown > ) => void > ( ) ;
45+ readonly onFPCCMessage = OnFunc < ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > ) => void > ( ) ;
46+
47+ readonly onFPCCEvtNeedsLogin = OnFunc < ( msg : FPCCEvtNeedsLogin , srcEvent : MessageEvent < unknown > ) => void > ( )
48+ readonly onFPCCError = OnFunc < ( msg : FPCCError , srcEvent : MessageEvent < unknown > ) => void > ( ) ;
49+ readonly onFPCCReqRegisterLocalDbName = OnFunc < ( msg : FPCCReqRegisterLocalDbName , srcEvent : MessageEvent < unknown > ) => void > ( )
50+ readonly onFPCCEvtApp = OnFunc < ( msg : FPCCEvtApp , srcEvent : MessageEvent < unknown > ) => void > ( )
51+ readonly onFPCCPing = OnFunc < ( msg : FPCCPing , srcEvent : MessageEvent < unknown > ) => void > ( ) ;
52+ readonly onFPCCPong = OnFunc < ( msg : FPCCPong , srcEvent : MessageEvent < unknown > ) => void > ( )
53+ readonly onFPCCEvtConnectorReady = OnFunc < ( msg : FPCCEvtConnectorReady , srcEvent : MessageEvent < unknown > ) => void > ( ) ;
54+ readonly onFPCCReqWaitConnectorReady = OnFunc < ( msg : FPCCReqWaitConnectorReady , srcEvent : MessageEvent < unknown > ) => void > ( ) ;
2355
2456 constructor ( sthis : SuperThis , logger ?: Logger ) {
2557 this . sthis = sthis ;
2658 this . logger = logger || ensureLogger ( sthis , "FPCCProtocolBase" ) ;
59+ this . onMessage ( event => {
60+ this . handleMessage ( event ) ;
61+ } ) ;
62+ this . onFPCCMessage ( ( msg , srcEvent ) => {
63+ this . #handleFPCCMessage( msg , srcEvent ) ;
64+ } )
65+ this . onFPCCPing ( ( msg , srcEvent ) => {
66+ this . sendMessage < FPCCPong > ( {
67+ src : msg . dst ,
68+ dst : msg . src ,
69+ pingTid : msg . tid ,
70+ type : "FPCCPong" ,
71+ } ,
72+ srcEvent ,
73+ ) ;
74+ } ) ;
75+ }
76+
77+ hash ( ) : string {
78+ throw new Error ( "should be implemented by subclass" ) ;
2779 }
2880
2981 handleMessage = ( event : MessageEvent < unknown > ) => {
@@ -34,55 +86,79 @@ export class FPCCProtocolBase implements FPCCProtocol {
3486 const fpCCmsg = validateFPCCMessage ( event . data ) ;
3587 // console.log("IframeFPCCProtocol handleMessage called", event.data, fpCCmsg.success);
3688 if ( fpCCmsg . success ) {
37- this . handleFPCCMessage ( fpCCmsg . data , event ) ;
89+ this . onFPCCMessage . invoke ( fpCCmsg . data , event ) ;
3890 } else {
3991 this . logger . Warn ( ) . Err ( fpCCmsg . error ) . Any ( "event" , event ) . Msg ( "Received non-FPCC message" ) ;
4092 }
4193 } ;
4294
43- onFPCCMessage ( callback : ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > ) => boolean | undefined ) : void {
44- this . #fpccMessageHandlers. push ( callback ) ;
45- }
46-
47- handleFPCCMessage = ( event : FPCCMessage , srcEvent : MessageEvent < unknown > ) => {
48- // allow handlers to process the message first and abort further processing
49- if ( this . #fpccMessageHandlers. map ( ( handler ) => handler ( event , srcEvent ) ) . some ( ( handled ) => handled ) ) {
50- return ;
51- }
95+ #handleFPCCMessage( event : FPCCMessage , srcEvent : MessageEvent < unknown > ) {
5296 this . logger . Debug ( ) . Any ( "event" , event ) . Msg ( "Handling FPCC message" ) ;
5397 switch ( true ) {
98+
99+ case isFPCCEvtNeedsLogin ( event ) : {
100+ this . onFPCCEvtNeedsLogin . invoke ( event , srcEvent ) ;
101+ break ;
102+ }
103+
104+ case isFPCCError ( event ) : {
105+ this . onFPCCError . invoke ( event , srcEvent ) ;
106+ break ;
107+ }
108+
109+ case isFPCCReqRegisterLocalDbName ( event ) : {
110+ this . onFPCCReqRegisterLocalDbName . invoke ( event , srcEvent ) ;
111+ break ;
112+ }
113+
114+ case isFPCCEvtApp ( event ) : {
115+ this . onFPCCEvtApp . invoke ( event , srcEvent ) ;
116+ break ;
117+ }
118+
54119 case isFPCCPing ( event ) : {
55- const pong : FPCCSendMessage < FPCCPong > = {
56- type : "FPCCPong" ,
57- dst : event . src ,
58- pingTid : event . tid ,
59- timestamp : Date . now ( ) ,
60- } ;
61- this . sendMessage < FPCCPong > ( pong , srcEvent ) ;
120+ this . onFPCCPing . invoke ( event , srcEvent ) ;
121+ break ;
122+ }
123+
124+ case isFPCCPong ( event ) : {
125+ this . onFPCCPong . invoke ( event , srcEvent ) ;
126+ break ;
127+ }
128+
129+ case isFPCCEvtConnectorReady ( event ) : {
130+ this . onFPCCEvtConnectorReady . invoke ( event , srcEvent ) ;
131+ break ;
132+ }
133+
134+ case isFPCCReqWaitConnectorReady ( event ) : {
135+ this . onFPCCReqWaitConnectorReady . invoke ( event , srcEvent ) ;
62136 break ;
63137 }
138+
64139 }
65- } ;
140+ }
66141
67142 handleError = ( _error : unknown ) => {
68143 throw new Error ( "Method not implemented." ) ;
69144 } ;
70145
71146 ready ( ) : Promise < FPCCProtocol > {
147+
72148 return Promise . resolve ( this ) ;
73149 }
74150
75- injectSend ( sendFn : ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > ) => FPCCMessage ) : void {
151+ injectSend ( sendFn : ( msg : FPCCMessage , srcEvent : MessageEvent < unknown > | string ) => FPCCMessage ) : void {
76152 this . #sendFn = sendFn ;
77153 }
78154
79155 stop ( ) : void {
80156 this . #sendFn = undefined ;
81- this . #fpccMessageHandlers . splice ( 0 , this . #fpccMessageHandlers . length ) ;
157+ this . onFPCCMessage . clear ( ) ;
82158 this . onStartFns . splice ( 0 , this . onStartFns . length ) ;
83159 }
84160
85- sendMessage < T extends FPCCMsgBase > ( msg : FPCCSendMessage < T > , srcEvent : MessageEvent < unknown > ) : T {
161+ sendMessage < T extends FPCCMsgBase > ( msg : FPCCSendMessage < T > , srcEvent : MessageEvent < unknown > | string ) : T {
86162 if ( ! this . #sendFn) {
87163 throw new Error ( "Protocol not started. Call start() before sending messages." ) ;
88164 }
0 commit comments