cbcore-ts 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.idea/misc.xml +6 -0
  2. package/.idea/modules.xml +8 -0
  3. package/.idea/uicore.iml +9 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/.jshintrc +4 -0
  6. package/LICENSE +21 -0
  7. package/README.md +5 -0
  8. package/compiledScripts/CBCore.d.ts +54 -0
  9. package/compiledScripts/CBCore.js +182 -0
  10. package/compiledScripts/CBCore.js.map +7 -0
  11. package/compiledScripts/CBDataInterfaces.d.ts +156 -0
  12. package/compiledScripts/CBDataInterfaces.js +35 -0
  13. package/compiledScripts/CBDataInterfaces.js.map +7 -0
  14. package/compiledScripts/CBLanguageService.d.ts +43 -0
  15. package/compiledScripts/CBLanguageService.js +167 -0
  16. package/compiledScripts/CBLanguageService.js.map +7 -0
  17. package/compiledScripts/CBServerClient.d.ts +10 -0
  18. package/compiledScripts/CBServerClient.js +88 -0
  19. package/compiledScripts/CBServerClient.js.map +7 -0
  20. package/compiledScripts/CBSocketCallbackHolder.d.ts +65 -0
  21. package/compiledScripts/CBSocketCallbackHolder.js +343 -0
  22. package/compiledScripts/CBSocketCallbackHolder.js.map +7 -0
  23. package/compiledScripts/CBSocketClient.d.ts +70 -0
  24. package/compiledScripts/CBSocketClient.js +371 -0
  25. package/compiledScripts/CBSocketClient.js.map +7 -0
  26. package/compiledScripts/index.d.ts +6 -0
  27. package/compiledScripts/index.js +23 -0
  28. package/compiledScripts/index.js.map +7 -0
  29. package/etsc.config.mjs +23 -0
  30. package/package.json +51 -0
  31. package/rollup.config.js +49 -0
  32. package/scripts/CBCore.ts +381 -0
  33. package/scripts/CBDataInterfaces.ts +336 -0
  34. package/scripts/CBLanguageService.ts +371 -0
  35. package/scripts/CBServerClient.ts +147 -0
  36. package/scripts/CBSocketCallbackHolder.ts +872 -0
  37. package/scripts/CBSocketClient.ts +748 -0
  38. package/scripts/index.ts +18 -0
  39. package/tsconfig.json +69 -0
@@ -0,0 +1,748 @@
1
+ import { io, Socket } from "socket.io-client"
2
+ import { FIRST_OR_NIL, IF, IS, IS_NIL, IS_NOT, MAKE_ID, nil, NO, RETURNER, UIObject, YES } from "../../uicore-ts"
3
+ import { CBCore } from "./CBCore"
4
+ import {
5
+ CBSocketHandshakeInitMessage,
6
+ CBSocketHandshakeResponseMessage,
7
+ CBSocketMessage,
8
+ CBSocketMessageCompletionFunction,
9
+ CBSocketMessageHandlerFunction,
10
+ CBSocketMessageSendResponseFunction,
11
+ CBSocketMultipleMessage,
12
+ CBSocketMultipleMessagecompletionFunction,
13
+ CBSocketMultipleMessageObject,
14
+ SocketClientInterface
15
+ } from "./CBDataInterfaces"
16
+ import { CBSocketCallbackHolder } from "./CBSocketCallbackHolder"
17
+
18
+
19
+ declare interface CBSocketClientMessageToBeSent {
20
+
21
+ key: string;
22
+ message: any;
23
+
24
+ inResponseToMessage: CBSocketMessage<any>;
25
+ keepWaitingForResponses: boolean;
26
+
27
+ isBoundToUserWithID: string;
28
+
29
+ completionPolicy: string;
30
+
31
+ didSendFunction?: () => void;
32
+
33
+ completion: CBSocketMessageCompletionFunction;
34
+
35
+ }
36
+
37
+
38
+ declare interface CBSocketClientErrorMessage {
39
+
40
+ _isCBSocketErrorMessage: boolean;
41
+
42
+ messageData: any;
43
+
44
+ }
45
+
46
+
47
+ type FilterConditionally<Source, Condition> = Pick<Source, { [K in keyof Source]: Source[K] extends Condition ? K : never }[keyof Source]>;
48
+
49
+
50
+ export function IS_SOCKET_ERROR(object: any): object is CBSocketClientErrorMessage {
51
+
52
+ const result = (IS(object) && object._isCBSocketErrorMessage)
53
+
54
+ return result
55
+
56
+ }
57
+
58
+ export function IS_NOT_SOCKET_ERROR(object: any) {
59
+
60
+ return !IS_SOCKET_ERROR(object)
61
+
62
+ }
63
+
64
+
65
+ export class CBSocketClient extends UIObject {
66
+
67
+ _socket: Socket = io()
68
+ _isConnectionEstablished = NO
69
+
70
+ _collectMessagesToSendLater = NO
71
+
72
+ _messagesToBeSent: CBSocketClientMessageToBeSent[] = []
73
+
74
+ static _sharedInstance: CBSocketClient
75
+
76
+ _core: CBCore
77
+
78
+ _subscribedKeys: {
79
+ [x: string]: boolean
80
+ } = {}
81
+
82
+ _callbackHolder = new CBSocketCallbackHolder(this)
83
+
84
+ static responseMessageKey = "CBSocketResponseMessage"
85
+ static multipleMessageKey = "CBSocketMultipleMessage"
86
+
87
+
88
+ static disconnectionMessage: CBSocketClientErrorMessage = {
89
+
90
+ _isCBSocketErrorMessage: YES,
91
+
92
+ messageData: "Server disconnected"
93
+
94
+ }
95
+
96
+
97
+ constructor(core: CBCore) {
98
+
99
+ super()
100
+
101
+ this._core = core
102
+
103
+
104
+ this.socket.on("connect", () => {
105
+
106
+ console.log("Socket.io connected to server. clientID = " + this.socket + ", socketID = " + this.socket)
107
+
108
+ var instanceIdentifier = localStorage.getItem("InstanceIdentifier")
109
+
110
+ if (IS_NOT(instanceIdentifier)) {
111
+
112
+ instanceIdentifier = MAKE_ID()
113
+ localStorage.setItem("InstanceIdentifier", instanceIdentifier)
114
+
115
+ }
116
+
117
+ const handshakeMessage: CBSocketHandshakeInitMessage = {
118
+
119
+ accessToken: null,
120
+ userID: this._core.userProfile._id,
121
+
122
+ inquiryAccessKey: null,
123
+
124
+ instanceIdentifier: instanceIdentifier
125
+
126
+ }
127
+
128
+ this.socket.emit("CBSocketHandshakeInitMessage", {
129
+
130
+ identifier: MAKE_ID(),
131
+ messageData: handshakeMessage
132
+
133
+ })
134
+
135
+
136
+ })
137
+
138
+
139
+ this.socket.on(
140
+ "CBSocketHandshakeResponseMessage",
141
+ (message: CBSocketMessage<CBSocketHandshakeResponseMessage>) => {
142
+
143
+
144
+ this._isConnectionEstablished = message.messageData.accepted
145
+
146
+ if (!message.messageData.accepted) {
147
+
148
+ console.log("SocketIO connection failed.")
149
+
150
+ this._core.dialogViewShowerClass.alert(
151
+ "Failed to establish connection to server.",
152
+ () => {
153
+ }
154
+ )
155
+
156
+ }
157
+ else {
158
+
159
+ console.log("SocketIO connection handshake completed.")
160
+
161
+ this._callbackHolder = new CBSocketCallbackHolder(this, this._callbackHolder)
162
+
163
+ core.userProfile = message.messageData.userProfile
164
+
165
+ this.sendUnsentMessages()
166
+
167
+ }
168
+
169
+
170
+ }
171
+ )
172
+
173
+
174
+ this.socket.on("disconnect", () => {
175
+
176
+ console.log("Socket.io disconnected from server. clientID = " + this.socket + ".")
177
+
178
+ this._isConnectionEstablished = NO
179
+
180
+ this._callbackHolder.isValid = NO
181
+
182
+ this._callbackHolder.triggerDisconnectHandlers()
183
+
184
+
185
+ })
186
+
187
+
188
+ this.socket.on("CBPerformReconnect", (message?: string) => {
189
+
190
+ console.log("Performing socket reconnection.")
191
+
192
+ core.reloadSocketConnection()
193
+
194
+ if (message) {
195
+
196
+ this._core.dialogViewShowerClass.alert(message)
197
+
198
+ }
199
+
200
+
201
+ })
202
+
203
+
204
+ this._socket.on(
205
+ CBSocketClient.responseMessageKey,
206
+ (message: CBSocketMessage<any>) => {
207
+
208
+ this.didReceiveMessageForKey(CBSocketClient.responseMessageKey, message)
209
+
210
+ }
211
+ )
212
+
213
+ this._socket.on(
214
+ CBSocketClient.multipleMessageKey,
215
+ (message: CBSocketMessage<CBSocketMultipleMessageObject[]>) => {
216
+
217
+ console.log("Received " + message.messageData.length + " messages.")
218
+ this.didReceiveMessageForKey(CBSocketClient.multipleMessageKey, message)
219
+
220
+ }
221
+ )
222
+
223
+
224
+ }
225
+
226
+
227
+ get socket() {
228
+ return this._socket
229
+ }
230
+
231
+
232
+ cancelUnsentMessages(messagesToCancel: CBSocketClientMessageToBeSent[]) {
233
+
234
+ this._messagesToBeSent = this._messagesToBeSent.filter((
235
+ messageObject: CBSocketClientMessageToBeSent,
236
+ index: number,
237
+ array: CBSocketClientMessageToBeSent[]
238
+ ) => !messagesToCancel.contains(messageObject))
239
+
240
+ }
241
+
242
+
243
+ sendUnsentMessages(receiveResponsesTogether = NO, completion?: CBSocketMultipleMessagecompletionFunction) {
244
+
245
+ if (!this._isConnectionEstablished || this._collectMessagesToSendLater) {
246
+
247
+ return
248
+
249
+ }
250
+
251
+ const groupedMessages: CBSocketMultipleMessageObject<any>[] = []
252
+ const didSendFunctions: (() => void)[] = []
253
+
254
+
255
+ this._messagesToBeSent.copy().forEach((messageToBeSentObject: CBSocketClientMessageToBeSent) => {
256
+
257
+ if (this._isConnectionEstablished) {
258
+
259
+ var message = messageToBeSentObject.message
260
+ if (IS_NOT(message)) {
261
+ message = ""
262
+ }
263
+
264
+ const identifier = MAKE_ID()
265
+
266
+ const completion = messageToBeSentObject.completion
267
+
268
+ const messageObject: CBSocketMessage<any> = {
269
+
270
+ messageData: message,
271
+ identifier: identifier,
272
+ keepWaitingForResponses: messageToBeSentObject.keepWaitingForResponses,
273
+ inResponseToIdentifier: messageToBeSentObject.inResponseToMessage.identifier
274
+
275
+ }
276
+
277
+ const shouldSendMessage = this._callbackHolder.socketShouldSendMessage(
278
+ messageToBeSentObject.key,
279
+ messageObject,
280
+ messageToBeSentObject.completionPolicy,
281
+ completion
282
+ )
283
+
284
+ if (shouldSendMessage) {
285
+
286
+
287
+ groupedMessages.push({
288
+
289
+ key: messageToBeSentObject.key,
290
+ message: messageObject
291
+
292
+ })
293
+
294
+
295
+ }
296
+
297
+ didSendFunctions.push(messageToBeSentObject.didSendFunction)
298
+
299
+
300
+ }
301
+
302
+ })
303
+
304
+
305
+ this._messagesToBeSent = []
306
+
307
+ if (IS_NOT(groupedMessages.length)) {
308
+
309
+ return
310
+
311
+ }
312
+
313
+ if (groupedMessages.length == 1) {
314
+
315
+ console.log("sending 1 unsent message.")
316
+
317
+ }
318
+ else {
319
+
320
+ console.log("Sending " + groupedMessages.length + " unsent messages.")
321
+
322
+ }
323
+
324
+
325
+ const messageObject: CBSocketMultipleMessage = {
326
+
327
+ messageData: groupedMessages,
328
+ identifier: MAKE_ID(),
329
+
330
+ shouldGroupResponses: receiveResponsesTogether
331
+
332
+ }
333
+
334
+ //if (receiveResponsesTogether) {
335
+
336
+ this._callbackHolder.socketWillSendMultipleMessage(messageObject, completion)
337
+
338
+ //}
339
+
340
+ this.socket.emit(CBSocketClient.multipleMessageKey, messageObject)
341
+
342
+
343
+ didSendFunctions.forEach((didSendFunction, index, array) => {
344
+ didSendFunction()
345
+ })
346
+
347
+ }
348
+
349
+
350
+ static completionPolicy = {
351
+
352
+ "all": "all",
353
+ "allDifferent": "allDifferent",
354
+ "first": "first",
355
+ "last": "last",
356
+ "firstAndLast": "firstAndLast",
357
+ "firstAndLastIfDifferent": "firstAndLastIfDifferent",
358
+ "directOnly": "directOnly",
359
+ "firstOnly": "firstOnly",
360
+ "storedOrFirst": "storedOrFirst"
361
+
362
+ }
363
+
364
+
365
+ sendUserBoundMessageForKeyWithPolicy(
366
+ key: keyof SocketClientInterface,
367
+ message: any,
368
+ completionPolicy: keyof typeof CBSocketClient.completionPolicy,
369
+ completion?: CBSocketMessageCompletionFunction
370
+ ) {
371
+
372
+
373
+ this._sendMessageForKey(key as string, message, undefined, NO, completionPolicy, YES, nil, completion)
374
+
375
+ }
376
+
377
+ sendUserBoundMessageForKey(
378
+ key: keyof SocketClientInterface,
379
+ message: any,
380
+ completion?: CBSocketMessageCompletionFunction
381
+ ) {
382
+
383
+ this._sendMessageForKey(key as string, message, undefined, NO, undefined, YES, nil, completion)
384
+
385
+ }
386
+
387
+ sendMessageForKeyWithPolicy(
388
+ key: keyof SocketClientInterface,
389
+ message: any,
390
+ completionPolicy: keyof typeof CBSocketClient.completionPolicy,
391
+ completion?: CBSocketMessageCompletionFunction
392
+ ) {
393
+
394
+
395
+ this._sendMessageForKey(key as string, message, undefined, NO, completionPolicy, NO, nil, completion)
396
+
397
+ }
398
+
399
+ sendMessageForKey(key: keyof SocketClientInterface, message: any, completion?: CBSocketMessageCompletionFunction) {
400
+
401
+ this._sendMessageForKey(key as string, message, undefined, NO, undefined, NO, nil, completion)
402
+
403
+ }
404
+
405
+
406
+ resultForMessageForKey(
407
+ key: keyof SocketClientInterface,
408
+ message: any,
409
+ completionPolicy?: keyof typeof CBSocketClient.completionPolicy,
410
+ isUserBound = NO
411
+ ) {
412
+
413
+ const result = new Promise<{
414
+
415
+ responseMessage: any,
416
+ result: any,
417
+ errorResult: any,
418
+
419
+ respondWithMessage: CBSocketMessageSendResponseFunction
420
+
421
+ }>((resolve, reject) => {
422
+
423
+ this._sendMessageForKey(
424
+ key as string,
425
+ message,
426
+ undefined,
427
+ NO,
428
+ completionPolicy,
429
+ isUserBound,
430
+ nil,
431
+ (responseMessage, respondWithMessage) => resolve({
432
+
433
+ responseMessage: responseMessage,
434
+ result: IF(IS_NOT_SOCKET_ERROR(responseMessage))(() => responseMessage).ELSE(RETURNER(undefined)),
435
+ errorResult: IF(IS_SOCKET_ERROR(responseMessage))(() => responseMessage).ELSE(RETURNER(undefined)),
436
+
437
+ respondWithMessage: respondWithMessage
438
+
439
+ })
440
+ )
441
+
442
+ })
443
+
444
+ return result
445
+
446
+ }
447
+
448
+
449
+ _sendMessageForKey(
450
+ key: string,
451
+ message: any,
452
+ inResponseToMessage: CBSocketMessage<any> = {} as any,
453
+ keepMessageConnectionOpen = NO,
454
+ completionPolicy = CBSocketClient.completionPolicy.directOnly,
455
+ isUserBound = NO,
456
+ didSendFunction: () => void = nil,
457
+ completion: CBSocketMessageCompletionFunction = nil
458
+ ) {
459
+
460
+ if (IS_NIL(message)) {
461
+
462
+ message = ""
463
+
464
+ }
465
+
466
+ if (this._isConnectionEstablished && !this._collectMessagesToSendLater) {
467
+
468
+ const identifier = MAKE_ID()
469
+
470
+ const messageObject: CBSocketMessage<any> = {
471
+
472
+ messageData: message,
473
+ identifier: identifier,
474
+ keepWaitingForResponses: keepMessageConnectionOpen,
475
+ inResponseToIdentifier: inResponseToMessage.identifier
476
+
477
+ }
478
+
479
+ const shouldSendMessage = this._callbackHolder.socketShouldSendMessage(
480
+ key,
481
+ messageObject,
482
+ completionPolicy,
483
+ completion
484
+ )
485
+
486
+ if (shouldSendMessage) {
487
+
488
+ this.socket.emit(key, messageObject)
489
+
490
+ }
491
+
492
+ didSendFunction()
493
+
494
+ }
495
+ else {
496
+
497
+ this._messagesToBeSent.push({
498
+
499
+ key: key,
500
+ message: message,
501
+ inResponseToMessage: inResponseToMessage,
502
+ keepWaitingForResponses: keepMessageConnectionOpen,
503
+ completionPolicy: completionPolicy,
504
+ isBoundToUserWithID: IF(isUserBound)(RETURNER(FIRST_OR_NIL(CBCore.sharedInstance.userProfile._id)))(),
505
+ didSendFunction: didSendFunction,
506
+ completion: completion
507
+
508
+ })
509
+
510
+ return this._messagesToBeSent.lastElement
511
+
512
+ }
513
+
514
+ }
515
+
516
+
517
+ sendMessagesAsGroup<FunctionReturnType extends object>(functionToCall: () => FunctionReturnType) {
518
+
519
+ const collectMessagesToSendLater = this._collectMessagesToSendLater
520
+
521
+ this._collectMessagesToSendLater = YES
522
+
523
+ var result = functionToCall()
524
+
525
+ this._collectMessagesToSendLater = collectMessagesToSendLater
526
+
527
+ this.sendUnsentMessages()
528
+
529
+ return result
530
+
531
+ }
532
+
533
+ sendAndReceiveMessagesAsGroup<FunctionReturnType extends object>(
534
+ functionToCall: () => FunctionReturnType,
535
+ completion?: CBSocketMultipleMessagecompletionFunction
536
+ ) {
537
+
538
+ const collectMessagesToSendLater = this._collectMessagesToSendLater
539
+
540
+ this._collectMessagesToSendLater = YES
541
+
542
+ var result = functionToCall()
543
+
544
+ this._collectMessagesToSendLater = collectMessagesToSendLater
545
+
546
+ this.sendUnsentMessages(YES, completion)
547
+
548
+ return result
549
+
550
+ }
551
+
552
+
553
+ didReceiveMessageForKey(key: string, message: CBSocketMessage<any>) {
554
+
555
+
556
+ const sendResponseFunction: CBSocketMessageSendResponseFunction = function (
557
+ this: CBSocketClient,
558
+ responseMessage: any,
559
+ completion: CBSocketMessageCompletionFunction
560
+ ) {
561
+
562
+ this._sendMessageForKey(
563
+ CBSocketClient.responseMessageKey,
564
+ responseMessage,
565
+ message,
566
+ NO,
567
+ undefined,
568
+ NO,
569
+ nil,
570
+ completion
571
+ )
572
+
573
+ }.bind(this) as any
574
+
575
+ sendResponseFunction.sendIntermediateResponse = function (
576
+ this: CBSocketClient,
577
+ updateMessage: any,
578
+ completion: CBSocketMessageCompletionFunction
579
+ ) {
580
+
581
+ this._sendMessageForKey(
582
+ CBSocketClient.responseMessageKey,
583
+ updateMessage,
584
+ message,
585
+ YES,
586
+ undefined,
587
+ NO,
588
+ nil,
589
+ completion
590
+ )
591
+
592
+ }.bind(this)
593
+
594
+ const sendUserBoundResponseFunction: CBSocketMessageSendResponseFunction = function (
595
+ this: CBSocketClient,
596
+ responseMessage: any,
597
+ completion: CBSocketMessageCompletionFunction
598
+ ) {
599
+
600
+ this._sendMessageForKey(
601
+ CBSocketClient.responseMessageKey,
602
+ responseMessage,
603
+ message,
604
+ NO,
605
+ undefined,
606
+ YES,
607
+ nil,
608
+ completion
609
+ )
610
+
611
+ }.bind(this) as any
612
+
613
+ sendUserBoundResponseFunction.sendIntermediateResponse = function (
614
+ this: CBSocketClient,
615
+ updateMessage: any,
616
+ completion: CBSocketMessageCompletionFunction
617
+ ) {
618
+
619
+ this._sendMessageForKey(
620
+ CBSocketClient.responseMessageKey,
621
+ updateMessage,
622
+ message,
623
+ YES,
624
+ undefined,
625
+ YES,
626
+ nil,
627
+ completion
628
+ )
629
+
630
+ }.bind(this)
631
+
632
+ if (IS_SOCKET_ERROR(message.messageData)) {
633
+
634
+ console.log("CBSocketClient did receive error message.")
635
+
636
+ console.log(message.messageData)
637
+
638
+
639
+ }
640
+
641
+
642
+ this._callbackHolder.socketDidReceiveMessageForKey(key, message, sendResponseFunction)
643
+
644
+ }
645
+
646
+
647
+ addTargetForMessagesForKeys(keys: string[], handlerFunction: CBSocketMessageHandlerFunction) {
648
+ keys.forEach(function (this: CBSocketClient, key: string, index: number, array: string[]) {
649
+ this.addTargetForMessagesForKey(key, handlerFunction)
650
+ }.bind(this))
651
+ }
652
+
653
+
654
+ addTargetForMessagesForKey(key: string, handlerFunction: CBSocketMessageHandlerFunction) {
655
+
656
+ this._callbackHolder.registerHandler(key, handlerFunction)
657
+
658
+ if (IS_NOT(this._subscribedKeys[key])) {
659
+
660
+ this._socket.on(key, function (this: CBSocketClient, message: CBSocketMessage<any>) {
661
+
662
+ this.didReceiveMessageForKey(key, message)
663
+
664
+ }.bind(this))
665
+
666
+ this._subscribedKeys[key] = true
667
+
668
+ }
669
+
670
+
671
+ }
672
+
673
+ addTargetForOneMessageForKey(key: string, handlerFunction: CBSocketMessageHandlerFunction) {
674
+
675
+ this._callbackHolder.registerOnetimeHandler(key, handlerFunction)
676
+
677
+ if (IS_NOT(this._subscribedKeys[key])) {
678
+
679
+ this._socket.on(key, function (this: CBSocketClient, message: CBSocketMessage<any>) {
680
+
681
+ this.didReceiveMessageForKey(key, message)
682
+
683
+ }.bind(this))
684
+
685
+ this._subscribedKeys[key] = true
686
+
687
+ }
688
+
689
+
690
+ }
691
+
692
+
693
+ }
694
+
695
+
696
+ export const SocketClient: SocketClientInterface = new Proxy({ "name": "SocketClient" }, {
697
+
698
+ get(target, key) {
699
+
700
+ const result = (
701
+ messageData,
702
+ completionPolicy,
703
+ isUserBound
704
+ ) => CBCore.sharedInstance.socketClient.resultForMessageForKey(
705
+ key as string,
706
+ messageData,
707
+ completionPolicy,
708
+ isUserBound
709
+ )
710
+
711
+
712
+ return result
713
+
714
+ }
715
+
716
+ }) as any
717
+
718
+
719
+
720
+
721
+
722
+
723
+
724
+
725
+
726
+
727
+
728
+
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+
739
+
740
+
741
+
742
+
743
+
744
+
745
+
746
+
747
+
748
+