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