@genesislcap/foundation-comms 14.167.2 → 14.167.3-alpha-b40d1e5.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 (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 +432 -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
+ }