@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.
- package/lib/cjs/common/telemetry/TelemetryConstants.js +0 -4
- package/lib/cjs/components/livechatwidget/common/startChat.js +0 -2
- package/lib/cjs/firstresponselatency/FirstResponseLatencyTracker.js +5 -32
- package/lib/cjs/firstresponselatency/util.js +2 -15
- package/lib/esm/common/telemetry/TelemetryConstants.js +0 -4
- package/lib/esm/components/livechatwidget/common/startChat.js +0 -2
- package/lib/esm/firstresponselatency/FirstResponseLatencyTracker.js +6 -33
- package/lib/esm/firstresponselatency/util.js +0 -12
- package/lib/types/common/telemetry/TelemetryConstants.d.ts +1 -5
- package/lib/types/firstresponselatency/FirstResponseLatencyTracker.d.ts +0 -5
- package/lib/types/firstresponselatency/util.d.ts +1 -2
- package/package.json +3 -13
- package/lib/cjs/firstresponselatency/FirstMessageTrackerFromBot.js +0 -118
- package/lib/esm/firstresponselatency/FirstMessageTrackerFromBot.js +0 -112
- package/lib/types/firstresponselatency/FirstMessageTrackerFromBot.d.ts +0 -1
|
@@ -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.
|
|
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 {
|
|
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
|
|
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.
|
|
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
|
|
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;
|