@microsoft/omnichannel-chat-widget 1.7.8-main.ab4d3b4 → 1.7.8-main.bd4de53

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.
@@ -66,8 +66,6 @@ exports.BroadcastEvent = BroadcastEvent;
66
66
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
67
67
  BroadcastEvent["SyncMinimize"] = "SyncMinimize";
68
68
  BroadcastEvent["OnWidgetError"] = "OnWidgetError";
69
- BroadcastEvent["FMLTrackingCompletedAck"] = "FMLTrackingCompletedAck";
70
- BroadcastEvent["FMLTrackingCompleted"] = "FMLTrackingCompleted";
71
69
  })(BroadcastEvent || (exports.BroadcastEvent = BroadcastEvent = {}));
72
70
  let TelemetryEvent;
73
71
  exports.TelemetryEvent = TelemetryEvent;
@@ -208,8 +206,6 @@ exports.TelemetryEvent = TelemetryEvent;
208
206
  TelemetryEvent["MessageSent"] = "MessageSent";
209
207
  TelemetryEvent["MessageReceived"] = "MessageReceived";
210
208
  TelemetryEvent["MessageLapTrack"] = "MessageLapTrack";
211
- TelemetryEvent["BotFirstMessageLapTrack"] = "BotFirstMessageLapTrackError";
212
- TelemetryEvent["BotFirstMessageLapTrackError"] = "BotFirstMessageLapTrack";
213
209
  TelemetryEvent["MessageStartLapTrackError"] = "MessageStartLapTrackError";
214
210
  TelemetryEvent["MessageStopLapTrackError"] = "MessageStopLapTrackError";
215
211
  TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
@@ -19,7 +19,6 @@ var _TelemetryManager = require("../../../common/telemetry/TelemetryManager");
19
19
  var _endChat = require("./endChat");
20
20
  var _createAdapter = require("./createAdapter");
21
21
  var _newMessageEventHandler = require("../../../plugins/newMessageEventHandler");
22
- var _FirstMessageTrackerFromBot = require("../../../firstresponselatency/FirstMessageTrackerFromBot");
23
22
  var _liveChatConfigUtils = require("./liveChatConfigUtils");
24
23
  var _setPostChatContextAndLoadSurvey = require("./setPostChatContextAndLoadSurvey");
25
24
  var _persistentChatHelper = require("./persistentChatHelper");
@@ -152,7 +151,6 @@ const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, is
152
151
  const optionalParams = {
153
152
  isProactiveChat
154
153
  };
155
- (0, _FirstMessageTrackerFromBot.createTrackingForFirstMessage)();
156
154
  await initStartChat(facadeChatSDK, dispatch, setAdapter, state, props, optionalParams);
157
155
  };
158
156
 
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.FirstResponseLatencyTracker = void 0;
7
7
  var _TelemetryConstants = require("../common/telemetry/TelemetryConstants");
8
- var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
8
  var _TelemetryHelper = require("../common/telemetry/TelemetryHelper");
10
9
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
10
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
@@ -17,32 +16,6 @@ class FirstResponseLatencyTracker {
17
16
  _defineProperty(this, "isEnded", false);
18
17
  _defineProperty(this, "startTrackingMessage", void 0);
19
18
  _defineProperty(this, "stopTrackingMessage", void 0);
20
- _defineProperty(this, "isReady", false);
21
- _defineProperty(this, "offlineNetworkListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.NetworkDisconnected).subscribe(() => {
22
- this.isStarted = false;
23
- this.isEnded = false;
24
- _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
25
- Event: _TelemetryConstants.TelemetryEvent.MessageStopLapTrackError,
26
- Description: "Tracker Stopped due to network disconnection"
27
- });
28
- }));
29
- _defineProperty(this, "fmltrackingListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.FMLTrackingCompleted).subscribe(() => {
30
- this.isReady = true;
31
- _omnichannelChatComponents.BroadcastService.postMessage({
32
- eventName: _TelemetryConstants.BroadcastEvent.FMLTrackingCompletedAck,
33
- payload: null
34
- });
35
- }));
36
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
37
- // No need to keep listerning for tracking, enforcing disconnection for the listners
38
- _defineProperty(this, "rehydrateListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
39
- this.isReady = true;
40
- }));
41
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
42
- // No need to keep listerning for tracking, enforcing disconnection for the listners
43
- _defineProperty(this, "historyListener", _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.HistoryMessageReceived).subscribe(() => {
44
- this.isReady = true;
45
- }));
46
19
  // this is a workaround to ensure in reload we track effectively the messages
47
20
  // we do have a mechanism in place to prevent log agent messages.
48
21
  this.isABotConversation = true;
@@ -62,7 +35,6 @@ class FirstResponseLatencyTracker {
62
35
 
63
36
  // Tracking Functions
64
37
  startTracking(payload) {
65
- if (!this.isReady) return;
66
38
  // this prevents to initiate tracking for multiple incoming messages
67
39
  if (this.isStarted) {
68
40
  return;
@@ -71,9 +43,11 @@ class FirstResponseLatencyTracker {
71
43
  if (!this.isABotConversation) {
72
44
  return;
73
45
  }
46
+
74
47
  // control of states to prevent clashing of messages
75
48
  this.isStarted = true;
76
49
  this.isEnded = false;
50
+
77
51
  // The idea of using types is to enrich telemetry data
78
52
  this.startTrackingMessage = this.createTrackingMessage(payload, "userMessage");
79
53
  }
@@ -125,6 +99,9 @@ class FirstResponseLatencyTracker {
125
99
  if (!payload || !payload.Id) {
126
100
  throw new Error("Invalid payload");
127
101
  }
102
+ // in the case of a reload, tracker will be paused, until last history message is received
103
+ // this is because we dont have a way to identidy send messages as part of the history
104
+ //if (this.inPause) return;
128
105
  this.startTracking(payload);
129
106
  } catch (e) {
130
107
  _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.ERROR, {
@@ -170,10 +147,6 @@ class FirstResponseLatencyTracker {
170
147
  this.isEnded = false;
171
148
  this.startTrackingMessage = undefined;
172
149
  this.stopTrackingMessage = undefined;
173
- this.offlineNetworkListener.unsubscribe();
174
- this.fmltrackingListener.unsubscribe();
175
- this.rehydrateListener.unsubscribe();
176
- this.historyListener.unsubscribe();
177
150
  }
178
151
  }
179
152
  exports.FirstResponseLatencyTracker = FirstResponseLatencyTracker;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.polyfillMessagePayloadForEvent = exports.isHistoryMessage = exports.getScenarioType = exports.createTrackingMessage = exports.buildMessagePayload = void 0;
6
+ exports.polyfillMessagePayloadForEvent = exports.isHistoryMessage = exports.getScenarioType = exports.buildMessagePayload = void 0;
7
7
  var _Constants = require("./Constants");
8
8
  var _Constants2 = require("../common/Constants");
9
9
  const isHistoryMessage = (activity, startTime) => {
@@ -82,17 +82,4 @@ const getScenarioType = activity => {
82
82
  }
83
83
  return _Constants.ScenarioType.ReceivedMessageStrategy;
84
84
  };
85
- exports.getScenarioType = getScenarioType;
86
- const createTrackingMessage = (payload, type) => {
87
- return {
88
- Id: payload.Id,
89
- role: payload.role,
90
- timestamp: payload === null || payload === void 0 ? void 0 : payload.timestamp,
91
- tags: payload.tags,
92
- messageType: payload.messageType,
93
- text: payload.text,
94
- type: type,
95
- checkTime: new Date().getTime()
96
- };
97
- };
98
- exports.createTrackingMessage = createTrackingMessage;
85
+ exports.getScenarioType = getScenarioType;
@@ -61,8 +61,6 @@ export let BroadcastEvent;
61
61
  BroadcastEvent["ContactIdNotFound"] = "ContactIdNotFound";
62
62
  BroadcastEvent["SyncMinimize"] = "SyncMinimize";
63
63
  BroadcastEvent["OnWidgetError"] = "OnWidgetError";
64
- BroadcastEvent["FMLTrackingCompletedAck"] = "FMLTrackingCompletedAck";
65
- BroadcastEvent["FMLTrackingCompleted"] = "FMLTrackingCompleted";
66
64
  })(BroadcastEvent || (BroadcastEvent = {}));
67
65
  export let TelemetryEvent;
68
66
  (function (TelemetryEvent) {
@@ -202,8 +200,6 @@ export let TelemetryEvent;
202
200
  TelemetryEvent["MessageSent"] = "MessageSent";
203
201
  TelemetryEvent["MessageReceived"] = "MessageReceived";
204
202
  TelemetryEvent["MessageLapTrack"] = "MessageLapTrack";
205
- TelemetryEvent["BotFirstMessageLapTrack"] = "BotFirstMessageLapTrackError";
206
- TelemetryEvent["BotFirstMessageLapTrackError"] = "BotFirstMessageLapTrack";
207
203
  TelemetryEvent["MessageStartLapTrackError"] = "MessageStartLapTrackError";
208
204
  TelemetryEvent["MessageStopLapTrackError"] = "MessageStopLapTrackError";
209
205
  TelemetryEvent["SystemMessageReceived"] = "SystemMessageReceived";
@@ -13,7 +13,6 @@ import { TelemetryTimers } from "../../../common/telemetry/TelemetryManager";
13
13
  import { chatSDKStateCleanUp } from "./endChat";
14
14
  import { createAdapter } from "./createAdapter";
15
15
  import { createOnNewAdapterActivityHandler } from "../../../plugins/newMessageEventHandler";
16
- import { createTrackingForFirstMessage } from "../../../firstresponselatency/FirstMessageTrackerFromBot";
17
16
  import { isPersistentChatEnabled } from "./liveChatConfigUtils";
18
17
  import { setPostChatContextAndLoadSurvey } from "./setPostChatContextAndLoadSurvey";
19
18
  import { shouldSetPreChatIfPersistentChat } from "./persistentChatHelper";
@@ -146,7 +145,6 @@ const setPreChatAndInitiateChat = async (facadeChatSDK, dispatch, setAdapter, is
146
145
  const optionalParams = {
147
146
  isProactiveChat
148
147
  };
149
- createTrackingForFirstMessage();
150
148
  await initStartChat(facadeChatSDK, dispatch, setAdapter, state, props, optionalParams);
151
149
  };
152
150
 
@@ -1,8 +1,7 @@
1
1
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
2
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
3
3
  function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
4
- import { BroadcastEvent, LogLevel, TelemetryEvent } from "../common/telemetry/TelemetryConstants";
5
- import { BroadcastService } from "@microsoft/omnichannel-chat-components";
4
+ import { LogLevel, TelemetryEvent } from "../common/telemetry/TelemetryConstants";
6
5
  import { TelemetryHelper } from "../common/telemetry/TelemetryHelper";
7
6
  export class FirstResponseLatencyTracker {
8
7
  constructor() {
@@ -11,32 +10,6 @@ export class FirstResponseLatencyTracker {
11
10
  _defineProperty(this, "isEnded", false);
12
11
  _defineProperty(this, "startTrackingMessage", void 0);
13
12
  _defineProperty(this, "stopTrackingMessage", void 0);
14
- _defineProperty(this, "isReady", false);
15
- _defineProperty(this, "offlineNetworkListener", BroadcastService.getMessageByEventName(TelemetryEvent.NetworkDisconnected).subscribe(() => {
16
- this.isStarted = false;
17
- this.isEnded = false;
18
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
19
- Event: TelemetryEvent.MessageStopLapTrackError,
20
- Description: "Tracker Stopped due to network disconnection"
21
- });
22
- }));
23
- _defineProperty(this, "fmltrackingListener", BroadcastService.getMessageByEventName(BroadcastEvent.FMLTrackingCompleted).subscribe(() => {
24
- this.isReady = true;
25
- BroadcastService.postMessage({
26
- eventName: BroadcastEvent.FMLTrackingCompletedAck,
27
- payload: null
28
- });
29
- }));
30
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
31
- // No need to keep listerning for tracking, enforcing disconnection for the listners
32
- _defineProperty(this, "rehydrateListener", BroadcastService.getMessageByEventName(TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
33
- this.isReady = true;
34
- }));
35
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
36
- // No need to keep listerning for tracking, enforcing disconnection for the listners
37
- _defineProperty(this, "historyListener", BroadcastService.getMessageByEventName(BroadcastEvent.HistoryMessageReceived).subscribe(() => {
38
- this.isReady = true;
39
- }));
40
13
  // this is a workaround to ensure in reload we track effectively the messages
41
14
  // we do have a mechanism in place to prevent log agent messages.
42
15
  this.isABotConversation = true;
@@ -56,7 +29,6 @@ export class FirstResponseLatencyTracker {
56
29
 
57
30
  // Tracking Functions
58
31
  startTracking(payload) {
59
- if (!this.isReady) return;
60
32
  // this prevents to initiate tracking for multiple incoming messages
61
33
  if (this.isStarted) {
62
34
  return;
@@ -65,9 +37,11 @@ export class FirstResponseLatencyTracker {
65
37
  if (!this.isABotConversation) {
66
38
  return;
67
39
  }
40
+
68
41
  // control of states to prevent clashing of messages
69
42
  this.isStarted = true;
70
43
  this.isEnded = false;
44
+
71
45
  // The idea of using types is to enrich telemetry data
72
46
  this.startTrackingMessage = this.createTrackingMessage(payload, "userMessage");
73
47
  }
@@ -119,6 +93,9 @@ export class FirstResponseLatencyTracker {
119
93
  if (!payload || !payload.Id) {
120
94
  throw new Error("Invalid payload");
121
95
  }
96
+ // in the case of a reload, tracker will be paused, until last history message is received
97
+ // this is because we dont have a way to identidy send messages as part of the history
98
+ //if (this.inPause) return;
122
99
  this.startTracking(payload);
123
100
  } catch (e) {
124
101
  TelemetryHelper.logActionEvent(LogLevel.ERROR, {
@@ -164,9 +141,5 @@ export class FirstResponseLatencyTracker {
164
141
  this.isEnded = false;
165
142
  this.startTrackingMessage = undefined;
166
143
  this.stopTrackingMessage = undefined;
167
- this.offlineNetworkListener.unsubscribe();
168
- this.fmltrackingListener.unsubscribe();
169
- this.rehydrateListener.unsubscribe();
170
- this.historyListener.unsubscribe();
171
144
  }
172
145
  }
@@ -72,16 +72,4 @@ export const getScenarioType = activity => {
72
72
  return ScenarioType.SystemMessageStrategy;
73
73
  }
74
74
  return ScenarioType.ReceivedMessageStrategy;
75
- };
76
- export const createTrackingMessage = (payload, type) => {
77
- return {
78
- Id: payload.Id,
79
- role: payload.role,
80
- timestamp: payload === null || payload === void 0 ? void 0 : payload.timestamp,
81
- tags: payload.tags,
82
- messageType: payload.messageType,
83
- text: payload.text,
84
- type: type,
85
- checkTime: new Date().getTime()
86
- };
87
75
  };
@@ -54,9 +54,7 @@ export declare enum BroadcastEvent {
54
54
  UpdateConversationDataForTelemetry = "UpdateConversationDataForTelemetry",
55
55
  ContactIdNotFound = "ContactIdNotFound",
56
56
  SyncMinimize = "SyncMinimize",
57
- OnWidgetError = "OnWidgetError",
58
- FMLTrackingCompletedAck = "FMLTrackingCompletedAck",
59
- FMLTrackingCompleted = "FMLTrackingCompleted"
57
+ OnWidgetError = "OnWidgetError"
60
58
  }
61
59
  export declare enum TelemetryEvent {
62
60
  CallAdded = "CallAdded",
@@ -195,8 +193,6 @@ export declare enum TelemetryEvent {
195
193
  MessageSent = "MessageSent",
196
194
  MessageReceived = "MessageReceived",
197
195
  MessageLapTrack = "MessageLapTrack",
198
- BotFirstMessageLapTrack = "BotFirstMessageLapTrackError",
199
- BotFirstMessageLapTrackError = "BotFirstMessageLapTrack",
200
196
  MessageStartLapTrackError = "MessageStartLapTrackError",
201
197
  MessageStopLapTrackError = "MessageStopLapTrackError",
202
198
  SystemMessageReceived = "SystemMessageReceived",
@@ -5,7 +5,6 @@ export declare class FirstResponseLatencyTracker {
5
5
  private isEnded;
6
6
  private startTrackingMessage?;
7
7
  private stopTrackingMessage?;
8
- private isReady;
9
8
  constructor();
10
9
  private createTrackingMessage;
11
10
  private startTracking;
@@ -14,9 +13,5 @@ export declare class FirstResponseLatencyTracker {
14
13
  private isMessageFromValidSender;
15
14
  startClock(payload: MessagePayload): void;
16
15
  stopClock(payload: MessagePayload): void;
17
- private offlineNetworkListener;
18
- private fmltrackingListener;
19
- private rehydrateListener;
20
- private historyListener;
21
16
  private deregister;
22
17
  }
@@ -1,7 +1,6 @@
1
- import { MessagePayload, ScenarioType, TrackingMessage } from "./Constants";
1
+ import { MessagePayload, ScenarioType } from "./Constants";
2
2
  import { IActivity } from "botframework-directlinejs";
3
3
  export declare const isHistoryMessage: (activity: IActivity, startTime: number) => boolean;
4
4
  export declare const buildMessagePayload: (activity: IActivity, userId: string) => MessagePayload;
5
5
  export declare const polyfillMessagePayloadForEvent: (activity: IActivity, payload: MessagePayload, conversationId?: string) => MessagePayload;
6
6
  export declare const getScenarioType: (activity: IActivity) => ScenarioType;
7
- export declare const createTrackingMessage: (payload: MessagePayload, type: string) => TrackingMessage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.7.8-main.ab4d3b4",
3
+ "version": "1.7.8-main.bd4de53",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",
@@ -47,7 +47,6 @@
47
47
  "babel-jest": "^27.3.1",
48
48
  "babel-loader": "^8.2.3",
49
49
  "botframework-directlinejs": "^0.15.0",
50
- "concurrently": "^9.1.2",
51
50
  "copyfiles": "^2.4.1",
52
51
  "eslint": "^7.32.0",
53
52
  "eslint-config-standard": "^16.0.3",
@@ -57,12 +56,10 @@
57
56
  "eslint-plugin-react": "^7.26.1",
58
57
  "eslint-plugin-storybook": "^0.5.3",
59
58
  "file-loader": "^6.2.0",
60
- "husky": "^9.1.7",
61
59
  "jest": "^27.3.1",
62
60
  "jest-dom": "^4.0.0",
63
61
  "jest-image-snapshot": "^4.5.1",
64
62
  "json": "^11.0.0",
65
- "lint-staged": "^15.5.2",
66
63
  "p-defer": "^4.0.1",
67
64
  "playwright": "^1.20.0",
68
65
  "postcss": "^8.3.9",
@@ -70,11 +67,9 @@
70
67
  "react-docgen-typescript-plugin": "^1.0.8",
71
68
  "react-dom": "^17.0.2",
72
69
  "react-test-renderer": "^17.0.2",
73
- "rimraf": "^6.0.1",
74
70
  "storybook-addon-playwright": "^4.9.2",
75
71
  "swiper": "^9.0.5",
76
72
  "terser-webpack-plugin": "^4.2.3",
77
- "thread-loader": "^2.1.3",
78
73
  "ts-loader": "^9.2.6",
79
74
  "typescript": "4.9.5",
80
75
  "webpack": "^4.44.2",
@@ -102,7 +97,7 @@
102
97
  "compose-storybook": "start-storybook -c stories/.storybook -p 9009",
103
98
  "build-composite-storybook": "build-storybook -c stories/.storybook -o storybook-build",
104
99
  "build-storybook": "build-storybook",
105
- "build": "yarn clean yarn lint && yarn build:esm && yarn build:cjs && tsc",
100
+ "build": "yarn lint && yarn build:esm && yarn build:cjs && tsc",
106
101
  "test:unit": "jest -c jest.config.unit.cjs --env=jsdom --runInBand --force-exit",
107
102
  "test:e2e": "cd automation_tests && yarn test",
108
103
  "test:e2e:build": "yarn build-sample && cd automation_tests && yarn test",
@@ -110,8 +105,6 @@
110
105
  "test:all": "yarn test:unit && yarn test:visual",
111
106
  "build:esm": "babel ./src --config-file ./babel.esm.config.json --out-dir lib/esm --extensions .ts,.js,.tsx --ignore **/*.test.ts,**/*.stories.tsx,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx",
112
107
  "build:cjs": "babel ./src --config-file ./babel.config.json --out-dir lib/cjs --extensions .ts,.js,.tsx --ignore **/*.test.ts,**/*.stories.tsx,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx",
113
- "build:esm:watch": "babel ./src --config-file ./babel.esm.config.json --out-dir lib/esm --extensions .ts,.js,.tsx --watch --ignore **/*.test.ts,**/*.stories.tsx,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx",
114
- "build:cjs:watch": "babel ./src --config-file ./babel.config.json --out-dir lib/cjs --extensions .ts,.js,.tsx --watch --ignore **/*.test.ts,**/*.stories.tsx,**/*.test.tsx,**/*.spec.ts,**/*.spec.tsx",
115
108
  "build:umd": "webpack --config ./webpack.umd.config.cjs",
116
109
  "verify": "yarn install && yarn build-storybook && yarn test:all && yarn build && yarn storybook",
117
110
  "testpack": "yarn build && yarn pack",
@@ -119,10 +112,7 @@
119
112
  "build-sample:dev": "yarn build && webpack --config ./webpack.dev.config.cjs",
120
113
  "test:visual:build": "yarn build-storybook && yarn test:visual",
121
114
  "lint": "yarn eslint . --max-warnings=0",
122
- "pretest:visual": "yarn playwright install",
123
- "prepare": "husky install",
124
- "clean": "rimraf lib",
125
- "dev": "concurrently \"yarn build:esm:watch\" \"webpack --config ./webpack.config.cjs --watch\""
115
+ "pretest:visual": "yarn playwright install"
126
116
  },
127
117
  "resolutions": {
128
118
  "**/url-parse": "1.5.9",
@@ -1,118 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createTrackingForFirstMessage = void 0;
7
- var _TelemetryConstants = require("../common/telemetry/TelemetryConstants");
8
- var _omnichannelChatComponents = require("@microsoft/omnichannel-chat-components");
9
- var _TelemetryHelper = require("../common/telemetry/TelemetryHelper");
10
- var _util = require("./util");
11
- // This tracker is event based, this is since we are tracking events coming from different sources
12
- // with different timeline, therefore this is a functional approach to track the events, instead of a class based approach
13
- const createTrackingForFirstMessage = () => {
14
- // Reset the tracking variables
15
- let startTracking = false;
16
- let stopTracking = false;
17
- let startTime = 0;
18
- let stopTime = 0;
19
- let stopTrackingMessage;
20
- let flag = false;
21
- const isMessageFromValidSender = payload => {
22
- var _payload$tags;
23
- // agent scenario
24
- if (payload !== null && payload !== void 0 && (_payload$tags = payload.tags) !== null && _payload$tags !== void 0 && _payload$tags.includes("public")) {
25
- return false;
26
- }
27
- return true;
28
- };
29
- const widgetLoadListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.WidgetLoadComplete).subscribe(() => {
30
- if (startTracking) return;
31
- startTracking = true;
32
- startTime = new Date().getTime();
33
- });
34
- const newMessageListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.NewMessageReceived).subscribe(message => {
35
- const payload = message.payload;
36
-
37
- // we only care for bot, so we need to check if the message is from the bot
38
- // pending to add typing message indicator signal detection
39
-
40
- if (isMessageFromValidSender(payload)) {
41
- if (startTracking && !stopTracking) {
42
- stopTime = new Date().getTime();
43
- const elapsedTime = stopTime - startTime;
44
- stopTracking = true;
45
- stopTrackingMessage = (0, _util.createTrackingMessage)(payload, "botMessage");
46
- notifyFMLTrackingCompleted();
47
- _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
48
- Event: _TelemetryConstants.TelemetryEvent.BotFirstMessageLapTrack,
49
- Description: "First Message from Bot latency tracking",
50
- CustomProperties: {
51
- elapsedTime,
52
- widgetLoadedAt: startTime,
53
- botMessage: stopTrackingMessage
54
- }
55
- });
56
- }
57
- }
58
-
59
- // this track only first message, if coming from the bot or not
60
- // the only difference is that it logs only those from bot
61
- disconnectListener();
62
- });
63
- const notifyFMLTrackingCompleted = () => {
64
- ackListener();
65
- // Retry sending until flag is true, but do not block the main thread
66
- const interval = setInterval(() => {
67
- if (flag) {
68
- clearInterval(interval);
69
- } else {
70
- _omnichannelChatComponents.BroadcastService.postMessage({
71
- eventName: _TelemetryConstants.BroadcastEvent.FMLTrackingCompleted,
72
- payload: null
73
- });
74
- }
75
- }, 100);
76
- };
77
- const ackListener = () => {
78
- const listen = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.FMLTrackingCompletedAck).subscribe(() => {
79
- flag = true;
80
- listen.unsubscribe();
81
- });
82
- };
83
-
84
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
85
- // No need to keep listerning for tracking, enforcing disconnection for the listners
86
- const rehydrateListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
87
- startTracking = false;
88
- stopTracking = false;
89
- disconnectListener();
90
- });
91
-
92
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
93
- // No need to keep listerning for tracking, enforcing disconnection for the listners
94
- const historyListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.BroadcastEvent.HistoryMessageReceived).subscribe(() => {
95
- startTracking = false;
96
- stopTracking = false;
97
- disconnectListener();
98
- });
99
- const offlineNetworkListener = _omnichannelChatComponents.BroadcastService.getMessageByEventName(_TelemetryConstants.TelemetryEvent.NetworkDisconnected).subscribe(() => {
100
- startTracking = false;
101
- stopTracking = false;
102
- disconnectListener();
103
- _TelemetryHelper.TelemetryHelper.logActionEvent(_TelemetryConstants.LogLevel.INFO, {
104
- Event: _TelemetryConstants.TelemetryEvent.BotFirstMessageLapTrackError,
105
- Description: "Tracker Stopped due to network disconnection"
106
- });
107
- });
108
-
109
- // this is to ensure that we are not tracking messages that are not part of the current conversation
110
- const disconnectListener = () => {
111
- historyListener.unsubscribe();
112
- rehydrateListener.unsubscribe();
113
- newMessageListener.unsubscribe();
114
- widgetLoadListener.unsubscribe();
115
- offlineNetworkListener.unsubscribe();
116
- };
117
- };
118
- exports.createTrackingForFirstMessage = createTrackingForFirstMessage;
@@ -1,112 +0,0 @@
1
- import { BroadcastEvent, LogLevel, TelemetryEvent } from "../common/telemetry/TelemetryConstants";
2
- import { BroadcastService } from "@microsoft/omnichannel-chat-components";
3
- import { TelemetryHelper } from "../common/telemetry/TelemetryHelper";
4
- import { createTrackingMessage } from "./util";
5
-
6
- // This tracker is event based, this is since we are tracking events coming from different sources
7
- // with different timeline, therefore this is a functional approach to track the events, instead of a class based approach
8
- export const createTrackingForFirstMessage = () => {
9
- // Reset the tracking variables
10
- let startTracking = false;
11
- let stopTracking = false;
12
- let startTime = 0;
13
- let stopTime = 0;
14
- let stopTrackingMessage;
15
- let flag = false;
16
- const isMessageFromValidSender = payload => {
17
- var _payload$tags;
18
- // agent scenario
19
- if (payload !== null && payload !== void 0 && (_payload$tags = payload.tags) !== null && _payload$tags !== void 0 && _payload$tags.includes("public")) {
20
- return false;
21
- }
22
- return true;
23
- };
24
- const widgetLoadListener = BroadcastService.getMessageByEventName(TelemetryEvent.WidgetLoadComplete).subscribe(() => {
25
- if (startTracking) return;
26
- startTracking = true;
27
- startTime = new Date().getTime();
28
- });
29
- const newMessageListener = BroadcastService.getMessageByEventName(BroadcastEvent.NewMessageReceived).subscribe(message => {
30
- const payload = message.payload;
31
-
32
- // we only care for bot, so we need to check if the message is from the bot
33
- // pending to add typing message indicator signal detection
34
-
35
- if (isMessageFromValidSender(payload)) {
36
- if (startTracking && !stopTracking) {
37
- stopTime = new Date().getTime();
38
- const elapsedTime = stopTime - startTime;
39
- stopTracking = true;
40
- stopTrackingMessage = createTrackingMessage(payload, "botMessage");
41
- notifyFMLTrackingCompleted();
42
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
43
- Event: TelemetryEvent.BotFirstMessageLapTrack,
44
- Description: "First Message from Bot latency tracking",
45
- CustomProperties: {
46
- elapsedTime,
47
- widgetLoadedAt: startTime,
48
- botMessage: stopTrackingMessage
49
- }
50
- });
51
- }
52
- }
53
-
54
- // this track only first message, if coming from the bot or not
55
- // the only difference is that it logs only those from bot
56
- disconnectListener();
57
- });
58
- const notifyFMLTrackingCompleted = () => {
59
- ackListener();
60
- // Retry sending until flag is true, but do not block the main thread
61
- const interval = setInterval(() => {
62
- if (flag) {
63
- clearInterval(interval);
64
- } else {
65
- BroadcastService.postMessage({
66
- eventName: BroadcastEvent.FMLTrackingCompleted,
67
- payload: null
68
- });
69
- }
70
- }, 100);
71
- };
72
- const ackListener = () => {
73
- const listen = BroadcastService.getMessageByEventName(BroadcastEvent.FMLTrackingCompletedAck).subscribe(() => {
74
- flag = true;
75
- listen.unsubscribe();
76
- });
77
- };
78
-
79
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
80
- // No need to keep listerning for tracking, enforcing disconnection for the listners
81
- const rehydrateListener = BroadcastService.getMessageByEventName(TelemetryEvent.RehydrateMessageReceived).subscribe(() => {
82
- startTracking = false;
83
- stopTracking = false;
84
- disconnectListener();
85
- });
86
-
87
- // Rehydrate message is received when the widget is reloaded, this is to ensure that we are not tracking messages that are not part of the current conversation
88
- // No need to keep listerning for tracking, enforcing disconnection for the listners
89
- const historyListener = BroadcastService.getMessageByEventName(BroadcastEvent.HistoryMessageReceived).subscribe(() => {
90
- startTracking = false;
91
- stopTracking = false;
92
- disconnectListener();
93
- });
94
- const offlineNetworkListener = BroadcastService.getMessageByEventName(TelemetryEvent.NetworkDisconnected).subscribe(() => {
95
- startTracking = false;
96
- stopTracking = false;
97
- disconnectListener();
98
- TelemetryHelper.logActionEvent(LogLevel.INFO, {
99
- Event: TelemetryEvent.BotFirstMessageLapTrackError,
100
- Description: "Tracker Stopped due to network disconnection"
101
- });
102
- });
103
-
104
- // this is to ensure that we are not tracking messages that are not part of the current conversation
105
- const disconnectListener = () => {
106
- historyListener.unsubscribe();
107
- rehydrateListener.unsubscribe();
108
- newMessageListener.unsubscribe();
109
- widgetLoadListener.unsubscribe();
110
- offlineNetworkListener.unsubscribe();
111
- };
112
- };
@@ -1 +0,0 @@
1
- export declare const createTrackingForFirstMessage: () => void;