softphone-vendor-headsets 2.0.0-develop.8 → 2.0.0-develop.9

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 (188) hide show
  1. package/dist/cjs/src/config/i18n.d.ts +2 -0
  2. package/dist/cjs/src/config/i18n.js +28 -0
  3. package/dist/cjs/src/config/i18n.js.map +1 -0
  4. package/dist/cjs/src/library/index.d.ts +8 -0
  5. package/dist/cjs/src/library/index.js +29 -0
  6. package/dist/cjs/src/library/index.js.map +1 -0
  7. package/dist/cjs/src/library/services/headset.d.ts +44 -0
  8. package/dist/cjs/src/library/services/headset.js +313 -0
  9. package/dist/cjs/src/library/services/headset.js.map +1 -0
  10. package/dist/cjs/src/library/services/headset.test.d.ts +1 -0
  11. package/dist/cjs/src/library/services/headset.test.js +800 -0
  12. package/dist/cjs/src/library/services/headset.test.js.map +1 -0
  13. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.d.ts +45 -0
  14. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.js +254 -0
  15. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.js.map +1 -0
  16. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.d.ts +1 -0
  17. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.js +569 -0
  18. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.js.map +1 -0
  19. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/types.d.ts +33 -0
  20. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/types.js +20 -0
  21. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra-native/types.js.map +1 -0
  22. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.d.ts +48 -0
  23. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.js +396 -0
  24. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.js.map +1 -0
  25. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.test.d.ts +1 -0
  26. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.test.js +945 -0
  27. package/dist/cjs/src/library/services/vendor-implementations/jabra/jabra.test.js.map +1 -0
  28. package/dist/cjs/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.d.ts +7 -0
  29. package/dist/cjs/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.js +11 -0
  30. package/dist/cjs/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.js.map +1 -0
  31. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.d.ts +47 -0
  32. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.js +51 -0
  33. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.js.map +1 -0
  34. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.d.ts +1 -0
  35. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.js +111 -0
  36. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.js.map +1 -0
  37. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.d.ts +352 -0
  38. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.js +390 -0
  39. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.js.map +1 -0
  40. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.d.ts +62 -0
  41. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.js +394 -0
  42. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.js.map +1 -0
  43. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.test.d.ts +2 -0
  44. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.test.js +983 -0
  45. package/dist/cjs/src/library/services/vendor-implementations/plantronics/plantronics.test.js.map +1 -0
  46. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.d.ts +42 -0
  47. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.js +277 -0
  48. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.js.map +1 -0
  49. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.test.d.ts +1 -0
  50. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.test.js +708 -0
  51. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/sennheiser.test.js.map +1 -0
  52. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/types.d.ts +40 -0
  53. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/types.js +32 -0
  54. package/dist/cjs/src/library/services/vendor-implementations/sennheiser/types.js.map +1 -0
  55. package/dist/cjs/src/library/services/vendor-implementations/vendor-implementation.d.ts +49 -0
  56. package/dist/cjs/src/library/services/vendor-implementations/vendor-implementation.js +99 -0
  57. package/dist/cjs/src/library/services/vendor-implementations/vendor-implementation.js.map +1 -0
  58. package/dist/cjs/src/library/services/vendor-implementations/vendor-implemntation.test.d.ts +1 -0
  59. package/dist/cjs/src/library/services/vendor-implementations/vendor-implemntation.test.js +106 -0
  60. package/dist/cjs/src/library/services/vendor-implementations/vendor-implemntation.test.js.map +1 -0
  61. package/dist/cjs/src/library/test-utils.d.ts +16 -0
  62. package/dist/cjs/src/library/test-utils.js +43 -0
  63. package/dist/cjs/src/library/test-utils.js.map +1 -0
  64. package/dist/cjs/src/library/types/call-info.d.ts +4 -0
  65. package/dist/cjs/src/library/types/call-info.js +3 -0
  66. package/dist/cjs/src/library/types/call-info.js.map +1 -0
  67. package/dist/cjs/src/library/types/consumed-headset-events.d.ts +32 -0
  68. package/dist/cjs/src/library/types/consumed-headset-events.js +18 -0
  69. package/dist/cjs/src/library/types/consumed-headset-events.js.map +1 -0
  70. package/dist/cjs/src/library/types/device-info.d.ts +8 -0
  71. package/dist/cjs/src/library/types/device-info.js +3 -0
  72. package/dist/cjs/src/library/types/device-info.js.map +1 -0
  73. package/dist/cjs/src/library/types/emitted-headset-events.d.ts +34 -0
  74. package/dist/cjs/src/library/types/emitted-headset-events.js +3 -0
  75. package/dist/cjs/src/library/types/emitted-headset-events.js.map +1 -0
  76. package/dist/cjs/src/library/types/headset-states.d.ts +10 -0
  77. package/dist/cjs/src/library/types/headset-states.js +3 -0
  78. package/dist/cjs/src/library/types/headset-states.js.map +1 -0
  79. package/dist/cjs/src/library/utils.d.ts +14 -0
  80. package/dist/cjs/src/library/utils.js +80 -0
  81. package/dist/cjs/src/library/utils.js.map +1 -0
  82. package/dist/cjs/src/library/utils.test.d.ts +1 -0
  83. package/dist/cjs/src/library/utils.test.js +46 -0
  84. package/dist/cjs/src/library/utils.test.js.map +1 -0
  85. package/dist/cjs/src/mocks/call.d.ts +11 -0
  86. package/dist/cjs/src/mocks/call.js +55 -0
  87. package/dist/cjs/src/mocks/call.js.map +1 -0
  88. package/dist/cjs/src/mocks/device-service.d.ts +8 -0
  89. package/dist/cjs/src/mocks/device-service.js +44 -0
  90. package/dist/cjs/src/mocks/device-service.js.map +1 -0
  91. package/dist/cjs/src/setupTests.d.ts +1 -0
  92. package/dist/cjs/src/setupTests.js +8 -0
  93. package/dist/cjs/src/setupTests.js.map +1 -0
  94. package/dist/deploy-info.json +560 -2
  95. package/dist/es/src/config/i18n.d.ts +2 -0
  96. package/dist/es/src/config/i18n.js +23 -0
  97. package/dist/es/src/config/i18n.js.map +1 -0
  98. package/dist/es/src/library/index.d.ts +8 -0
  99. package/dist/es/src/library/index.js +9 -0
  100. package/dist/es/src/library/index.js.map +1 -0
  101. package/dist/es/src/library/services/headset.d.ts +44 -0
  102. package/dist/es/src/library/services/headset.js +307 -0
  103. package/dist/es/src/library/services/headset.js.map +1 -0
  104. package/dist/es/src/library/services/headset.test.d.ts +1 -0
  105. package/dist/es/src/library/services/headset.test.js +795 -0
  106. package/dist/es/src/library/services/headset.test.js.map +1 -0
  107. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.d.ts +45 -0
  108. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.js +251 -0
  109. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.js.map +1 -0
  110. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.d.ts +1 -0
  111. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.js +541 -0
  112. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/jabra-native.test.js.map +1 -0
  113. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/types.d.ts +33 -0
  114. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/types.js +17 -0
  115. package/dist/es/src/library/services/vendor-implementations/jabra/jabra-native/types.js.map +1 -0
  116. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.d.ts +48 -0
  117. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.js +393 -0
  118. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.js.map +1 -0
  119. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.test.d.ts +1 -0
  120. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.test.js +940 -0
  121. package/dist/es/src/library/services/vendor-implementations/jabra/jabra.test.js.map +1 -0
  122. package/dist/es/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.d.ts +7 -0
  123. package/dist/es/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.js +7 -0
  124. package/dist/es/src/library/services/vendor-implementations/jabra/mock-jabra-sdk.js.map +1 -0
  125. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.d.ts +47 -0
  126. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.js +48 -0
  127. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.js.map +1 -0
  128. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.d.ts +1 -0
  129. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.js +109 -0
  130. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-call-events.test.js.map +1 -0
  131. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.d.ts +352 -0
  132. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.js +388 -0
  133. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics-test-responses.js.map +1 -0
  134. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.d.ts +62 -0
  135. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.js +388 -0
  136. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.js.map +1 -0
  137. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.test.d.ts +2 -0
  138. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.test.js +978 -0
  139. package/dist/es/src/library/services/vendor-implementations/plantronics/plantronics.test.js.map +1 -0
  140. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.d.ts +42 -0
  141. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.js +251 -0
  142. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.js.map +1 -0
  143. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.test.d.ts +1 -0
  144. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.test.js +680 -0
  145. package/dist/es/src/library/services/vendor-implementations/sennheiser/sennheiser.test.js.map +1 -0
  146. package/dist/es/src/library/services/vendor-implementations/sennheiser/types.d.ts +40 -0
  147. package/dist/es/src/library/services/vendor-implementations/sennheiser/types.js +29 -0
  148. package/dist/es/src/library/services/vendor-implementations/sennheiser/types.js.map +1 -0
  149. package/dist/es/src/library/services/vendor-implementations/vendor-implementation.d.ts +49 -0
  150. package/dist/es/src/library/services/vendor-implementations/vendor-implementation.js +95 -0
  151. package/dist/es/src/library/services/vendor-implementations/vendor-implementation.js.map +1 -0
  152. package/dist/es/src/library/services/vendor-implementations/vendor-implemntation.test.d.ts +1 -0
  153. package/dist/es/src/library/services/vendor-implementations/vendor-implemntation.test.js +104 -0
  154. package/dist/es/src/library/services/vendor-implementations/vendor-implemntation.test.js.map +1 -0
  155. package/dist/es/src/library/test-utils.d.ts +16 -0
  156. package/dist/es/src/library/test-utils.js +38 -0
  157. package/dist/es/src/library/test-utils.js.map +1 -0
  158. package/dist/es/src/library/types/call-info.d.ts +4 -0
  159. package/dist/es/src/library/types/call-info.js +2 -0
  160. package/dist/es/src/library/types/call-info.js.map +1 -0
  161. package/dist/es/src/library/types/consumed-headset-events.d.ts +32 -0
  162. package/dist/es/src/library/types/consumed-headset-events.js +15 -0
  163. package/dist/es/src/library/types/consumed-headset-events.js.map +1 -0
  164. package/dist/es/src/library/types/device-info.d.ts +8 -0
  165. package/dist/es/src/library/types/device-info.js +2 -0
  166. package/dist/es/src/library/types/device-info.js.map +1 -0
  167. package/dist/es/src/library/types/emitted-headset-events.d.ts +34 -0
  168. package/dist/es/src/library/types/emitted-headset-events.js +2 -0
  169. package/dist/es/src/library/types/emitted-headset-events.js.map +1 -0
  170. package/dist/es/src/library/types/headset-states.d.ts +10 -0
  171. package/dist/es/src/library/types/headset-states.js +2 -0
  172. package/dist/es/src/library/types/headset-states.js.map +1 -0
  173. package/dist/es/src/library/utils.d.ts +14 -0
  174. package/dist/es/src/library/utils.js +69 -0
  175. package/dist/es/src/library/utils.js.map +1 -0
  176. package/dist/es/src/library/utils.test.d.ts +1 -0
  177. package/dist/es/src/library/utils.test.js +44 -0
  178. package/dist/es/src/library/utils.test.js.map +1 -0
  179. package/dist/es/src/mocks/call.d.ts +11 -0
  180. package/dist/es/src/mocks/call.js +52 -0
  181. package/dist/es/src/mocks/call.js.map +1 -0
  182. package/dist/es/src/mocks/device-service.d.ts +8 -0
  183. package/dist/es/src/mocks/device-service.js +41 -0
  184. package/dist/es/src/mocks/device-service.js.map +1 -0
  185. package/dist/es/src/setupTests.d.ts +1 -0
  186. package/dist/es/src/setupTests.js +6 -0
  187. package/dist/es/src/setupTests.js.map +1 -0
  188. package/package.json +2 -2
@@ -0,0 +1,945 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const jabra_1 = __importDefault(require("./jabra"));
16
+ const rxjs_1 = require("rxjs");
17
+ const jabra_js_1 = require("@gnaudio/jabra-js");
18
+ const broadcast_channel_1 = require("broadcast-channel");
19
+ require("regenerator-runtime");
20
+ const mock_jabra_sdk_1 = require("./mock-jabra-sdk");
21
+ jest.mock('broadcast-channel');
22
+ const flushPromises = () => Promise.resolve();
23
+ const exceptionWithType = (message, type) => {
24
+ const error = new Error();
25
+ error.message = message;
26
+ error.type = type;
27
+ return error;
28
+ };
29
+ const createMockCallControl = (deviceSignalsObservable) => {
30
+ return {
31
+ device: jest.fn(),
32
+ onDisconnect: jest.fn(),
33
+ deviceSignals: deviceSignalsObservable,
34
+ takeCallLock: jest.fn().mockResolvedValue(null),
35
+ releaseCallLock: jest.fn(),
36
+ offHook: jest.fn(),
37
+ ring: jest.fn(),
38
+ mute: jest.fn(),
39
+ hold: jest.fn(),
40
+ };
41
+ };
42
+ const mockDevice1 = {
43
+ id: 123,
44
+ name: 'Test Label 123',
45
+ vendorId: 2830,
46
+ productId: 3648,
47
+ serialNumber: '123456789'
48
+ };
49
+ const mockDevice2 = {
50
+ id: 456,
51
+ name: 'Test Label 456',
52
+ vendorId: 2831,
53
+ productId: 3649,
54
+ serialNumber: '1234567891'
55
+ };
56
+ const initializeSdk = (subject) => __awaiter(void 0, void 0, void 0, function* () {
57
+ if (!subject) {
58
+ const deviceList = [
59
+ mockDevice1
60
+ ];
61
+ subject = new rxjs_1.BehaviorSubject(deviceList);
62
+ }
63
+ return new mock_jabra_sdk_1.MockJabraSdk(subject);
64
+ });
65
+ describe('JabraService', () => {
66
+ let jabraService;
67
+ Object.defineProperty(window.navigator, 'hid', {
68
+ get: () => ({
69
+ getDevices: () => {
70
+ return [];
71
+ },
72
+ }),
73
+ });
74
+ Object.defineProperty(window.navigator, 'locks', { get: () => ({}) });
75
+ window.BroadcastChannel = broadcast_channel_1.BroadcastChannel;
76
+ beforeEach(() => {
77
+ jabraService = jabra_1.default.getInstance({ logger: console, createNew: true });
78
+ jabraService.initializeJabraSdk = initializeSdk;
79
+ });
80
+ describe('instantiation', () => {
81
+ it('should be a singleton', () => {
82
+ const jabraService2 = jabra_1.default.getInstance({ logger: console });
83
+ expect(jabraService).not.toBeFalsy();
84
+ expect(jabraService2).not.toBeFalsy();
85
+ expect(jabraService).toBe(jabraService2);
86
+ });
87
+ it('should have the correct vendorName', () => {
88
+ expect(jabraService.vendorName).toEqual('Jabra');
89
+ });
90
+ });
91
+ describe('various functions', () => {
92
+ it('deviceLabelMatchesVendor', () => {
93
+ let result;
94
+ result = jabraService.deviceLabelMatchesVendor('Test Jabra Label');
95
+ expect(result).toBe(true);
96
+ result = jabraService.deviceLabelMatchesVendor('Something totally different');
97
+ expect(result).toBe(false);
98
+ });
99
+ it('resets the state', () => {
100
+ const setMuteSpy = jest.spyOn(jabraService, 'setMute');
101
+ const setHoldSpy = jest.spyOn(jabraService, 'setHold');
102
+ jabraService.resetState();
103
+ expect(setMuteSpy).toHaveBeenCalledWith(false);
104
+ expect(setHoldSpy).toHaveBeenCalledWith(null, false);
105
+ });
106
+ });
107
+ describe('initial connection', () => {
108
+ it('should use existing jabraSdk and connect', () => __awaiter(void 0, void 0, void 0, function* () {
109
+ jabraService.jabraSdk = (yield initializeSdk());
110
+ const deviceSignalsSubject = new rxjs_1.Subject();
111
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
112
+ jabraService.callControlFactory = {
113
+ createCallControl: () => __awaiter(void 0, void 0, void 0, function* () {
114
+ return callControl;
115
+ })
116
+ };
117
+ const testLabel = 'test label 123';
118
+ const initSdkSpy = jabraService['initializeJabraSdk'] = jest.fn();
119
+ yield jabraService.connect(testLabel);
120
+ expect(initSdkSpy).not.toHaveBeenCalled();
121
+ expect(jabraService.isConnected).toBe(true);
122
+ expect(jabraService.isConnecting).toBe(false);
123
+ }));
124
+ it('should init jabra sdk and connect', () => __awaiter(void 0, void 0, void 0, function* () {
125
+ const processEventsSpy = jest.spyOn(jabraService, '_processEvents');
126
+ const deviceSignalsSubject = new rxjs_1.Subject();
127
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
128
+ const callControlFactorySpy = jest
129
+ .spyOn(jabraService, 'createCallControlFactory')
130
+ .mockReturnValue({
131
+ createCallControl: () => __awaiter(void 0, void 0, void 0, function* () {
132
+ return callControl;
133
+ }),
134
+ });
135
+ const testLabel = 'test label 123';
136
+ yield jabraService.connect(testLabel);
137
+ expect(callControlFactorySpy).toHaveBeenCalled();
138
+ expect(processEventsSpy).toHaveBeenCalledWith(callControl);
139
+ expect(jabraService.isConnected).toBe(true);
140
+ expect(jabraService.isConnecting).toBe(false);
141
+ }));
142
+ it('should do nothing if trying to connect', () => __awaiter(void 0, void 0, void 0, function* () {
143
+ const statusChangeSpy = jest.spyOn(jabraService, 'changeConnectionStatus');
144
+ jabraService.isConnecting = true;
145
+ yield jabraService.connect('someDevice');
146
+ expect(statusChangeSpy).not.toHaveBeenCalled();
147
+ }));
148
+ it('should connect with previouslyConnectedDevice', () => __awaiter(void 0, void 0, void 0, function* () {
149
+ const statusChangeSpy = jest.spyOn(jabraService, 'changeConnectionStatus');
150
+ jest.spyOn(jabraService, 'getPreviouslyConnectedDevice').mockResolvedValue(mockDevice2);
151
+ const callControl = createMockCallControl(new rxjs_1.Subject().asObservable());
152
+ jest
153
+ .spyOn(jabraService, 'createCallControlFactory')
154
+ .mockReturnValue({
155
+ createCallControl: () => __awaiter(void 0, void 0, void 0, function* () {
156
+ return callControl;
157
+ }),
158
+ });
159
+ yield jabraService.connect(mockDevice2.name);
160
+ expect(statusChangeSpy).toHaveBeenCalledWith({ isConnected: true, isConnecting: false });
161
+ }));
162
+ it('should connect with webhidRequest', () => __awaiter(void 0, void 0, void 0, function* () {
163
+ const statusChangeSpy = jest.spyOn(jabraService, 'changeConnectionStatus');
164
+ jest.spyOn(jabraService, 'getPreviouslyConnectedDevice').mockResolvedValue(null);
165
+ const webhidSpy = jest.spyOn(jabraService, 'getDeviceFromWebhid').mockResolvedValue(mockDevice2);
166
+ const callControl = createMockCallControl(new rxjs_1.Subject().asObservable());
167
+ jest
168
+ .spyOn(jabraService, 'createCallControlFactory')
169
+ .mockReturnValue({
170
+ createCallControl: () => __awaiter(void 0, void 0, void 0, function* () {
171
+ return callControl;
172
+ }),
173
+ });
174
+ yield jabraService.connect(mockDevice2.name);
175
+ expect(webhidSpy).toHaveBeenCalled();
176
+ expect(statusChangeSpy).toHaveBeenCalledWith({ isConnected: true, isConnecting: false });
177
+ }));
178
+ it('should fail to connect and set statuses accordingly', () => __awaiter(void 0, void 0, void 0, function* () {
179
+ const statusChangeSpy = jest.spyOn(jabraService, 'changeConnectionStatus');
180
+ jest.spyOn(jabraService, 'getPreviouslyConnectedDevice').mockResolvedValue(null);
181
+ const callControlSpy = jest.fn();
182
+ const callControl = createMockCallControl(new rxjs_1.Subject().asObservable());
183
+ jest
184
+ .spyOn(jabraService, 'createCallControlFactory')
185
+ .mockReturnValue({
186
+ createCallControl: callControl
187
+ });
188
+ const webhidSpy = jest.spyOn(jabraService, 'getDeviceFromWebhid').mockRejectedValue({});
189
+ yield jabraService.connect(mockDevice2.name);
190
+ expect(webhidSpy).toHaveBeenCalled();
191
+ expect(callControlSpy).not.toHaveBeenCalled();
192
+ expect(statusChangeSpy).lastCalledWith({ isConnected: false, isConnecting: false });
193
+ }));
194
+ });
195
+ describe('processEvents', () => {
196
+ it('properly handles answer call events passed in from headset', () => __awaiter(void 0, void 0, void 0, function* () {
197
+ jabraService.callLock = true;
198
+ const deviceAnsweredCallSpy = jest.spyOn(jabraService, 'deviceAnsweredCall'); // const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
199
+ const deviceSignalsSubject = new rxjs_1.Subject();
200
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
201
+ jabraService._processEvents(callControl);
202
+ deviceSignalsSubject.next({ type: 32, value: true });
203
+ expect(callControl.offHook).toHaveBeenCalledWith(true);
204
+ expect(callControl.ring).toHaveBeenCalledWith(false);
205
+ expect(deviceAnsweredCallSpy).toHaveBeenCalled();
206
+ }));
207
+ it('properly handles end call events passed in from headset with a successful callLock release', () => __awaiter(void 0, void 0, void 0, function* () {
208
+ jabraService.callLock = true;
209
+ const deviceEndedCallSpy = jest.spyOn(jabraService, 'deviceEndedCall');
210
+ const deviceSignalsSubject = new rxjs_1.Subject();
211
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
212
+ jabraService._processEvents(callControl);
213
+ deviceSignalsSubject.next({ type: 32, value: false });
214
+ expect(callControl.mute).toHaveBeenCalledWith(false);
215
+ expect(callControl.hold).toHaveBeenCalledWith(false);
216
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
217
+ expect(deviceEndedCallSpy).toHaveBeenCalled();
218
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
219
+ expect(jabraService.callLock).toBe(false);
220
+ }));
221
+ it('properly handles end call events passed in from headset with a failed callLock release', () => __awaiter(void 0, void 0, void 0, function* () {
222
+ jabraService.callLock = true;
223
+ const deviceEndedCallSpy = jest.spyOn(jabraService, 'deviceEndedCall');
224
+ const deviceSignalsSubject = new rxjs_1.Subject();
225
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
226
+ jabraService._processEvents(callControl);
227
+ const exceptionWithType = (message, type) => {
228
+ const error = new Error();
229
+ error.message = message;
230
+ error.type = type;
231
+ return error;
232
+ };
233
+ callControl.releaseCallLock.mockImplementation(() => {
234
+ throw exceptionWithType('Trying to release the call lock, but it is not held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
235
+ });
236
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
237
+ deviceSignalsSubject.next({ type: 32, value: false });
238
+ expect(callControl.mute).toHaveBeenCalledWith(false);
239
+ expect(callControl.hold).toHaveBeenCalledWith(false);
240
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
241
+ expect(deviceEndedCallSpy).toHaveBeenCalled();
242
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
243
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to release the call lock, but it is not held!');
244
+ }));
245
+ it('properly logs an error that is not related to call lock during end call flow', () => __awaiter(void 0, void 0, void 0, function* () {
246
+ jabraService.callLock = true;
247
+ const deviceEndedCallSpy = jest.spyOn(jabraService, 'deviceEndedCall');
248
+ const deviceSignalsSubject = new rxjs_1.Subject();
249
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
250
+ jabraService._processEvents(callControl);
251
+ const exceptionWithType = (message, type) => {
252
+ const error = new Error();
253
+ error.message = message;
254
+ error.type = type;
255
+ return error;
256
+ };
257
+ callControl.releaseCallLock.mockImplementation(() => {
258
+ throw exceptionWithType('Something went terribly wrong', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
259
+ });
260
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
261
+ deviceSignalsSubject.next({ type: 32, value: false });
262
+ expect(callControl.mute).toHaveBeenCalledWith(false);
263
+ expect(callControl.hold).toHaveBeenCalledWith(false);
264
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
265
+ expect(deviceEndedCallSpy).toHaveBeenCalled();
266
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
267
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'Something went terribly wrong');
268
+ }));
269
+ it('properly handles hold call events passed in from headset', () => __awaiter(void 0, void 0, void 0, function* () {
270
+ jabraService.callLock = true;
271
+ const deviceHoldStatusChangedSpy = jest.spyOn(jabraService, 'deviceHoldStatusChanged');
272
+ const deviceSignalsSubject = new rxjs_1.Subject();
273
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
274
+ jabraService._processEvents(callControl);
275
+ jabraService.activeConversationId = 'myConvo5521';
276
+ deviceSignalsSubject.next({ type: 33, value: true });
277
+ expect(jabraService.isHeld).toBe(true);
278
+ expect(callControl.hold).toHaveBeenCalledWith(true);
279
+ expect(deviceHoldStatusChangedSpy).toHaveBeenCalledWith({
280
+ holdRequested: true,
281
+ code: 33,
282
+ name: 'OnHold',
283
+ conversationId: jabraService.activeConversationId
284
+ });
285
+ deviceSignalsSubject.next({ type: 35, value: true });
286
+ expect(jabraService.isHeld).toBe(false);
287
+ expect(callControl.hold).toHaveBeenCalledWith(false);
288
+ expect(deviceHoldStatusChangedSpy).toHaveBeenCalledWith({
289
+ holdRequested: false,
290
+ code: 35,
291
+ name: 'ResumeCall',
292
+ conversationId: jabraService.activeConversationId
293
+ });
294
+ }));
295
+ it('properly handles mute call events passed in from headset', () => __awaiter(void 0, void 0, void 0, function* () {
296
+ jabraService.callLock = true;
297
+ const deviceMuteChangedSpy = jest.spyOn(jabraService, 'deviceMuteChanged');
298
+ const deviceSignalsSubject = new rxjs_1.Subject();
299
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
300
+ jabraService._processEvents(callControl);
301
+ jabraService.activeConversationId = 'myConvo555521';
302
+ deviceSignalsSubject.next({ type: 47, value: true });
303
+ expect(jabraService.isMuted).toBe(true);
304
+ expect(callControl.mute).toHaveBeenCalledWith(true);
305
+ expect(deviceMuteChangedSpy).toHaveBeenCalledWith({
306
+ isMuted: true,
307
+ code: 47,
308
+ name: 'CallMuted',
309
+ conversationId: jabraService.activeConversationId
310
+ });
311
+ deviceSignalsSubject.next({ type: 47, value: true });
312
+ expect(jabraService.isMuted).toBe(false);
313
+ expect(callControl.mute).toHaveBeenCalledWith(false);
314
+ expect(deviceMuteChangedSpy).toHaveBeenCalledWith({
315
+ isMuted: false,
316
+ code: 47,
317
+ name: 'CallUnmuted',
318
+ conversationId: jabraService.activeConversationId
319
+ });
320
+ }));
321
+ it('properly handles reject call events passed in from headset with a successful callLock release', () => __awaiter(void 0, void 0, void 0, function* () {
322
+ jabraService.callLock = true;
323
+ const conversationId = 'convoId1234';
324
+ jabraService.pendingConversationId = conversationId;
325
+ const deviceRejectedCallSpy = jest.spyOn(jabraService, 'deviceRejectedCall');
326
+ const deviceSignalsSubject = new rxjs_1.Subject();
327
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
328
+ jabraService._processEvents(callControl);
329
+ deviceSignalsSubject.next({ type: 65533, value: true });
330
+ expect(callControl.ring).toHaveBeenCalledWith(false);
331
+ expect(deviceRejectedCallSpy).toHaveBeenCalledWith({ conversationId, name: 'REJECT_CALL' });
332
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
333
+ expect(jabraService.callLock).toBe(false);
334
+ }));
335
+ it('properly handles reject call events passed in from headset with a failed callLock release', () => __awaiter(void 0, void 0, void 0, function* () {
336
+ jabraService.callLock = true;
337
+ const conversationId = 'convoId124234';
338
+ jabraService.pendingConversationId = conversationId;
339
+ const deviceRejectedCallSpy = jest.spyOn(jabraService, 'deviceRejectedCall');
340
+ const deviceSignalsSubject = new rxjs_1.Subject();
341
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
342
+ jabraService._processEvents(callControl);
343
+ const exceptionWithType = (message, type) => {
344
+ const error = new Error();
345
+ error.message = message;
346
+ error.type = type;
347
+ return error;
348
+ };
349
+ callControl.releaseCallLock.mockImplementation(() => {
350
+ throw exceptionWithType('Trying to release the call lock, but it is not held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
351
+ });
352
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
353
+ deviceSignalsSubject.next({ type: 65533, value: true });
354
+ expect(callControl.ring).toHaveBeenCalledWith(false);
355
+ expect(deviceRejectedCallSpy).toHaveBeenCalledWith({ conversationId, name: 'REJECT_CALL' });
356
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
357
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to release the call lock, but it is not held!');
358
+ }));
359
+ it('properly logs an error that is not related to call lock during reject call flow', () => __awaiter(void 0, void 0, void 0, function* () {
360
+ jabraService.callLock = true;
361
+ const conversationId = 'convoId1524';
362
+ jabraService.pendingConversationId = conversationId;
363
+ const deviceRejectedCallSpy = jest.spyOn(jabraService, 'deviceRejectedCall');
364
+ const deviceSignalsSubject = new rxjs_1.Subject();
365
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
366
+ jabraService._processEvents(callControl);
367
+ const exceptionWithType = (message, type) => {
368
+ const error = new Error();
369
+ error.message = message;
370
+ error.type = type;
371
+ return error;
372
+ };
373
+ callControl.releaseCallLock.mockImplementation(() => {
374
+ throw exceptionWithType('Something went terribly wrong', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
375
+ });
376
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
377
+ deviceSignalsSubject.next({ type: 65533, value: true });
378
+ expect(callControl.ring).toHaveBeenCalledWith(false);
379
+ expect(deviceRejectedCallSpy).toHaveBeenCalledWith({ conversationId, name: 'REJECT_CALL' });
380
+ expect(yield callControl.releaseCallLock).toHaveBeenCalled();
381
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'Something went terribly wrong');
382
+ }));
383
+ it('properly logs a debug message if we do not have the callLock by the time we start the subscribing to processEvents', () => __awaiter(void 0, void 0, void 0, function* () {
384
+ const deviceSignalsSubject = new rxjs_1.Subject();
385
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
386
+ jabraService._processEvents(callControl);
387
+ jabraService.callLock = false;
388
+ const debugLoggerSpy = jest.spyOn(jabraService.logger, 'debug');
389
+ deviceSignalsSubject.next({ type: 32, value: true });
390
+ expect(debugLoggerSpy).toHaveBeenCalledWith('Currently not in possession of the Call Lock; Cannot react to Device Actions');
391
+ }));
392
+ });
393
+ describe('setMute', () => {
394
+ it('properly sends the event to the headset and updates the state', () => __awaiter(void 0, void 0, void 0, function* () {
395
+ jabraService.callLock = true;
396
+ const deviceSignalsSubject = new rxjs_1.Subject();
397
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
398
+ jabraService.callControl = callControl;
399
+ jabraService.setMute(true);
400
+ expect(jabraService.isMuted).toBe(true);
401
+ expect(callControl.mute).toHaveBeenCalledWith(true);
402
+ jabraService.setMute(false);
403
+ expect(jabraService.isMuted).toBe(false);
404
+ expect(callControl.mute).toHaveBeenCalledWith(false);
405
+ }));
406
+ it('does not do anything if we dont own the callLock', () => {
407
+ jabraService.callLock = false;
408
+ const deviceSignalsSubject = new rxjs_1.Subject();
409
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
410
+ jabraService.callControl = callControl;
411
+ const muteResult = jabraService.setMute(true);
412
+ expect(jabraService.isMuted).toBe(false);
413
+ expect(callControl.mute).not.toHaveBeenCalled();
414
+ expect(muteResult).resolves.toBe(undefined);
415
+ });
416
+ });
417
+ describe('setHold', () => {
418
+ it('properly sends the event to the headset and updates the state', () => {
419
+ jabraService.callLock = true;
420
+ const deviceSignalsSubject = new rxjs_1.Subject();
421
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
422
+ jabraService.callControl = callControl;
423
+ jabraService.setHold('123', true);
424
+ expect(jabraService.isHeld).toBe(true);
425
+ expect(callControl.hold).toHaveBeenCalledWith(true);
426
+ jabraService.setHold('123', false);
427
+ expect(jabraService.isHeld).toBe(false);
428
+ expect(callControl.hold).toHaveBeenCalledWith(false);
429
+ });
430
+ it('does not do anything if we dont own the callLock', () => {
431
+ jabraService.callLock = false;
432
+ const deviceSignalsSubject = new rxjs_1.Subject();
433
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
434
+ jabraService.callControl = callControl;
435
+ const holdResult = jabraService.setHold('123', true);
436
+ expect(jabraService.isHeld).toBe(false);
437
+ expect(callControl.hold).not.toHaveBeenCalled();
438
+ expect(holdResult).resolves.toBe(undefined);
439
+ });
440
+ });
441
+ describe('disconnect', () => {
442
+ it('resets two connected flags after disconnecting', () => __awaiter(void 0, void 0, void 0, function* () {
443
+ jabraService.isConnected = true;
444
+ jabraService.isConnecting = true;
445
+ const unsubscribeSpy = jest.fn();
446
+ jabraService['headsetEventSubscription'] = {
447
+ unsubscribe: unsubscribeSpy
448
+ };
449
+ yield jabraService.disconnect();
450
+ expect(unsubscribeSpy).toHaveBeenCalled();
451
+ expect(jabraService.isConnecting).toBe(false);
452
+ expect(jabraService.isConnected).toBe(false);
453
+ }));
454
+ it('should only change connection status if connecting or connected', () => __awaiter(void 0, void 0, void 0, function* () {
455
+ const connectionSpy = jabraService['changeConnectionStatus'] = jest.fn();
456
+ jabraService.isConnected = false;
457
+ jabraService.isConnecting = false;
458
+ jabraService['headsetEventSubscription'] = {
459
+ unsubscribe: jest.fn()
460
+ };
461
+ yield jabraService.disconnect();
462
+ expect(connectionSpy).not.toHaveBeenCalled();
463
+ jabraService.isConnected = true;
464
+ yield jabraService.disconnect();
465
+ expect(connectionSpy).toHaveBeenCalled();
466
+ jabraService.isConnected = false;
467
+ jabraService.isConnecting = false;
468
+ yield jabraService.disconnect();
469
+ expect(connectionSpy).toHaveBeenCalled();
470
+ }));
471
+ });
472
+ describe('answerCall', () => {
473
+ it('sends answer call event to headset', () => {
474
+ jabraService.callLock = true;
475
+ const deviceSignalsSubject = new rxjs_1.Subject();
476
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
477
+ jabraService.callControl = callControl;
478
+ jabraService.answerCall();
479
+ expect(callControl.offHook).toHaveBeenCalledWith(true);
480
+ });
481
+ it('does not do anything if we dont own the callLock', () => {
482
+ jabraService.callLock = false;
483
+ const deviceSignalsSubject = new rxjs_1.Subject();
484
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
485
+ jabraService.callControl = callControl;
486
+ const answerCallResult = jabraService.answerCall();
487
+ expect(callControl.offHook).not.toHaveBeenCalled();
488
+ expect(answerCallResult).resolves.toBe(undefined);
489
+ });
490
+ });
491
+ describe('incomingCall', () => {
492
+ it('sends ring event based on flags after properly taking callLock', () => __awaiter(void 0, void 0, void 0, function* () {
493
+ const deviceSignalsSubject = new rxjs_1.Subject();
494
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
495
+ jabraService.callControl = callControl;
496
+ const callInfo = {
497
+ conversationId: '123',
498
+ contactName: 'Lee Moriarty',
499
+ };
500
+ callControl.takeCallLock.mockResolvedValue(true);
501
+ yield jabraService.incomingCall(callInfo);
502
+ expect(jabraService.callLock).toBe(true);
503
+ expect(callControl.ring).toHaveBeenCalledWith(true);
504
+ }));
505
+ it('should do nothing if no calllock', () => __awaiter(void 0, void 0, void 0, function* () {
506
+ const deviceSignalsSubject = new rxjs_1.Subject();
507
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
508
+ jabraService.callControl = callControl;
509
+ callControl.takeCallLock.mockResolvedValue(false);
510
+ const callInfo = {
511
+ conversationId: '123',
512
+ contactName: 'Lee Moriarty',
513
+ };
514
+ yield jabraService.incomingCall(callInfo);
515
+ expect(jabraService.callLock).toBe(false);
516
+ expect(callControl.ring).not.toHaveBeenCalled();
517
+ }));
518
+ it('sends ring event based on flags after already having callLock', () => __awaiter(void 0, void 0, void 0, function* () {
519
+ const deviceSignalsSubject = new rxjs_1.Subject();
520
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
521
+ jabraService.callControl = callControl;
522
+ const callInfo = {
523
+ conversationId: '456',
524
+ contactName: 'Adam Cole',
525
+ };
526
+ callControl.takeCallLock.mockImplementation(() => {
527
+ throw exceptionWithType('Trying to take the call lock, but it is already held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
528
+ });
529
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
530
+ yield jabraService.incomingCall(callInfo);
531
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to take the call lock, but it is already held!');
532
+ expect(callControl.ring).toHaveBeenCalledWith(true);
533
+ }));
534
+ it('handles unexpected error, unrelated to callLock', () => __awaiter(void 0, void 0, void 0, function* () {
535
+ const deviceSignalsSubject = new rxjs_1.Subject();
536
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
537
+ jabraService.callControl = callControl;
538
+ const callInfo = {
539
+ conversationId: '789',
540
+ contactName: 'Gene Ween',
541
+ };
542
+ callControl.takeCallLock.mockImplementation(() => {
543
+ throw exceptionWithType('An actual error', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
544
+ });
545
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
546
+ yield jabraService.incomingCall(callInfo);
547
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'An actual error');
548
+ expect(callControl.ring).not.toHaveBeenCalled();
549
+ }));
550
+ });
551
+ describe('outgoingCall', () => {
552
+ it('sends offHook event after properly taking callLock', () => __awaiter(void 0, void 0, void 0, function* () {
553
+ const deviceSignalsSubject = new rxjs_1.Subject();
554
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
555
+ jabraService.callControl = callControl;
556
+ callControl.takeCallLock.mockResolvedValue(true);
557
+ yield jabraService.outgoingCall({ conversationId: 'myconvoid1' });
558
+ expect(jabraService.callLock).toBe(true);
559
+ expect(callControl.offHook).toHaveBeenCalledWith(true);
560
+ }));
561
+ it('does nothing if callLock is false', () => __awaiter(void 0, void 0, void 0, function* () {
562
+ const deviceSignalsSubject = new rxjs_1.Subject();
563
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
564
+ callControl.takeCallLock.mockResolvedValue(false);
565
+ jabraService.callControl = callControl;
566
+ yield jabraService.outgoingCall({ conversationId: 'myconvoid2' });
567
+ expect(jabraService.callLock).toBe(false);
568
+ expect(jabraService.activeConversationId).toBeFalsy();
569
+ expect(callControl.offHook).not.toHaveBeenCalled();
570
+ }));
571
+ it('sends ring event while already in possession of callLock', () => __awaiter(void 0, void 0, void 0, function* () {
572
+ const deviceSignalsSubject = new rxjs_1.Subject();
573
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
574
+ jabraService.callControl = callControl;
575
+ callControl.takeCallLock.mockImplementation(() => {
576
+ throw exceptionWithType('Trying to take the call lock, but it is already held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
577
+ });
578
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
579
+ yield jabraService.outgoingCall({ conversationId: 'myconvoid2' });
580
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to take the call lock, but it is already held!');
581
+ expect(callControl.offHook).toHaveBeenCalledWith(true);
582
+ }));
583
+ it('handles unexpected error, unrelated to callLock', () => __awaiter(void 0, void 0, void 0, function* () {
584
+ const deviceSignalsSubject = new rxjs_1.Subject();
585
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
586
+ jabraService.callControl = callControl;
587
+ callControl.takeCallLock.mockImplementation(() => {
588
+ throw exceptionWithType('An actual error', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
589
+ });
590
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
591
+ yield jabraService.outgoingCall({ conversationId: 'myconvoid3' });
592
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'An actual error');
593
+ expect(callControl.offHook).not.toHaveBeenCalled();
594
+ }));
595
+ });
596
+ describe('rejectCall', () => {
597
+ it('properly sends ring events and releases call lock', () => __awaiter(void 0, void 0, void 0, function* () {
598
+ const deviceSignalsSubject = new rxjs_1.Subject();
599
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
600
+ jabraService.callControl = callControl;
601
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
602
+ jabraService.callLock = true;
603
+ yield jabraService.rejectCall();
604
+ expect(callControl.ring).toHaveBeenCalledWith(false);
605
+ expect(callControl.releaseCallLock).toHaveBeenCalled();
606
+ expect(jabraService.callLock).toBe(false);
607
+ expect(resetStateSpy).toHaveBeenCalled();
608
+ }));
609
+ it('prints out message if not in possession of callLock', () => __awaiter(void 0, void 0, void 0, function* () {
610
+ const deviceSignalsSubject = new rxjs_1.Subject();
611
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
612
+ jabraService.callControl = callControl;
613
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
614
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
615
+ yield jabraService.rejectCall();
616
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Currently not in possession of the Call Lock; Cannot react to Device Actions');
617
+ expect(jabraService.callLock).toBe(false);
618
+ expect(resetStateSpy).toHaveBeenCalled();
619
+ }));
620
+ it('properly handles flow when in possession of callLock', () => {
621
+ const deviceSignalsSubject = new rxjs_1.Subject();
622
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
623
+ jabraService.callControl = callControl;
624
+ jabraService.callLock = true;
625
+ callControl.releaseCallLock.mockImplementation(() => {
626
+ throw exceptionWithType('Trying to release the call lock, but it is not held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
627
+ });
628
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
629
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
630
+ jabraService.rejectCall();
631
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to release the call lock, but it is not held!');
632
+ expect(jabraService.callLock).toBe(false);
633
+ expect(resetStateSpy).toHaveBeenCalled();
634
+ });
635
+ it('properly handles error unrelated callLock', () => {
636
+ const deviceSignalsSubject = new rxjs_1.Subject();
637
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
638
+ jabraService.callControl = callControl;
639
+ jabraService.callLock = true;
640
+ callControl.releaseCallLock.mockImplementation(() => {
641
+ throw exceptionWithType('Something much worse', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
642
+ });
643
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
644
+ jabraService.rejectCall();
645
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'Something much worse');
646
+ });
647
+ });
648
+ describe('endCall', () => {
649
+ it('properly sends offHook events and releases call lock', () => __awaiter(void 0, void 0, void 0, function* () {
650
+ const deviceSignalsSubject = new rxjs_1.Subject();
651
+ jabraService.activeConversationId = '123';
652
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
653
+ jabraService.callControl = callControl;
654
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
655
+ jabraService.callLock = true;
656
+ yield jabraService.endCall('123', false);
657
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
658
+ expect(callControl.releaseCallLock).toHaveBeenCalled();
659
+ expect(jabraService.callLock).toBe(false);
660
+ expect(resetStateSpy).toHaveBeenCalled();
661
+ expect(jabraService.activeConversationId).toBeNull();
662
+ }));
663
+ it('properly resolves if another call is already in place', () => __awaiter(void 0, void 0, void 0, function* () {
664
+ const deviceSignalsSubject = new rxjs_1.Subject();
665
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
666
+ jabraService.callControl = callControl;
667
+ yield jabraService.endCall('123', true);
668
+ expect(callControl.offHook).not.toHaveBeenCalled();
669
+ }));
670
+ it('prints out message if not in possession of callLock', () => __awaiter(void 0, void 0, void 0, function* () {
671
+ const deviceSignalsSubject = new rxjs_1.Subject();
672
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
673
+ jabraService.callControl = callControl;
674
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
675
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
676
+ yield jabraService.endCall('123', false);
677
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Currently not in possession of the Call Lock; Cannot react to Device Actions');
678
+ expect(jabraService.callLock).toBe(false);
679
+ expect(resetStateSpy).toHaveBeenCalled();
680
+ }));
681
+ it('properly handles flow when in possession of callLock', () => {
682
+ const deviceSignalsSubject = new rxjs_1.Subject();
683
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
684
+ jabraService.callControl = callControl;
685
+ jabraService.callLock = true;
686
+ callControl.releaseCallLock.mockImplementation(() => {
687
+ throw exceptionWithType('Trying to release the call lock, but it is not held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
688
+ });
689
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
690
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
691
+ jabraService.endCall('123', false);
692
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to release the call lock, but it is not held!');
693
+ expect(jabraService.callLock).toBe(false);
694
+ expect(resetStateSpy).toHaveBeenCalled();
695
+ });
696
+ it('properly handles error unrelated callLock', () => {
697
+ const deviceSignalsSubject = new rxjs_1.Subject();
698
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
699
+ jabraService.callControl = callControl;
700
+ jabraService.callLock = true;
701
+ callControl.releaseCallLock.mockImplementation(() => {
702
+ throw exceptionWithType('Something much worse', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
703
+ });
704
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
705
+ jabraService.endCall('123', false);
706
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'Something much worse');
707
+ });
708
+ });
709
+ describe('endAllCall', () => {
710
+ it('properly sends offHook events and releases call lock', () => __awaiter(void 0, void 0, void 0, function* () {
711
+ const deviceSignalsSubject = new rxjs_1.Subject();
712
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
713
+ jabraService.callControl = callControl;
714
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
715
+ jabraService.callLock = true;
716
+ yield jabraService.endAllCalls();
717
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
718
+ expect(callControl.releaseCallLock).toHaveBeenCalled();
719
+ expect(jabraService.callLock).toBe(false);
720
+ expect(resetStateSpy).toHaveBeenCalled();
721
+ }));
722
+ it('prints out message if not in possession of callLock', () => __awaiter(void 0, void 0, void 0, function* () {
723
+ const deviceSignalsSubject = new rxjs_1.Subject();
724
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
725
+ jabraService.callControl = callControl;
726
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
727
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
728
+ yield jabraService.endAllCalls();
729
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Currently not in possession of the Call Lock; Cannot react to Device Actions');
730
+ expect(jabraService.callLock).toBe(false);
731
+ expect(resetStateSpy).toHaveBeenCalled();
732
+ }));
733
+ it('properly handles flow when in possession of callLock', () => {
734
+ const deviceSignalsSubject = new rxjs_1.Subject();
735
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
736
+ jabraService.callControl = callControl;
737
+ jabraService.callLock = true;
738
+ callControl.releaseCallLock.mockImplementation(() => {
739
+ throw exceptionWithType('Trying to release the call lock, but it is not held!', jabra_js_1.ErrorType.SDK_USAGE_ERROR);
740
+ });
741
+ const infoLoggerSpy = jest.spyOn(jabraService.logger, 'info');
742
+ const resetStateSpy = jest.spyOn(jabraService, 'resetState');
743
+ jabraService.endAllCalls();
744
+ expect(infoLoggerSpy).toHaveBeenCalledWith('Trying to release the call lock, but it is not held!');
745
+ expect(jabraService.callLock).toBe(false);
746
+ expect(resetStateSpy).toHaveBeenCalled();
747
+ });
748
+ it('properly handles error unrelated callLock', () => {
749
+ const deviceSignalsSubject = new rxjs_1.Subject();
750
+ const callControl = createMockCallControl(deviceSignalsSubject.asObservable());
751
+ jabraService.callControl = callControl;
752
+ jabraService.callLock = true;
753
+ callControl.releaseCallLock.mockImplementation(() => {
754
+ throw exceptionWithType('Something much worse', jabra_js_1.ErrorType.UNEXPECTED_ERROR);
755
+ });
756
+ const errorLoggerSpy = jest.spyOn(jabraService.logger, 'error');
757
+ jabraService.endAllCalls();
758
+ expect(errorLoggerSpy).toHaveBeenCalledWith(jabra_js_1.ErrorType.UNEXPECTED_ERROR, 'Something much worse');
759
+ });
760
+ });
761
+ describe('deviceInfo', () => {
762
+ it('should return _deviceInfo', () => {
763
+ const device = {
764
+ ProductName: 'myJabra',
765
+ deviceId: '123',
766
+ attached: true,
767
+ };
768
+ jabraService._deviceInfo = device;
769
+ expect(jabraService.deviceInfo).toBe(device);
770
+ });
771
+ });
772
+ describe('deviceName', () => {
773
+ it('should return the deviceName of the active device', () => {
774
+ const device = {
775
+ ProductName: 'myJabra',
776
+ deviceName: 'myJabraName',
777
+ deviceId: '123',
778
+ attached: true,
779
+ };
780
+ jabraService._deviceInfo = device;
781
+ expect(jabraService.deviceName).toBe(device.deviceName);
782
+ });
783
+ it('should return falsey value if no deviceInfo', () => {
784
+ jabraService._deviceInfo = null;
785
+ expect(jabraService.deviceName).toBeUndefined();
786
+ });
787
+ });
788
+ describe('isDeviceAttached', () => {
789
+ it('should return true if there is deviceInfo', () => {
790
+ const device = {
791
+ ProductName: 'myJabra',
792
+ deviceName: 'myJabraName',
793
+ deviceId: '123',
794
+ attached: true,
795
+ };
796
+ jabraService._deviceInfo = device;
797
+ expect(jabraService.isDeviceAttached).toEqual(true);
798
+ });
799
+ it('should return false if no deviceInfo', () => {
800
+ jabraService._deviceInfo = null;
801
+ expect(jabraService.isDeviceAttached).toEqual(false);
802
+ });
803
+ });
804
+ describe('isSupported', () => {
805
+ it('should return true if proper values are met', () => {
806
+ expect(jabraService.isSupported()).toBe(true);
807
+ });
808
+ it('should return false if proper values are not met', () => {
809
+ Object.defineProperty(window, '_HostedContextFunctions', { get: () => true });
810
+ expect(jabraService.isSupported()).toBe(false);
811
+ });
812
+ });
813
+ describe('isDeviceInList', () => {
814
+ it('should return false if device is undefined', () => {
815
+ expect(jabraService.isDeviceInList(undefined, 'Test Label 123')).toBe(false);
816
+ });
817
+ it('should return false if name within device is undefined', () => {
818
+ const testDevice = {
819
+ type: 'Test',
820
+ id: '123',
821
+ };
822
+ expect(jabraService.isDeviceInList(testDevice, 'Test Label 123')).toBe(false);
823
+ });
824
+ it('should return true if all expected values are present and the label matches', () => {
825
+ const testDevice = {
826
+ type: 'Test',
827
+ id: '123',
828
+ name: 'Test Label 123',
829
+ };
830
+ expect(jabraService.isDeviceInList(testDevice, 'test label 123')).toBe(true);
831
+ });
832
+ });
833
+ describe('resetHeadsetState', () => {
834
+ it('should handle reset being called without a callControl', () => __awaiter(void 0, void 0, void 0, function* () {
835
+ yield jabraService.resetHeadsetState();
836
+ // if the above didn't blow up, we are happy
837
+ expect(true).toBeTruthy();
838
+ }));
839
+ it('should reset state if there is a callControl', () => __awaiter(void 0, void 0, void 0, function* () {
840
+ const callControl = createMockCallControl(null);
841
+ jabraService.callControl = callControl;
842
+ yield jabraService.resetHeadsetState();
843
+ expect(callControl.hold).toHaveBeenCalledWith(false);
844
+ expect(callControl.mute).toHaveBeenCalledWith(false);
845
+ expect(callControl.offHook).toHaveBeenCalledWith(false);
846
+ }));
847
+ });
848
+ describe('getDeviceFromWebhid', () => {
849
+ afterEach(() => {
850
+ jest.useRealTimers();
851
+ });
852
+ it('should return matching value from deviceList', () => __awaiter(void 0, void 0, void 0, function* () {
853
+ const sub = new rxjs_1.BehaviorSubject([mockDevice1]);
854
+ jabraService.jabraSdk = (yield initializeSdk(sub));
855
+ const requestSpy = jabraService.requestWebHidPermissions = jest.fn();
856
+ const completionSpy = jest.fn();
857
+ const devicePromise = jabraService.getDeviceFromWebhid(mockDevice2.name)
858
+ .then((device) => {
859
+ completionSpy();
860
+ return device;
861
+ });
862
+ yield flushPromises();
863
+ expect(requestSpy).toHaveBeenCalled();
864
+ expect(completionSpy).not.toBeCalled();
865
+ sub.next([mockDevice1, mockDevice2]);
866
+ const device = yield devicePromise;
867
+ expect(device).toBe(mockDevice2);
868
+ }));
869
+ it('should timeout after 30 seconds', () => __awaiter(void 0, void 0, void 0, function* () {
870
+ jest.useFakeTimers();
871
+ const sub = new rxjs_1.BehaviorSubject([mockDevice1]);
872
+ jabraService.jabraSdk = (yield initializeSdk(sub));
873
+ const requestSpy = jabraService.requestWebHidPermissions = jest.fn();
874
+ const devicePromise = jabraService.getDeviceFromWebhid(mockDevice2.name);
875
+ yield flushPromises();
876
+ expect(requestSpy).toHaveBeenCalled();
877
+ jest.advanceTimersByTime(30100);
878
+ yield expect(devicePromise).rejects.toThrow('not granted WebHID permissions');
879
+ }));
880
+ it('should log random error', () => __awaiter(void 0, void 0, void 0, function* () {
881
+ const sub = new rxjs_1.BehaviorSubject([mockDevice1]);
882
+ jabraService.jabraSdk = (yield initializeSdk(sub));
883
+ const requestSpy = jabraService.requestWebHidPermissions = jest.fn();
884
+ const devicePromise = jabraService.getDeviceFromWebhid(mockDevice2.name);
885
+ yield flushPromises();
886
+ expect(requestSpy).toHaveBeenCalled();
887
+ sub.error(new Error('random error'));
888
+ yield expect(devicePromise).rejects.toThrow('random error');
889
+ }));
890
+ });
891
+ describe('getPreviouslyConnectedDevice', () => {
892
+ afterEach(() => {
893
+ jest.useRealTimers();
894
+ });
895
+ it('should return matching value from deviceList', () => __awaiter(void 0, void 0, void 0, function* () {
896
+ const sub = new rxjs_1.BehaviorSubject([]);
897
+ jabraService.jabraSdk = (yield initializeSdk(sub));
898
+ const completionSpy = jest.fn();
899
+ const devicePromise = jabraService.getPreviouslyConnectedDevice(mockDevice2.name)
900
+ .then((device) => {
901
+ completionSpy();
902
+ return device;
903
+ });
904
+ yield flushPromises();
905
+ expect(completionSpy).not.toBeCalled();
906
+ sub.next([mockDevice1, mockDevice2]);
907
+ const device = yield devicePromise;
908
+ expect(device).toBe(mockDevice2);
909
+ }));
910
+ it('should return null', () => __awaiter(void 0, void 0, void 0, function* () {
911
+ const sub = new rxjs_1.BehaviorSubject([mockDevice1]);
912
+ jabraService.jabraSdk = (yield initializeSdk(sub));
913
+ const completionSpy = jest.fn();
914
+ const devicePromise = jabraService.getPreviouslyConnectedDevice(mockDevice2.name)
915
+ .then((device) => {
916
+ completionSpy();
917
+ return device;
918
+ });
919
+ yield flushPromises();
920
+ expect(completionSpy).not.toBeCalled();
921
+ sub.next([mockDevice1, mockDevice2]);
922
+ const device = yield devicePromise;
923
+ expect(device).toBeNull();
924
+ }));
925
+ it('should timeout after 3 seconds', () => __awaiter(void 0, void 0, void 0, function* () {
926
+ jest.useFakeTimers();
927
+ const sub = new rxjs_1.BehaviorSubject([]);
928
+ jabraService.jabraSdk = (yield initializeSdk(sub));
929
+ const devicePromise = jabraService.getPreviouslyConnectedDevice(mockDevice2.name);
930
+ yield flushPromises();
931
+ jest.advanceTimersByTime(3100);
932
+ const device = yield devicePromise;
933
+ expect(device).toBeFalsy();
934
+ }));
935
+ it('should log random error', () => __awaiter(void 0, void 0, void 0, function* () {
936
+ const sub = new rxjs_1.BehaviorSubject([]);
937
+ jabraService.jabraSdk = (yield initializeSdk(sub));
938
+ const devicePromise = jabraService.getPreviouslyConnectedDevice(mockDevice2.name);
939
+ yield flushPromises();
940
+ sub.error(new Error('random error'));
941
+ yield expect(devicePromise).rejects.toThrow('random error');
942
+ }));
943
+ });
944
+ });
945
+ //# sourceMappingURL=jabra.test.js.map