@genesislcap/foundation-comms 14.167.3-alpha-69ba23f.0 → 14.168.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. package/dist/dts/auth/auth.d.ts.map +1 -1
  2. package/dist/dts/connect/connect.d.ts +11 -1
  3. package/dist/dts/connect/connect.d.ts.map +1 -1
  4. package/dist/dts/connect/connect.events.d.ts +173 -0
  5. package/dist/dts/connect/connect.events.d.ts.map +1 -0
  6. package/dist/dts/connect/http.connect.d.ts +1 -0
  7. package/dist/dts/connect/http.connect.d.ts.map +1 -1
  8. package/dist/dts/connect/index.d.ts +2 -0
  9. package/dist/dts/connect/index.d.ts.map +1 -1
  10. package/dist/dts/connect/message.d.ts +51 -0
  11. package/dist/dts/connect/message.d.ts.map +1 -1
  12. package/dist/dts/connect/socket.d.ts +72 -8
  13. package/dist/dts/connect/socket.d.ts.map +1 -1
  14. package/dist/dts/connect/socket.status.d.ts +79 -0
  15. package/dist/dts/connect/socket.status.d.ts.map +1 -0
  16. package/dist/dts/datasource/datasource.d.ts +9 -0
  17. package/dist/dts/datasource/datasource.d.ts.map +1 -1
  18. package/dist/dts/fdc3/fdc3.d.ts +17 -1
  19. package/dist/dts/fdc3/fdc3.d.ts.map +1 -1
  20. package/dist/dts/index.d.ts +1 -0
  21. package/dist/dts/index.d.ts.map +1 -1
  22. package/dist/dts/networkMonitor/config.d.ts +56 -0
  23. package/dist/dts/networkMonitor/config.d.ts.map +1 -0
  24. package/dist/dts/networkMonitor/index.d.ts +4 -0
  25. package/dist/dts/networkMonitor/index.d.ts.map +1 -0
  26. package/dist/dts/networkMonitor/service.d.ts +193 -0
  27. package/dist/dts/networkMonitor/service.d.ts.map +1 -0
  28. package/dist/dts/networkMonitor/types.d.ts +133 -0
  29. package/dist/dts/networkMonitor/types.d.ts.map +1 -0
  30. package/dist/dts/testing/mocks/connect/connect.d.ts +1 -0
  31. package/dist/dts/testing/mocks/connect/connect.d.ts.map +1 -1
  32. package/dist/dts/testing/mocks/connect/socket.d.ts +5 -1
  33. package/dist/dts/testing/mocks/connect/socket.d.ts.map +1 -1
  34. package/dist/dts/testing/mocks/datasource/datasource.d.ts +1 -0
  35. package/dist/dts/testing/mocks/datasource/datasource.d.ts.map +1 -1
  36. package/dist/dts/user/user.d.ts +15 -0
  37. package/dist/dts/user/user.d.ts.map +1 -1
  38. package/dist/esm/auth/auth.js +5 -2
  39. package/dist/esm/connect/connect.events.js +113 -0
  40. package/dist/esm/connect/connect.js +30 -8
  41. package/dist/esm/connect/http.connect.js +6 -0
  42. package/dist/esm/connect/index.js +2 -0
  43. package/dist/esm/connect/message.js +25 -4
  44. package/dist/esm/connect/socket.js +113 -44
  45. package/dist/esm/connect/socket.status.js +119 -0
  46. package/dist/esm/datasource/datasource.js +18 -8
  47. package/dist/esm/fdc3/fdc3.js +4 -4
  48. package/dist/esm/index.js +1 -0
  49. package/dist/esm/networkMonitor/config.js +46 -0
  50. package/dist/esm/networkMonitor/index.js +3 -0
  51. package/dist/esm/networkMonitor/service.js +445 -0
  52. package/dist/esm/networkMonitor/types.js +5 -0
  53. package/dist/esm/testing/mocks/connect/connect.js +3 -0
  54. package/dist/esm/testing/mocks/connect/socket.js +1 -1
  55. package/dist/esm/testing/mocks/datasource/datasource.js +1 -0
  56. package/dist/esm/user/user.js +22 -1
  57. package/dist/foundation-comms.api.json +14711 -8166
  58. package/dist/foundation-comms.d.ts +841 -13
  59. package/docs/api/foundation-comms.commitevent.md +14 -0
  60. package/docs/api/foundation-comms.commiteventdetail.md +17 -0
  61. package/docs/api/foundation-comms.commiteventtype.md +12 -0
  62. package/docs/api/foundation-comms.connect.getmorecolumns.md +26 -0
  63. package/docs/api/foundation-comms.connect.md +1 -0
  64. package/docs/api/foundation-comms.connectevents.addcommitlistener.md +24 -0
  65. package/docs/api/foundation-comms.connectevents.addmetadatalistener.md +24 -0
  66. package/docs/api/foundation-comms.connectevents.addstreamlistener.md +25 -0
  67. package/docs/api/foundation-comms.connectevents.md +22 -0
  68. package/docs/api/foundation-comms.connecteventsemitter.md +24 -0
  69. package/docs/api/foundation-comms.connecteventsemitter.oncommitevent.md +25 -0
  70. package/docs/api/foundation-comms.connecteventsemitter.onmetadataevent.md +26 -0
  71. package/docs/api/foundation-comms.connecteventsemitter.onstreamcompleteevent.md +24 -0
  72. package/docs/api/foundation-comms.connecteventsemitter.onstreamevent.md +27 -0
  73. package/docs/api/foundation-comms.currentuser.md +2 -0
  74. package/docs/api/foundation-comms.currentuser.set.md +22 -0
  75. package/docs/api/foundation-comms.currentuser.unset.md +15 -0
  76. package/docs/api/foundation-comms.datasource.destroy.md +17 -0
  77. package/docs/api/foundation-comms.datasource.md +1 -0
  78. package/docs/api/foundation-comms.defaultconnect._constructor_.md +2 -1
  79. package/docs/api/foundation-comms.defaultconnect.getmorecolumns.md +22 -0
  80. package/docs/api/foundation-comms.defaultconnect.md +2 -1
  81. package/docs/api/foundation-comms.defaultconnectevents.addcommitlistener.md +24 -0
  82. package/docs/api/foundation-comms.defaultconnectevents.addmetadatalistener.md +24 -0
  83. package/docs/api/foundation-comms.defaultconnectevents.addstreamlistener.md +25 -0
  84. package/docs/api/foundation-comms.defaultconnectevents.md +27 -0
  85. package/docs/api/foundation-comms.defaultconnectevents.oncommitevent.md +25 -0
  86. package/docs/api/foundation-comms.defaultconnectevents.onmetadataevent.md +26 -0
  87. package/docs/api/foundation-comms.defaultconnectevents.onstreamcompleteevent.md +24 -0
  88. package/docs/api/foundation-comms.defaultconnectevents.onstreamevent.md +27 -0
  89. package/docs/api/foundation-comms.defaultdatasource.destroy.md +17 -0
  90. package/docs/api/foundation-comms.defaultdatasource.md +1 -0
  91. package/docs/api/foundation-comms.defaulthttpconnect.getmorecolumns.md +22 -0
  92. package/docs/api/foundation-comms.defaulthttpconnect.md +1 -0
  93. package/docs/api/foundation-comms.defaultmessagebuilder._constructor_.md +21 -0
  94. package/docs/api/foundation-comms.defaultmessagebuilder.createchangepasswordmessage.md +24 -0
  95. package/docs/api/foundation-comms.defaultmessagebuilder.createcommitmessage.md +23 -0
  96. package/docs/api/foundation-comms.defaultmessagebuilder.createdatalogoffmessage.md +22 -0
  97. package/docs/api/foundation-comms.defaultmessagebuilder.createdatalogonmessage.md +23 -0
  98. package/docs/api/foundation-comms.defaultmessagebuilder.createforgotpasswordmessage.md +24 -0
  99. package/docs/api/foundation-comms.defaultmessagebuilder.createforgotpasswordtokenmessage.md +25 -0
  100. package/docs/api/foundation-comms.defaultmessagebuilder.createhttpheadersfrommessage.md +23 -0
  101. package/docs/api/foundation-comms.defaultmessagebuilder.createloginmessage.md +22 -0
  102. package/docs/api/foundation-comms.defaultmessagebuilder.createlogoutmessage.md +22 -0
  103. package/docs/api/foundation-comms.defaultmessagebuilder.createmetarequestmessage.md +23 -0
  104. package/docs/api/foundation-comms.defaultmessagebuilder.createmorecolumnsmessage.md +22 -0
  105. package/docs/api/foundation-comms.defaultmessagebuilder.createmorerowsmessage.md +22 -0
  106. package/docs/api/foundation-comms.defaultmessagebuilder.createrefreshtokenmessage.md +15 -0
  107. package/docs/api/foundation-comms.defaultmessagebuilder.createrequestmessage.md +23 -0
  108. package/docs/api/foundation-comms.defaultmessagebuilder.createresourcesmessage.md +22 -0
  109. package/docs/api/foundation-comms.defaultmessagebuilder.md +41 -0
  110. package/docs/api/foundation-comms.defaultnetworkmonitor.addresource.md +23 -0
  111. package/docs/api/foundation-comms.defaultnetworkmonitor.create.md +16 -0
  112. package/docs/api/foundation-comms.defaultnetworkmonitor.destroy.md +16 -0
  113. package/docs/api/foundation-comms.defaultnetworkmonitor.md +31 -0
  114. package/docs/api/foundation-comms.defaultnetworkmonitor.removeresource.md +22 -0
  115. package/docs/api/foundation-comms.defaultnetworkmonitor.runallchecks.md +11 -0
  116. package/docs/api/foundation-comms.defaultnetworkmonitor.status.md +12 -0
  117. package/docs/api/foundation-comms.defaultnetworkmonitorconfig.md +13 -0
  118. package/docs/api/foundation-comms.defaultsocket._constructor_.md +24 -0
  119. package/docs/api/foundation-comms.defaultsocket.connect.md +24 -0
  120. package/docs/api/foundation-comms.defaultsocket.hasvalidsession.md +13 -0
  121. package/docs/api/foundation-comms.defaultsocket.isconfigured.md +11 -0
  122. package/docs/api/foundation-comms.defaultsocket.isconnected.md +11 -0
  123. package/docs/api/foundation-comms.defaultsocket.isconnectedsubject.md +11 -0
  124. package/docs/api/foundation-comms.defaultsocket.isconnecting.md +11 -0
  125. package/docs/api/foundation-comms.defaultsocket.isdisconnected.md +11 -0
  126. package/docs/api/foundation-comms.defaultsocket.isdisconnectedbyserver.md +11 -0
  127. package/docs/api/foundation-comms.defaultsocket.isreconnecting.md +11 -0
  128. package/docs/api/foundation-comms.defaultsocket.md +44 -0
  129. package/docs/api/foundation-comms.defaultsocket.reset.md +15 -0
  130. package/docs/api/foundation-comms.defaultsocket.send.md +23 -0
  131. package/docs/api/foundation-comms.defaultsocket.sendforstream.md +25 -0
  132. package/docs/api/foundation-comms.defaultsocket.socketmessages.md +11 -0
  133. package/docs/api/foundation-comms.defaultsocketstatus.closedclean.md +11 -0
  134. package/docs/api/foundation-comms.defaultsocketstatus.closedcode.md +11 -0
  135. package/docs/api/foundation-comms.defaultsocketstatus.closedreason.md +11 -0
  136. package/docs/api/foundation-comms.defaultsocketstatus.hasvalidsession.md +11 -0
  137. package/docs/api/foundation-comms.defaultsocketstatus.isconfigured.md +11 -0
  138. package/docs/api/foundation-comms.defaultsocketstatus.isconnected.md +11 -0
  139. package/docs/api/foundation-comms.defaultsocketstatus.isconnectedchanged.md +15 -0
  140. package/docs/api/foundation-comms.defaultsocketstatus.isconnectedsubject.md +11 -0
  141. package/docs/api/foundation-comms.defaultsocketstatus.isconnecting.md +11 -0
  142. package/docs/api/foundation-comms.defaultsocketstatus.isdisconnected.md +11 -0
  143. package/docs/api/foundation-comms.defaultsocketstatus.isdisconnectedbyserver.md +11 -0
  144. package/docs/api/foundation-comms.defaultsocketstatus.isreconnecting.md +11 -0
  145. package/docs/api/foundation-comms.defaultsocketstatus.isreconnectingchanged.md +15 -0
  146. package/docs/api/foundation-comms.defaultsocketstatus.md +42 -0
  147. package/docs/api/foundation-comms.defaultsocketstatus.onclose.md +22 -0
  148. package/docs/api/foundation-comms.defaultsocketstatus.reconnectionlimitreached.md +11 -0
  149. package/docs/api/foundation-comms.defaultsocketstatus.resetclosedstate.md +15 -0
  150. package/docs/api/foundation-comms.defaultsocketstatus.serialize.md +15 -0
  151. package/docs/api/foundation-comms.genesisconnectevents.md +18 -0
  152. package/docs/api/foundation-comms.getnetworkmonitor.md +30 -0
  153. package/docs/api/foundation-comms.getsocket.md +30 -0
  154. package/docs/api/foundation-comms.getsocketstatus.md +30 -0
  155. package/docs/api/foundation-comms.md +39 -0
  156. package/docs/api/foundation-comms.messagebuilder.createmorecolumnsmessage.md +30 -0
  157. package/docs/api/foundation-comms.messagebuilder.md +1 -0
  158. package/docs/api/foundation-comms.messagehaserrorcode.md +13 -0
  159. package/docs/api/foundation-comms.messagetype.md +2 -0
  160. package/docs/api/foundation-comms.metadataevent.md +14 -0
  161. package/docs/api/foundation-comms.metadataeventdetail.md +18 -0
  162. package/docs/api/foundation-comms.metadataeventtype.md +12 -0
  163. package/docs/api/foundation-comms.monitoredresource.md +15 -0
  164. package/docs/api/foundation-comms.monitoredresourcechecks.md +15 -0
  165. package/docs/api/foundation-comms.monitoredresourcechecksresult.isconnected.md +11 -0
  166. package/docs/api/foundation-comms.monitoredresourcechecksresult.lastmessage.md +11 -0
  167. package/docs/api/foundation-comms.monitoredresourcechecksresult.lastupdated.md +11 -0
  168. package/docs/api/foundation-comms.monitoredresourcechecksresult.md +23 -0
  169. package/docs/api/foundation-comms.monitoredresourcechecksresult.timeout.md +11 -0
  170. package/docs/api/foundation-comms.monitoredresourcedatalogon.md +15 -0
  171. package/docs/api/foundation-comms.monitoredresourcemetadata.md +15 -0
  172. package/docs/api/foundation-comms.networklogger.md +12 -0
  173. package/docs/api/foundation-comms.networkmonitor.addresource.md +23 -0
  174. package/docs/api/foundation-comms.networkmonitor.create.md +15 -0
  175. package/docs/api/foundation-comms.networkmonitor.destroy.md +15 -0
  176. package/docs/api/foundation-comms.networkmonitor.md +34 -0
  177. package/docs/api/foundation-comms.networkmonitor.removeresource.md +22 -0
  178. package/docs/api/foundation-comms.networkmonitor.runallchecks.md +23 -0
  179. package/docs/api/foundation-comms.networkmonitor.status.md +11 -0
  180. package/docs/api/foundation-comms.networkmonitorconfig.checkinterval.md +13 -0
  181. package/docs/api/foundation-comms.networkmonitorconfig.checktimeout.md +13 -0
  182. package/docs/api/foundation-comms.networkmonitorconfig.documentevents.md +13 -0
  183. package/docs/api/foundation-comms.networkmonitorconfig.eventemitter.md +13 -0
  184. package/docs/api/foundation-comms.networkmonitorconfig.genesisconnectevents.md +13 -0
  185. package/docs/api/foundation-comms.networkmonitorconfig.md +27 -0
  186. package/docs/api/foundation-comms.networkmonitorconfig.resourcechecks.md +13 -0
  187. package/docs/api/foundation-comms.networkmonitorconfig.resourcedatalogon.md +18 -0
  188. package/docs/api/foundation-comms.networkmonitorconfig.windowevents.md +13 -0
  189. package/docs/api/foundation-comms.resourcehealth.md +19 -0
  190. package/docs/api/foundation-comms.serializedsocketstatus.closedclean.md +11 -0
  191. package/docs/api/foundation-comms.serializedsocketstatus.closedcode.md +11 -0
  192. package/docs/api/foundation-comms.serializedsocketstatus.closedreason.md +11 -0
  193. package/docs/api/foundation-comms.serializedsocketstatus.hasvalidsession.md +11 -0
  194. package/docs/api/foundation-comms.serializedsocketstatus.isconfigured.md +13 -0
  195. package/docs/api/foundation-comms.serializedsocketstatus.isconnected.md +11 -0
  196. package/docs/api/foundation-comms.serializedsocketstatus.isconnecting.md +11 -0
  197. package/docs/api/foundation-comms.serializedsocketstatus.isdisconnected.md +11 -0
  198. package/docs/api/foundation-comms.serializedsocketstatus.isdisconnectedbyserver.md +11 -0
  199. package/docs/api/foundation-comms.serializedsocketstatus.isreconnecting.md +11 -0
  200. package/docs/api/foundation-comms.serializedsocketstatus.md +30 -0
  201. package/docs/api/foundation-comms.serializedsocketstatus.reconnectionlimitreached.md +11 -0
  202. package/docs/api/foundation-comms.socket.md +3 -11
  203. package/docs/api/foundation-comms.socket.sendforstream.md +2 -1
  204. package/docs/api/{foundation-comms.socket.isconnectedsubject.md → foundation-comms.socketstatus.isconnectedsubject.md} +2 -2
  205. package/docs/api/foundation-comms.socketstatus.md +28 -0
  206. package/docs/api/foundation-comms.socketstatus.onclose.md +22 -0
  207. package/docs/api/foundation-comms.socketstatus.serialize.md +15 -0
  208. package/docs/api/foundation-comms.streamcompleteevent.md +14 -0
  209. package/docs/api/foundation-comms.streamcompleteeventtype.md +12 -0
  210. package/docs/api/foundation-comms.streamevent.md +14 -0
  211. package/docs/api/foundation-comms.streameventdetail.md +19 -0
  212. package/docs/api/foundation-comms.streameventfunctions.md +19 -0
  213. package/docs/api/foundation-comms.streameventtype.md +12 -0
  214. package/docs/api/foundation-comms.systemhealthchanged.md +13 -0
  215. package/docs/api/foundation-comms.systemhealthchangedevent.md +15 -0
  216. package/docs/api/foundation-comms.systemhealthstatus.md +29 -0
  217. package/docs/api/foundation-comms.user.md +2 -0
  218. package/docs/api/foundation-comms.user.set.md +22 -0
  219. package/docs/api/foundation-comms.user.unset.md +15 -0
  220. package/docs/api-report.md +520 -16
  221. package/package.json +13 -11
  222. package/docs/api/foundation-comms.socket.hasvalidsession.md +0 -11
  223. package/docs/api/foundation-comms.socket.isconnected.md +0 -11
  224. package/docs/api/foundation-comms.socket.isreconnecting.md +0 -11
@@ -0,0 +1,113 @@
1
+ import { createObserver } from '@genesislcap/foundation-utils';
2
+ import { DI } from '@microsoft/fast-foundation';
3
+ /**
4
+ * @public
5
+ */
6
+ export const CommitEventType = 'connect-commit-event';
7
+ /**
8
+ * @public
9
+ */
10
+ export const StreamEventType = 'connect-stream-event';
11
+ /**
12
+ * @public
13
+ */
14
+ export const StreamCompleteEventType = 'connect-stream-complete-event';
15
+ /**
16
+ * @public
17
+ */
18
+ export const MetadataEventType = 'connect-metadata-event';
19
+ /**
20
+ * Default ConnectEvents implementation.
21
+ * @public
22
+ */
23
+ export class DefaultConnectEvents {
24
+ constructor() {
25
+ /** @internal */
26
+ this.streamListeners = createObserver();
27
+ /** @internal */
28
+ this.streamCompleteListeners = createObserver();
29
+ /** @internal */
30
+ this.commitListeners = createObserver();
31
+ /** @internal */
32
+ this.metadataListeners = createObserver();
33
+ }
34
+ /** {@inheritDoc ConnectEvents.addStreamListener} */
35
+ addStreamListener(listener, complete) {
36
+ var _a, _b;
37
+ const unsubscribe = (_a = this.streamListeners) === null || _a === void 0 ? void 0 : _a.subscribe(listener);
38
+ const completeUnsubscribe = (_b = this.streamCompleteListeners) === null || _b === void 0 ? void 0 : _b.subscribe(complete);
39
+ return () => {
40
+ unsubscribe();
41
+ completeUnsubscribe();
42
+ };
43
+ }
44
+ /** {@inheritDoc ConnectEventsEmitter.onStreamEvent} */
45
+ onStreamEvent(resourceName, message, stream, functions) {
46
+ var _a;
47
+ (_a = this.streamListeners) === null || _a === void 0 ? void 0 : _a.publish(new CustomEvent(StreamEventType, {
48
+ detail: {
49
+ functions,
50
+ message,
51
+ resourceName,
52
+ stream,
53
+ },
54
+ }));
55
+ }
56
+ /** {@inheritDoc ConnectEventsEmitter.onStreamCompleteEvent} */
57
+ onStreamCompleteEvent(stream) {
58
+ var _a;
59
+ (_a = this.streamCompleteListeners) === null || _a === void 0 ? void 0 : _a.publish(new CustomEvent(StreamCompleteEventType, {
60
+ detail: stream,
61
+ }));
62
+ }
63
+ /** {@inheritDoc ConnectEvents.addCommitListener} */
64
+ addCommitListener(listener) {
65
+ var _a;
66
+ return (_a = this.commitListeners) === null || _a === void 0 ? void 0 : _a.subscribe(listener);
67
+ }
68
+ /** {@inheritDoc ConnectEventsEmitter.onStreamEvent} */
69
+ onCommitEvent(eventName, message) {
70
+ var _a;
71
+ (_a = this.commitListeners) === null || _a === void 0 ? void 0 : _a.publish(new CustomEvent(CommitEventType, {
72
+ detail: {
73
+ eventName,
74
+ message,
75
+ },
76
+ }));
77
+ }
78
+ /** {@inheritDoc ConnectEvents.addMetadataListener} */
79
+ addMetadataListener(listener) {
80
+ var _a;
81
+ return (_a = this.metadataListeners) === null || _a === void 0 ? void 0 : _a.subscribe(listener);
82
+ }
83
+ /** {@inheritDoc ConnectEventsEmitter.onMetadataEvent} */
84
+ onMetadataEvent(resourceName, message, error) {
85
+ var _a;
86
+ (_a = this.metadataListeners) === null || _a === void 0 ? void 0 : _a.publish(new CustomEvent(MetadataEventType, {
87
+ detail: {
88
+ resourceName,
89
+ message,
90
+ error,
91
+ },
92
+ }));
93
+ }
94
+ }
95
+ /**
96
+ * ConnectEvents DI key.
97
+ *
98
+ * @privateRemarks
99
+ * Marked as internal to stop api-extractor becoming confused cross-linking tokens with the same name.
100
+ *
101
+ * @internal
102
+ */
103
+ export const ConnectEvents = DI.createInterface((x) => x.singleton(DefaultConnectEvents));
104
+ /**
105
+ * ConnectEventsEmitter DI key.
106
+ *
107
+ * @privateRemarks
108
+ * ConnectEventsEmitter is used by Connect.
109
+ * Marked as internal to stop api-extractor becoming confused cross-linking tokens with the same name.
110
+ *
111
+ * @internal
112
+ */
113
+ export const ConnectEventsEmitter = DI.createInterface((x) => x.aliasTo(ConnectEvents));
@@ -4,6 +4,7 @@ import { observable, volatile } from '@microsoft/fast-element';
4
4
  import { DI, optional } from '@microsoft/fast-foundation';
5
5
  import { MetaCache } from '../metadata';
6
6
  import { isWebSocketExpression, logger } from '../utils';
7
+ import { ConnectEventsEmitter } from './connect.events';
7
8
  import { ConnectConfig } from './connect.types';
8
9
  import { HttpConnect } from './http.connect';
9
10
  import { EventMessageType, MessageBuilder } from './message';
@@ -41,10 +42,11 @@ let DefaultConnect = class DefaultConnect {
41
42
  var _a;
42
43
  return (_a = this.socket.isConnectedSubject) === null || _a === void 0 ? void 0 : _a.asObservable();
43
44
  }
44
- constructor(socket, messageBuilder, metaCache, config = defaultConnectConfig) {
45
+ constructor(socket, messageBuilder, metaCache, events, config = defaultConnectConfig) {
45
46
  this.socket = socket;
46
47
  this.messageBuilder = messageBuilder;
47
48
  this.metaCache = metaCache;
49
+ this.events = events;
48
50
  this.config = config;
49
51
  this.isWorking = false;
50
52
  }
@@ -79,9 +81,16 @@ let DefaultConnect = class DefaultConnect {
79
81
  });
80
82
  }
81
83
  stream(resourceName, onMessage, onError, params) {
82
- const streamMessage = this.messageBuilder.createDataLogonMessage(resourceName, params);
83
- logger.debug(`${streamMessage.MESSAGE_TYPE} (stream) message created -> `, streamMessage);
84
- return this.socket.sendForStream(streamMessage, onMessage, onError);
84
+ const msg = this.messageBuilder.createDataLogonMessage(resourceName, params);
85
+ logger.debug(`${msg.MESSAGE_TYPE} (stream) message created -> `, msg);
86
+ const resource = this.socket.sendForStream(msg, onMessage, onError, () => {
87
+ this.events.onStreamCompleteEvent(resource);
88
+ });
89
+ this.events.onStreamEvent(resourceName, msg, resource, {
90
+ onMessage,
91
+ onError,
92
+ });
93
+ return resource;
85
94
  }
86
95
  getMoreRows(sourceRef) {
87
96
  return __awaiter(this, void 0, void 0, function* () {
@@ -90,6 +99,12 @@ let DefaultConnect = class DefaultConnect {
90
99
  return this.socket.send(moreRowsMessage, false);
91
100
  });
92
101
  }
102
+ getMoreColumns(sourceRef) {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ const message = this.messageBuilder.createMoreColumnsMessage(sourceRef);
105
+ return this.socket.send(message);
106
+ });
107
+ }
93
108
  dataLogoff(streamSourceRef) {
94
109
  return __awaiter(this, void 0, void 0, function* () {
95
110
  const dataLogoffMessage = this.messageBuilder.createDataLogoffMessage(streamSourceRef);
@@ -109,6 +124,7 @@ let DefaultConnect = class DefaultConnect {
109
124
  const metaRequestMessage = this.messageBuilder.createMetaRequestMessage(resourceName);
110
125
  logger.debug(`${metaRequestMessage.MESSAGE_TYPE} (metadata) message created -> `, metaRequestMessage);
111
126
  let details;
127
+ let error;
112
128
  try {
113
129
  this.isWorking = true;
114
130
  const metaResponse = yield this.socket.send(metaRequestMessage);
@@ -118,9 +134,12 @@ let DefaultConnect = class DefaultConnect {
118
134
  }
119
135
  }
120
136
  catch (e) {
137
+ error = e;
121
138
  logger.error(e);
139
+ throw error;
122
140
  }
123
141
  finally {
142
+ this.events.onMetadataEvent(resourceName, metaRequestMessage, error);
124
143
  this.isWorking = false;
125
144
  }
126
145
  return details;
@@ -166,9 +185,11 @@ let DefaultConnect = class DefaultConnect {
166
185
  }
167
186
  commitEvent(eventName, params) {
168
187
  return __awaiter(this, void 0, void 0, function* () {
169
- const commitMessage = this.messageBuilder.createCommitMessage(eventName, params);
170
- logger.debug(`${commitMessage.MESSAGE_TYPE} (commit) message created -> `, commitMessage);
171
- return this.socket.send(commitMessage);
188
+ const msg = this.messageBuilder.createCommitMessage(eventName, params);
189
+ logger.debug(`${msg.MESSAGE_TYPE} (commit) message created -> `, msg);
190
+ const promise = this.socket.send(msg);
191
+ this.events.onCommitEvent(eventName, msg);
192
+ return promise;
172
193
  });
173
194
  }
174
195
  };
@@ -182,7 +203,8 @@ DefaultConnect = __decorate([
182
203
  __param(0, Socket),
183
204
  __param(1, MessageBuilder),
184
205
  __param(2, MetaCache),
185
- __param(3, optional(ConnectConfig))
206
+ __param(3, ConnectEventsEmitter),
207
+ __param(4, optional(ConnectConfig))
186
208
  ], DefaultConnect);
187
209
  export { DefaultConnect };
188
210
  const useHttpConnect = FORCE_HTTP === 'true' || false;
@@ -162,6 +162,12 @@ let DefaultHttpConnect = class DefaultHttpConnect {
162
162
  return this.send(moreRowsMessage);
163
163
  });
164
164
  }
165
+ getMoreColumns(sourceRef) {
166
+ return __awaiter(this, void 0, void 0, function* () {
167
+ const message = this.messageBuilder.createMoreColumnsMessage(sourceRef);
168
+ return this.send(message);
169
+ });
170
+ }
165
171
  dataLogoff(streamSourceRef) {
166
172
  return __awaiter(this, void 0, void 0, function* () {
167
173
  const dataLogoffMessage = this.messageBuilder.createDataLogoffMessage(streamSourceRef);
@@ -1,8 +1,10 @@
1
+ export * from './connect.events';
1
2
  export * from './connect';
2
3
  export * from './connect.types';
3
4
  export * from './http.connect';
4
5
  export * from './http';
5
6
  export * from './message';
6
7
  export * from './serializers';
8
+ export * from './socket.status';
7
9
  export * from './socket';
8
10
  export * from './reconnectStrategy';
@@ -16,6 +16,8 @@ export var MessageType;
16
16
  MessageType["HEARTBEAT_PING"] = "HEARTBEAT_PING";
17
17
  MessageType["HEARTBEAT_PONG"] = "HEARTBEAT_PONG";
18
18
  MessageType["MORE_ROWS"] = "MORE_ROWS";
19
+ MessageType["MORE_COLUMNS"] = "MORE_COLUMNS";
20
+ MessageType["MORE_COLUMNS_ACK"] = "MORE_COLUMNS_ACK";
19
21
  MessageType["MSG_ACK"] = "MSG_ACK";
20
22
  MessageType["MSG_NACK"] = "MSG_NACK";
21
23
  MessageType["LOGOUT_ACK"] = "LOGOUT_ACK";
@@ -62,10 +64,25 @@ export const messageOrThrow = (message) => {
62
64
  }
63
65
  return message;
64
66
  };
67
+ /**
68
+ * Check if the message contains an error code.
69
+ * @param message - The message object.
70
+ * @param code - The error code.
71
+ * @public
72
+ */
73
+ export const messageHasErrorCode = (message, code) => {
74
+ return Array.isArray(message === null || message === void 0 ? void 0 : message.ERROR)
75
+ ? message === null || message === void 0 ? void 0 : message.ERROR.some((error) => error.CODE === code)
76
+ : false;
77
+ };
65
78
  /**
66
79
  * TODO: Abstract out localStorage interaction with shell io stuff
67
80
  */
68
- let MessageBuilderService = class MessageBuilderService {
81
+ /**
82
+ * Default MessageBuilder implementation.
83
+ * @public
84
+ */
85
+ let DefaultMessageBuilder = class DefaultMessageBuilder {
69
86
  /**
70
87
  * UUID will be created in the DI with the App specific requirements.
71
88
  * Keeping it encapsulated means messages will always conform.
@@ -207,6 +224,9 @@ let MessageBuilderService = class MessageBuilderService {
207
224
  SESSION_AUTH_TOKEN: this.session.getSessionStorageItem('authToken'),
208
225
  };
209
226
  }
227
+ createMoreColumnsMessage(sourceRef) {
228
+ return Object.assign(Object.assign({}, this.createMoreRowsMessage(sourceRef)), { MESSAGE_TYPE: MessageType.MORE_COLUMNS });
229
+ }
210
230
  createHTTPHeadersFromMessage(message, contentType = 'application/json; charset=UTF-8') {
211
231
  const headers = { 'Content-type': contentType };
212
232
  if (message.SOURCE_REF) {
@@ -222,12 +242,13 @@ let MessageBuilderService = class MessageBuilderService {
222
242
  return headers;
223
243
  }
224
244
  };
225
- MessageBuilderService = __decorate([
245
+ DefaultMessageBuilder = __decorate([
226
246
  __param(0, Session),
227
247
  __param(1, UUID)
228
- ], MessageBuilderService);
248
+ ], DefaultMessageBuilder);
249
+ export { DefaultMessageBuilder };
229
250
  /**
230
251
  * The DI token for the MessageBUilder interface.
231
252
  * @internal
232
253
  */
233
- export const MessageBuilder = DI.createInterface((x) => x.singleton(MessageBuilderService));
254
+ export const MessageBuilder = DI.createInterface((x) => x.singleton(DefaultMessageBuilder));
@@ -3,13 +3,14 @@ import { UUID } from '@genesislcap/foundation-utils';
3
3
  import { JSONSerializer } from '@genesislcap/foundation-utils';
4
4
  import { observable } from '@microsoft/fast-element';
5
5
  import { DI } from '@microsoft/fast-foundation';
6
- import { BehaviorSubject, from, Observable, of, Subject, Subscription, throwError, } from 'rxjs';
6
+ import { Observable, of, Subject, Subscription, takeUntil, throwError } from 'rxjs';
7
7
  import { filter, mergeMap, switchMap, takeWhile } from 'rxjs/operators';
8
8
  import { WebSocketSubject } from 'rxjs/webSocket';
9
9
  import { Session } from '../session';
10
10
  import { logger } from '../utils';
11
11
  import { EventMessageType, MessageBuilder, MessageType } from './message';
12
12
  import { exponentialScheduler, linearScheduler, MAX_RECONNECT_ATTEMPTS, retryInterval, SocketReconnectStrategy, } from './reconnectStrategy';
13
+ import { SocketStatus } from './socket.status';
13
14
  import { Ticker } from './ticker';
14
15
  /**
15
16
  * Subject that wraps a WebSocketSubject and provides a Subject interface for sending and receiving messages.
@@ -76,23 +77,48 @@ export class SocketMessageHandler {
76
77
  return this._isSubscription;
77
78
  }
78
79
  }
79
- let SocketService = class SocketService {
80
- isConnectedChanged(_, isConnected) {
81
- this.isConnectedSubject.next(isConnected);
80
+ /**
81
+ * Default Socket implementation.
82
+ * @public
83
+ */
84
+ let DefaultSocket = class DefaultSocket {
85
+ get isConfigured() {
86
+ return this.status.isConfigured;
87
+ }
88
+ get isConnecting() {
89
+ return this.status.isConnecting;
90
+ }
91
+ get isConnected() {
92
+ return this.status.isConnected;
93
+ }
94
+ get isConnectedSubject() {
95
+ return this.status.isConnectedSubject;
96
+ }
97
+ get isDisconnected() {
98
+ return this.status.isDisconnected;
99
+ }
100
+ get isDisconnectedByServer() {
101
+ return this.status.isDisconnectedByServer;
102
+ }
103
+ get isReconnecting() {
104
+ return this.status.isReconnecting;
82
105
  }
83
- constructor(messageBuilder, session, serializer, uuid) {
106
+ get hasValidSession() {
107
+ return this.status.hasValidSession;
108
+ }
109
+ set hasValidSession(value) {
110
+ this.status.hasValidSession = value;
111
+ }
112
+ constructor(messageBuilder, session, serializer, uuid, status) {
84
113
  this.messageBuilder = messageBuilder;
85
114
  this.session = session;
86
115
  this.serializer = serializer;
87
116
  this.uuid = uuid;
117
+ this.status = status;
88
118
  this.defaultInterval = 10000;
89
119
  this.secondsMultiplier = 1000;
90
- this.isConnectedSubject = new BehaviorSubject(false);
91
- this.isConnected = false;
92
- this.hasValidSession = false;
93
120
  this.heartbeatIsEnabled = true;
94
121
  this.heartbeatInterval = this.defaultInterval;
95
- this.isReconnecting = false;
96
122
  this.socketMessages = () => this.wsMessages;
97
123
  }
98
124
  get heartbeatLoggingIsEnabled() {
@@ -110,6 +136,7 @@ let SocketService = class SocketService {
110
136
  return new Promise((resolve) => {
111
137
  var _a, _b, _c, _d;
112
138
  logger.info(`${this.isReconnecting ? 'Reconnecting' : 'Connecting'} to ${this.url}`);
139
+ this.status.isConnecting = !this.isReconnecting;
113
140
  const cleanMessages = !this.isReconnecting || !((_a = this.reconnectOptions) === null || _a === void 0 ? void 0 : _a.reconnectStreams);
114
141
  if (cleanMessages) {
115
142
  this.cleanMessages();
@@ -120,7 +147,7 @@ let SocketService = class SocketService {
120
147
  openObserver: {
121
148
  next: () => {
122
149
  this.session.setSessionStorageItem('hostUrl', this.url);
123
- this.isConnected = true;
150
+ this.status.isConnected = true;
124
151
  this.prepareHeartbeat();
125
152
  logger.info(`WebSocket connection is now open`);
126
153
  resolve(this.isConnected);
@@ -128,9 +155,8 @@ let SocketService = class SocketService {
128
155
  },
129
156
  closeObserver: {
130
157
  next: (closeEvent) => {
131
- this.disconnectedByServer = !closeEvent.wasClean;
132
- this.isConnected = false;
133
- if (this.disconnectedByServer) {
158
+ this.status.onClose(closeEvent);
159
+ if (this.isDisconnectedByServer) {
134
160
  logger.info(`WebSocket connection was closed due an error - Code: ${closeEvent.code} ${closeEvent.reason ? ' | Reason: ' + closeEvent.reason : ''}`);
135
161
  }
136
162
  resolve(this.isConnected);
@@ -196,8 +222,7 @@ let SocketService = class SocketService {
196
222
  }
197
223
  case MessageType.QUERY_UPDATE: {
198
224
  if (!messageHandler.isSubscription) {
199
- const dataLogoffMessage = this.messageBuilder.createDataLogoffMessage(SOURCE_REF);
200
- this.send(dataLogoffMessage);
225
+ this.sendDataLogoff(SOURCE_REF);
201
226
  }
202
227
  break;
203
228
  }
@@ -227,7 +252,7 @@ let SocketService = class SocketService {
227
252
  };
228
253
  const onComplete = () => {
229
254
  var _a;
230
- if (this.disconnectedByServer && ((_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.alwaysOn)) {
255
+ if (this.isDisconnectedByServer && ((_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.alwaysOn)) {
231
256
  this.reconnect();
232
257
  return;
233
258
  }
@@ -238,6 +263,7 @@ let SocketService = class SocketService {
238
263
  error: onError,
239
264
  complete: onComplete,
240
265
  });
266
+ this.status.isConfigured = true;
241
267
  });
242
268
  }
243
269
  prepareHeartbeat() {
@@ -275,7 +301,7 @@ let SocketService = class SocketService {
275
301
  if (this.isReconnecting || notAlwaysOnAndHeartbeating) {
276
302
  return;
277
303
  }
278
- this.isReconnecting = true;
304
+ this.status.isReconnecting = true;
279
305
  const scheduler = ((_c = this.reconnectOptions) === null || _c === void 0 ? void 0 : _c.reconnectStrategy) === SocketReconnectStrategy.Exponential
280
306
  ? exponentialScheduler
281
307
  : linearScheduler;
@@ -293,6 +319,7 @@ let SocketService = class SocketService {
293
319
  if (value < attemptsAmount) {
294
320
  return of(value);
295
321
  }
322
+ this.status.reconnectionLimitReached = true;
296
323
  return throwError(() => new Error(`Max reconnect attempts ${attemptsAmount} reached.`));
297
324
  }))
298
325
  : of(-1)), takeWhile(() => this.websocket && !this.isConnected));
@@ -306,11 +333,11 @@ let SocketService = class SocketService {
306
333
  var _a;
307
334
  logger.debug(error);
308
335
  (_a = this.socketSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe();
309
- this.isReconnecting = false;
336
+ this.status.isReconnecting = false;
310
337
  },
311
338
  complete: () => {
312
339
  logger.info(this.isConnected ? 'Reconnected' : 'Disconnected');
313
- this.isReconnecting = false;
340
+ this.status.isReconnecting = false;
314
341
  this.wsMessageHandlers.forEach((mh) => {
315
342
  if (mh.isSubscription) {
316
343
  this.websocket.next(mh.sentMessage);
@@ -320,7 +347,8 @@ let SocketService = class SocketService {
320
347
  });
321
348
  }
322
349
  reset() {
323
- this.isConnected = false;
350
+ this.status.isConnected = false;
351
+ this.status.isConfigured = false;
324
352
  this.websocket && this.websocket.complete();
325
353
  this.websocket = null;
326
354
  this.cleanMessages();
@@ -332,8 +360,7 @@ let SocketService = class SocketService {
332
360
  }
333
361
  send(message, needsHandling = true) {
334
362
  if (!this.isConnected) {
335
- Promise.reject(new Error('WebSocket connection is closed'));
336
- return;
363
+ return Promise.reject(new Error('WebSocket connection is closed'));
337
364
  }
338
365
  const sendingMessasgeLog = `Sending Message for SourceRef: ${message.SOURCE_REF} | MessageType: ${message.MESSAGE_TYPE}`;
339
366
  this.logMessageTypeFlow(message.MESSAGE_TYPE, logger.info, sendingMessasgeLog);
@@ -350,7 +377,7 @@ let SocketService = class SocketService {
350
377
  this.websocket.next(message);
351
378
  });
352
379
  }
353
- sendForStream(message, onMessage, onError) {
380
+ sendForStream(message, onMessage, onError, onComplete) {
354
381
  if (!this.isConnected) {
355
382
  return throwError(() => new Error('WebSocket connection is closed'));
356
383
  }
@@ -361,13 +388,44 @@ let SocketService = class SocketService {
361
388
  this.logMessageTypeFlow(message.MESSAGE_TYPE, logger.info, sendingMessageLog);
362
389
  this.setMessageHandler(message, onMessage, onError, true);
363
390
  this.websocket.next(message);
364
- return from(this.wsMessages.pipe(filter((msg) => msg.SOURCE_REF === message.SOURCE_REF)));
391
+ /**
392
+ * @privateRemarks
393
+ * Running the data logoff from here makes more sense given the network monitor actor is optionally added.
394
+ */
395
+ return new Observable((subscriber) => {
396
+ const destroyNotifier = new Subject();
397
+ this.wsMessages
398
+ .pipe(filter((msg) => msg.SOURCE_REF === message.SOURCE_REF), takeUntil(destroyNotifier))
399
+ .subscribe({
400
+ next: (value) => {
401
+ subscriber.next(value);
402
+ },
403
+ error: (err) => {
404
+ subscriber.error(err);
405
+ },
406
+ complete: () => {
407
+ subscriber.complete();
408
+ },
409
+ });
410
+ return () => {
411
+ destroyNotifier.complete();
412
+ this.sendDataLogoff(message.SOURCE_REF);
413
+ this.removeMessageHandler(message.SOURCE_REF);
414
+ onComplete && onComplete();
415
+ };
416
+ });
365
417
  }
366
418
  setMessageHandler(message, onMessage, onError, isSubscription = false) {
367
419
  const settingMessageHandlerLog = `Setting Message Handler for SourceRef: ${message.SOURCE_REF} | MessageType: ${message.MESSAGE_TYPE}`;
368
420
  this.logMessageTypeFlow(message.MESSAGE_TYPE, logger.debug, settingMessageHandlerLog);
369
421
  this.wsMessageHandlers.set(message.SOURCE_REF, new SocketMessageHandler(message, onMessage, onError, isSubscription));
370
422
  }
423
+ sendDataLogoff(sourceRef) {
424
+ if (!this.hasValidSession) {
425
+ return;
426
+ }
427
+ this.send(this.messageBuilder.createDataLogoffMessage(sourceRef), false);
428
+ }
371
429
  removeMessageHandler(sourceRef) {
372
430
  this.wsMessageHandlers.delete(sourceRef);
373
431
  }
@@ -378,6 +436,9 @@ let SocketService = class SocketService {
378
436
  }
379
437
  logMessageTypeFlow(messageType, logFunc, logMsg) {
380
438
  switch (messageType) {
439
+ case EventMessageType.DATA_LOGOFF:
440
+ logFunc(logMsg);
441
+ break;
381
442
  case MessageType.HEARTBEAT_PING:
382
443
  case MessageType.HEARTBEAT_PONG:
383
444
  if (this.heartbeatLoggingIsEnabled) {
@@ -394,36 +455,44 @@ let SocketService = class SocketService {
394
455
  };
395
456
  __decorate([
396
457
  observable
397
- ], SocketService.prototype, "websocket", void 0);
398
- __decorate([
399
- observable
400
- ], SocketService.prototype, "wsMessages", void 0);
401
- __decorate([
402
- observable
403
- ], SocketService.prototype, "wsMessageHandlers", void 0);
458
+ ], DefaultSocket.prototype, "websocket", void 0);
404
459
  __decorate([
405
460
  observable
406
- ], SocketService.prototype, "isConnected", void 0);
461
+ ], DefaultSocket.prototype, "wsMessages", void 0);
407
462
  __decorate([
408
463
  observable
409
- ], SocketService.prototype, "disconnectedByServer", void 0);
464
+ ], DefaultSocket.prototype, "wsMessageHandlers", void 0);
410
465
  __decorate([
411
466
  observable
412
- ], SocketService.prototype, "hasValidSession", void 0);
413
- __decorate([
414
- observable
415
- ], SocketService.prototype, "heartbeatIsEnabled", void 0);
416
- __decorate([
417
- observable
418
- ], SocketService.prototype, "isReconnecting", void 0);
419
- SocketService = __decorate([
467
+ ], DefaultSocket.prototype, "heartbeatIsEnabled", void 0);
468
+ DefaultSocket = __decorate([
420
469
  __param(0, MessageBuilder),
421
470
  __param(1, Session),
422
471
  __param(2, JSONSerializer),
423
- __param(3, UUID)
424
- ], SocketService);
472
+ __param(3, UUID),
473
+ __param(4, SocketStatus)
474
+ ], DefaultSocket);
475
+ export { DefaultSocket };
425
476
  /**
426
477
  * The DI token for the Socket interface.
427
478
  * @internal
428
479
  */
429
- export const Socket = DI.createInterface((x) => x.singleton(SocketService));
480
+ export const Socket = DI.createInterface((x) => x.singleton(DefaultSocket));
481
+ /**
482
+ * Gets Socket from the DI container.
483
+ *
484
+ * @remarks
485
+ * A utility method for host applications that are not using decorators or the DI container.
486
+ *
487
+ * @example
488
+ * ```ts
489
+ * import { getSocket } from '@genesislcap/foundation-comms';
490
+ * ...
491
+ * private socket = getSocket();
492
+ * ```
493
+ *
494
+ * @public
495
+ */
496
+ export function getSocket() {
497
+ return DI.getOrCreateDOMContainer().get(Socket);
498
+ }