@jibb-open/jssdk 3.5.8 → 3.5.10

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 (83) hide show
  1. package/api/admin.js +418 -0
  2. package/api/auth.js +246 -0
  3. package/api/eventbus.js +249 -0
  4. package/api/index.js +53 -0
  5. package/api/meeting.js +488 -0
  6. package/api/recording.js +260 -0
  7. package/api/superadmin.js +105 -0
  8. package/api/user.js +51 -0
  9. package/api/webexbot.js +41 -0
  10. package/api/whiteboard.js +179 -0
  11. package/config.js +16 -0
  12. package/examples/browser/462.jibb.js +306 -0
  13. package/{src/examples → examples}/browser/index.html +0 -0
  14. package/examples/browser/jibb.js +7381 -0
  15. package/examples/browser/startSession.js +102 -0
  16. package/{src/examples → examples}/examples.js +1 -0
  17. package/examples/webexDevicesMacros/cameraPresets/jibb.js +280 -0
  18. package/examples/webexDevicesMacros/simplestExample/jibb.js +182 -0
  19. package/examples/webexDevicesMacros/webexDevice JSSDK/jibb_WebexXapi.js +3033 -0
  20. package/examples/webexDevicesMacros/withCameraControl/jibb.js +264 -0
  21. package/package.json +1 -1
  22. package/post-processing.js +43 -0
  23. package/types/exceptions.js +55 -0
  24. package/{src/types → types}/jibb.pb.js +5 -38
  25. package/types/proto.js +15 -0
  26. package/types/types.js +67 -0
  27. package/utils/cached_variable.js +25 -0
  28. package/utils/future.js +31 -0
  29. package/utils/http/http.axios.js +41 -0
  30. package/utils/http/index.js +10 -0
  31. package/utils/index.js +11 -0
  32. package/utils/logger/index.js +19 -0
  33. package/utils/logger/logger.empty.js +25 -0
  34. package/utils/logger/logger.pino.js +19 -0
  35. package/ws/connection_base.js +95 -0
  36. package/ws/eventbus.js +376 -0
  37. package/ws/index.js +36 -0
  38. package/ws/ipsa.js +262 -0
  39. package/ws/meeting.js +181 -0
  40. package/ws/observable_connection.js +87 -0
  41. package/ws/retry_connection.js +94 -0
  42. package/.babelrc +0 -31
  43. package/README.md +0 -4
  44. package/src/api/admin.js +0 -333
  45. package/src/api/auth.js +0 -208
  46. package/src/api/eventbus.js +0 -246
  47. package/src/api/index.js +0 -26
  48. package/src/api/meeting.js +0 -421
  49. package/src/api/recording.js +0 -225
  50. package/src/api/superadmin.js +0 -84
  51. package/src/api/user.js +0 -46
  52. package/src/api/webexbot.js +0 -32
  53. package/src/api/whiteboard.js +0 -175
  54. package/src/config.js +0 -12
  55. package/src/examples/browser/462.jibb.js +0 -1
  56. package/src/examples/browser/jibb.js +0 -2
  57. package/src/examples/browser/startSession.js +0 -112
  58. package/src/examples/webexDevicesMacros/cameraPresets/jibb.js +0 -338
  59. package/src/examples/webexDevicesMacros/simplestExample/jibb.js +0 -212
  60. package/src/examples/webexDevicesMacros/webexDevice JSSDK/jibb_WebexXapi.js +0 -2
  61. package/src/examples/webexDevicesMacros/withCameraControl/jibb.js +0 -303
  62. package/src/index.webex-devices.js +0 -13
  63. package/src/post-processing.js +0 -39
  64. package/src/types/exceptions.js +0 -48
  65. package/src/types/proto.js +0 -7
  66. package/src/types/types.js +0 -64
  67. package/src/utils/cached_variable.js +0 -23
  68. package/src/utils/future.js +0 -24
  69. package/src/utils/http/http.axios.js +0 -34
  70. package/src/utils/http/http.xapi.js +0 -87
  71. package/src/utils/http/index.js +0 -8
  72. package/src/utils/index.js +0 -5
  73. package/src/utils/logger/index.js +0 -11
  74. package/src/utils/logger/logger.empty.js +0 -25
  75. package/src/utils/logger/logger.pino.js +0 -15
  76. package/src/ws/connection_base.js +0 -81
  77. package/src/ws/eventbus.js +0 -363
  78. package/src/ws/index.js +0 -15
  79. package/src/ws/ipsa.js +0 -246
  80. package/src/ws/meeting.js +0 -170
  81. package/src/ws/observable_connection.js +0 -84
  82. package/src/ws/retry_connection.js +0 -82
  83. package/webpack.config.cjs +0 -144
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/es.promise.js");
4
+ /**
5
+ *
6
+ *
7
+ * <h2>Browser start session example.</h2>
8
+ *
9
+ * <ul style="list-style: none;">
10
+ * <li> Click on source to see the script example.
11
+ * <li> Check the html example below for full example were jibb.js is the sdk.
12
+ * </ul>
13
+ *
14
+ * @example
15
+ * <!DOCTYPE html>
16
+ * <html>
17
+ * <body>
18
+ *
19
+ * <h1>The script testing start session</h1>
20
+ * <script type="module">
21
+ * import * as JIBB from './jibb.js'
22
+ * </script>
23
+ * <script type="module" src="startSession.js">
24
+ * </script>
25
+ *
26
+ * </body>
27
+ * </html>
28
+ * @name Browser Start Session
29
+ * @memberof Examples
30
+ *
31
+ */
32
+
33
+ let MeetingAPI = JIBB.Meeting;
34
+ let Auth = JIBB.Auth;
35
+ let EventBus = JIBB.EventBus;
36
+ const SurfaceType = {
37
+ PAPER: "PAPER",
38
+ WHITEBOARD: "WHITEBOARD"
39
+ };
40
+ function Config(apiKey) {
41
+ this.apiKey = apiKey;
42
+ this.webURL = "https://app.jibb.ai";
43
+ Auth.setApiKey(this.apiKey);
44
+ }
45
+ var meetingId = "";
46
+ function sleep(ms) {
47
+ return new Promise(resolve => setTimeout(resolve, ms));
48
+ }
49
+ function openInNewTab(url) {
50
+ console.log("openInNewTab ...");
51
+ // needs to be opened in a different app so that the script continue, browser might stop popup for this example, click allow popup.
52
+ window.open(url, "_blank");
53
+ }
54
+ async function generateMeetingLink() {
55
+ console.log("generating meeting link ...");
56
+ let userToken = await Auth.getUserToken();
57
+ let title = "start Session example";
58
+ meetingId = await MeetingAPI.createMeeting({
59
+ title: title,
60
+ isTemporary: true
61
+ });
62
+ let url = "".concat(config.webURL, "/remote/").concat(meetingId, "?user_token=").concat(userToken);
63
+ return url;
64
+ }
65
+ async function StartMeeting() {
66
+ console.log("StartMeeting ...");
67
+ let url = await generateMeetingLink();
68
+ openInNewTab(url);
69
+ // waiting for browser to open the URL, next calls needs to be done after the link is opened
70
+ await sleep(10000);
71
+
72
+ // getting the opened browser client ID
73
+ let statusList = await EventBus.getClientStatusList();
74
+ let clinetID = statusList[0].id;
75
+
76
+ // asking the browser for the availble camera Ids, make sure camera access is already allowed.
77
+ let cameraList = await EventBus.getCameraList(clinetID);
78
+ if (cameraList.length) {
79
+ //preparing the startstream request
80
+ // getting meeting token, required for any meeting related requests.
81
+ let meetingToken = await MeetingAPI.getMeetingToken({
82
+ meetingId: meetingId,
83
+ permission: 2
84
+ });
85
+ let surfaceType = SurfaceType.WHITEBOARD;
86
+ //choose desired camera
87
+ let cameraId = cameraList[1].id;
88
+ let req = {
89
+ meetingId: meetingId,
90
+ meetingToken: meetingToken,
91
+ surfaceType: surfaceType,
92
+ cameraId: cameraId,
93
+ clientId: clinetID
94
+ };
95
+ await EventBus.startStream(req);
96
+ } else return Promise.reject("No Camera Access");
97
+ }
98
+ async function main() {
99
+ StartMeeting();
100
+ }
101
+ let config = new Config("a2ec50bc-76cf-4d4c-8b54-b6b664f3815c");
102
+ main();
@@ -3,3 +3,4 @@
3
3
  * @namespace Examples
4
4
  *
5
5
  */
6
+ "use strict";
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/web.dom-collections.iterator.js");
4
+ require("core-js/modules/es.promise.js");
5
+ require("core-js/modules/es.parse-int.js");
6
+ var _xapi = _interopRequireDefault();
7
+ var JIBB = _interopRequireWildcard(require("./jibb_WebexXapi"));
8
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
9
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ /**
12
+ *
13
+ *
14
+ * <h2>webex Device Macro Camera Presets example.</h2>
15
+ *
16
+ * <ul style="list-style: none;">
17
+ * <li>Click on source to see the script example.
18
+ * </ul>
19
+ * <h3>File Discribtion</h3>
20
+ * <ul style="list-style: square;">
21
+ * <li> jibb.js -> entry point.
22
+ * <li> jibbWebexXapi.js -> jibb SDK responsbile HTPP requests.
23
+ * </ul>
24
+ * <h3>Installation</h3>
25
+ * <ul style="list-style: circle;">
26
+ * <li> downalod/get jibb.js.
27
+ * <li> Get jibbWebexXapi.js from "www.s3.*******.com" for latest jibb sdk or you could use the file in webexDevice jssdk folder (could be out of date).
28
+ * <li> Log into your Cisco Room Device as and admin.
29
+ * <li> Navigate to the Macro Editor.
30
+ * <li> Import and Save each of the following Macros into the Room System: jibbWebexXapi.js and jibb.js .
31
+ * <li> Edite jibb.js by adding camera postion to sanp to when clicked in line 189, 237, 239 or comment lines.
32
+ * <li> Edite jibb.js by adding your personal Jibb Api Key to in line 182, to get your Api key visit https://app.jibb.ai/ then navigate to personal settings and click Generate.
33
+ * <li> Save and activate jibb.js .
34
+ * <li> After refreshing the webage you will find jibb panel automatically added in the UI Extension Editor. variable uiExtension line 172 is is the exported XML panel
35
+ * </ul>
36
+ *
37
+ * @name webexDevice Camera Presets
38
+ * @memberof Examples
39
+ *
40
+ */
41
+
42
+ let MeetingAPI = JIBB.Meeting;
43
+ let Auth = JIBB.Auth;
44
+ let EventBus = JIBB.EventBus;
45
+ const SurfaceType = {
46
+ PAPER: "PAPER",
47
+ WHITEBOARD: "WHITEBOARD"
48
+ };
49
+ function Config(apiKey) {
50
+ this.apiKey = apiKey;
51
+ this.webURL = "https://app.jibb.ai";
52
+ _xapi.default.Command.WebEngine.MediaAccess.add({
53
+ Hostname: "app.jibb.ai",
54
+ Device: "Camera"
55
+ });
56
+ _xapi.default.Command.WebEngine.MediaAccess.add({
57
+ Hostname: "app.jibb.ai",
58
+ Device: "Microphone"
59
+ });
60
+ JIBB.Auth.setApiKey(this.apiKey);
61
+ }
62
+ async function generateMeetingLink() {
63
+ console.log("generating meeting link ...");
64
+ var title = String(await _xapi.default.Config.SystemUnit.CustomDeviceId.get());
65
+ if (String(title) == "") {
66
+ title = "webex";
67
+ }
68
+ let userToken = await Auth.getUserToken();
69
+ meetingId = await MeetingAPI.createMeeting({
70
+ title: title,
71
+ isTemporary: true
72
+ });
73
+ let url = "".concat(config.webURL, "/remote/").concat(meetingId, "?user_token=").concat(userToken);
74
+ return url;
75
+ }
76
+ async function autoStartMeeting() {
77
+ console.log("autoStartMeeting ...");
78
+ _xapi.default.Command.UserInterface.Extensions.Panel.Close();
79
+ let url = await generateMeetingLink();
80
+ await _xapi.default.Command.UserInterface.WebView.Display({
81
+ Title: "jibb",
82
+ Url: url
83
+ });
84
+ await sleep(10000);
85
+ let statusList = await EventBus.getClientStatusList();
86
+ let clinetID = statusList[0].id;
87
+ let cameraList = await EventBus.getCameraList(clinetID);
88
+ if (cameraList.length) {
89
+ let meetingToken = await MeetingAPI.getMeetingToken({
90
+ meetingId: meetingId,
91
+ permission: 2
92
+ });
93
+ let surfaceType = SurfaceType.WHITEBOARD;
94
+ let cameraId = cameraList[0].id;
95
+ let req = {
96
+ meetingId: meetingId,
97
+ meetingToken: meetingToken,
98
+ surfaceType: surfaceType,
99
+ cameraId: cameraId,
100
+ clientId: clinetID,
101
+ enableColor: true
102
+ };
103
+ await EventBus.startStream(req);
104
+ } else return Promise.reject("No Camera Access");
105
+ }
106
+ async function stopMeeting() {
107
+ console.log("stopMeeting ...");
108
+ _xapi.default.Command.UserInterface.WebView.Clear({
109
+ Target: "PersistentWebApp"
110
+ });
111
+ _xapi.default.Command.Video.Selfview.Set({
112
+ FullscreenMode: "Off",
113
+ Mode: "Off",
114
+ PIPPosition: "LowerRight"
115
+ });
116
+ _xapi.default.Command.UserInterface.Extensions.Panel.Close();
117
+ }
118
+ async function zoomIn() {
119
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Zoom.get();
120
+ value = parseInt(value) - 100;
121
+ _xapi.default.Command.Camera.PositionSet({
122
+ CameraId: "1",
123
+ Zoom: value
124
+ });
125
+ }
126
+ async function zoomOut() {
127
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Zoom.get();
128
+ value = parseInt(value) + 100;
129
+ _xapi.default.Command.Camera.PositionSet({
130
+ CameraId: "1",
131
+ Zoom: value
132
+ });
133
+ }
134
+ async function moveUp() {
135
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Tilt.get();
136
+ value = parseInt(value) + 100;
137
+ _xapi.default.Command.Camera.PositionSet({
138
+ CameraId: "1",
139
+ Tilt: value
140
+ });
141
+ }
142
+ async function moveDown() {
143
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Tilt.get();
144
+ value = parseInt(value) - 100;
145
+ _xapi.default.Command.Camera.PositionSet({
146
+ CameraId: "1",
147
+ Tilt: value
148
+ });
149
+ }
150
+ async function moveRigt() {
151
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Pan.get();
152
+ value = parseInt(value) - 100;
153
+ _xapi.default.Command.Camera.PositionSet({
154
+ CameraId: "1",
155
+ Pan: value
156
+ });
157
+ }
158
+ async function moveLeft() {
159
+ let value = await _xapi.default.Status.Cameras.Camera[1].Position.Pan.get();
160
+ value = parseInt(value) + 100;
161
+ _xapi.default.Command.Camera.PositionSet({
162
+ CameraId: "1",
163
+ Pan: value
164
+ });
165
+ }
166
+ async function resetCamera() {
167
+ _xapi.default.Command.Camera.PositionReset({
168
+ Axis: "all",
169
+ CameraId: 1
170
+ });
171
+ }
172
+ async function setCameraPosition(_ref) {
173
+ let {
174
+ Pan,
175
+ Tilt,
176
+ Zoom
177
+ } = _ref;
178
+ _xapi.default.Command.Camera.PositionSet({
179
+ CameraId: "1",
180
+ Pan: Pan,
181
+ Tilt: Tilt,
182
+ Zoom: Zoom
183
+ });
184
+ }
185
+
186
+ // Add the management panel to UI
187
+ async function addPanel() {
188
+ console.info("Adding panel");
189
+ const xml = uiExtension;
190
+ await _xapi.default.Command.UserInterface.Extensions.Panel.Save({
191
+ PanelId: "jibb_panel"
192
+ }, xml);
193
+
194
+ // Update manager on layout change
195
+ _xapi.default.Event.UserInterface.Extensions.Widget.LayoutUpdated.once(addPanel);
196
+ }
197
+ function sleep(ms) {
198
+ return new Promise(resolve => setTimeout(resolve, ms));
199
+ }
200
+ let config = new Config("yourApiKey");
201
+ var meetingId = "";
202
+ // Startup!
203
+ async function main() {
204
+ addPanel();
205
+ _xapi.default.Event.UserInterface.Extensions.Panel.Clicked.on(value => {
206
+ if (value.PanelId == "jibb_panel") {
207
+ setCameraPosition({
208
+ Pan: 981,
209
+ Tilt: 42,
210
+ Zoom: 4586
211
+ });
212
+ _xapi.default.Command.Video.Selfview.Set({
213
+ FullscreenMode: "Off",
214
+ Mode: "On",
215
+ PIPPosition: "LowerRight"
216
+ });
217
+ }
218
+ });
219
+ _xapi.default.Event.UserInterface.Extensions.Widget.Action.on(event => {
220
+ if (event.Type == "released") {
221
+ switch (event.WidgetId) {
222
+ case "jibb_start_toggle":
223
+ console.log("start toggle" + event.Value);
224
+ if (event.Value == "start") {
225
+ autoStartMeeting();
226
+ } else if (event.Value == "stop") {
227
+ stopMeeting();
228
+ }
229
+ break;
230
+ case "jibb_zoom_in":
231
+ zoomIn();
232
+ break;
233
+ case "jibb_zoom_out":
234
+ zoomOut();
235
+ break;
236
+ case "jibb_camera_control":
237
+ switch (event.Value) {
238
+ case "up":
239
+ moveUp();
240
+ break;
241
+ case "down":
242
+ moveDown();
243
+ break;
244
+ case "right":
245
+ moveRigt();
246
+ break;
247
+ case "left":
248
+ moveLeft();
249
+ break;
250
+ case "center":
251
+ resetCamera();
252
+ break;
253
+ default:
254
+ break;
255
+ }
256
+ break;
257
+ case "jibb_Camera_preset":
258
+ console.log("start toggle" + event.Value);
259
+ if (event.Value == "position_1") {
260
+ setCameraPosition({
261
+ Pan: 981,
262
+ Tilt: 42,
263
+ Zoom: 4586
264
+ });
265
+ } else if (event.Value == "position_2") {
266
+ setCameraPosition({
267
+ Pan: 400,
268
+ Tilt: 80,
269
+ Zoom: 4586
270
+ });
271
+ }
272
+ break;
273
+ default:
274
+ break;
275
+ }
276
+ }
277
+ });
278
+ }
279
+ const uiExtension = "<Extensions>\n <Version>1.9</Version>\n <Panel>\n <Order>3</Order>\n <PanelId>jibb_panel</PanelId>\n <Origin>local</Origin>\n <Location>HomeScreenAndCallControls</Location>\n <Icon>Custom</Icon>\n <Name>JIBB</Name>\n <ActivityType>Custom</ActivityType>\n <CustomIcon>\n <Content>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</Content>\n <Id>d5c72d04a0311f930447729e1331908693ed5d5494d6e1003149ddb0a4a5ed95</Id>\n </CustomIcon>\n <Page>\n <Name>JIBB</Name>\n <Row>\n <Name/>\n </Row>\n <Row>\n <Name>Session</Name>\n <Widget>\n <WidgetId>jibb_start_toggle</WidgetId>\n <Type>GroupButton</Type>\n <Options>size=4</Options>\n <ValueSpace>\n <Value>\n <Key>start</Key>\n <Name>Start</Name>\n </Value>\n <Value>\n <Key>stop</Key>\n <Name>Stop</Name>\n </Value>\n </ValueSpace>\n </Widget>\n </Row>\n <Row>\n <Name>Camera Preset</Name>\n <Widget>\n <WidgetId>jibb_Camera_preset</WidgetId>\n <Type>GroupButton</Type>\n <Options>size=4</Options>\n <ValueSpace>\n <Value>\n <Key>position_1</Key>\n <Name>Camera Position 1</Name>\n </Value>\n <Value>\n <Key>position_2</Key>\n <Name>Camera Position 1</Name>\n </Value>\n </ValueSpace>\n </Widget>\n </Row>\n <Row>\n <Name/>\n </Row>\n <Options>hideRowNames=0</Options>\n </Page>\n <Page>\n <Name>Camera</Name>\n <Row>\n <Name>Row</Name>\n <Widget>\n <WidgetId>jibb_camera_control</WidgetId>\n <Type>DirectionalPad</Type>\n <Options>size=4</Options>\n </Widget>\n </Row>\n <Row>\n <Name>Row</Name>\n <Widget>\n <WidgetId>jibb_zoom_out</WidgetId>\n <Type>Button</Type>\n <Options>size=1;icon=zoom_out</Options>\n </Widget>\n <Widget>\n <WidgetId>jibb_zoom_in</WidgetId>\n <Type>Button</Type>\n <Options>size=1;icon=zoom_in</Options>\n </Widget>\n </Row>\n <Options>hideRowNames=1</Options>\n </Page>\n </Panel>\n</Extensions>\n ";
280
+ main();
@@ -0,0 +1,182 @@
1
+ "use strict";
2
+
3
+ require("core-js/modules/web.dom-collections.iterator.js");
4
+ require("core-js/modules/es.promise.js");
5
+ var _xapi = _interopRequireDefault();
6
+ var JIBB = _interopRequireWildcard(require("./jibb_WebexXapi"));
7
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
8
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10
+ /**
11
+ *
12
+ *
13
+ * <h2>webex Device Macro simple example.</h2>
14
+ *
15
+ * <ul style="list-style: none;">
16
+ * <li>Click on source to see the script example.
17
+ * </ul>
18
+ * <h3>File Discribtion</h3>
19
+ * <ul style="list-style: square;">
20
+ * <li> jibb.js -> entry point.
21
+ * <li> jibbWebexXapi.js -> jibb SDK responsbile HTPP requests.
22
+ * </ul>
23
+ * <h3>Installation</h3>
24
+ * <ul style="list-style: circle;">
25
+ * <li> downalod/get jibb.js.
26
+ * <li> Get jibbWebexXapi.js from "www.s3.*******.com" for latest jibb sdk or you could use the file in webexDevice jssdk folder (could be out of date).
27
+ * <li> Log into your Cisco Room Device as and admin.
28
+ * <li> Navigate to the Macro Editor.
29
+ * <li> Import and Save each of the following Macros into the Room System: jibbWebexXapi.js and jibb.js .
30
+ * <li> Edite jibb.js by adding camera postion to sanp to when clicked in line 114 or comment line 150 to disable it.
31
+ * <li> Edite jibb.js by adding your personal Jibb Api Key to in line 143, to get your Api key visit https://app.jibb.ai/ then navigate to personal settings and click Generate.
32
+ * <li> Save and activate jibb.js .
33
+ * <li> After refreshing the webage you will find jibb panel automatically added in the UI Extension Editor. variable uiExtension line 172 is is the exported XML panel
34
+ * </ul>
35
+ *
36
+ * @name webexDevice simple
37
+ * @memberof Examples
38
+ *
39
+ */
40
+
41
+ let MeetingAPI = JIBB.Meeting;
42
+ let Auth = JIBB.Auth;
43
+ let EventBus = JIBB.EventBus;
44
+ const SurfaceType = {
45
+ PAPER: "PAPER",
46
+ WHITEBOARD: "WHITEBOARD"
47
+ };
48
+ function Config(apiKey) {
49
+ this.apiKey = apiKey;
50
+ this.webURL = "https://app.jibb.ai";
51
+ _xapi.default.Command.WebEngine.MediaAccess.add({
52
+ Hostname: "app.jibb.ai",
53
+ Device: "Camera"
54
+ });
55
+ _xapi.default.Command.WebEngine.MediaAccess.add({
56
+ Hostname: "app.jibb.ai",
57
+ Device: "Microphone"
58
+ });
59
+ JIBB.Auth.setApiKey(this.apiKey);
60
+ }
61
+ async function generateMeetingLink() {
62
+ console.log("generating meeting link ...");
63
+ var title = String(await _xapi.default.Config.SystemUnit.CustomDeviceId.get());
64
+ if (String(title) == "") {
65
+ title = "webex";
66
+ }
67
+ let userToken = await Auth.getUserToken();
68
+ meetingId = await MeetingAPI.createMeeting({
69
+ title: title,
70
+ isTemporary: true
71
+ });
72
+ let url = "".concat(config.webURL, "/remote/").concat(meetingId, "?user_token=").concat(userToken);
73
+ return url;
74
+ }
75
+ async function autoStartMeeting() {
76
+ console.log("autoStartMeeting ...");
77
+ _xapi.default.Command.UserInterface.Extensions.Panel.Close();
78
+ let url = await generateMeetingLink();
79
+ await _xapi.default.Command.UserInterface.WebView.Display({
80
+ Title: "jibb",
81
+ Url: url
82
+ });
83
+ await sleep(10000);
84
+ let statusList = await EventBus.getClientStatusList();
85
+ let clinetID = statusList[0].id;
86
+ let cameraList = await EventBus.getCameraList(clinetID);
87
+ if (cameraList.length) {
88
+ let meetingToken = await MeetingAPI.getMeetingToken({
89
+ meetingId: meetingId,
90
+ permission: 2
91
+ });
92
+ let surfaceType = SurfaceType.WHITEBOARD;
93
+ let cameraId = cameraList[0].id;
94
+ let req = {
95
+ meetingId: meetingId,
96
+ meetingToken: meetingToken,
97
+ surfaceType: surfaceType,
98
+ cameraId: cameraId,
99
+ clientId: clinetID,
100
+ enableColor: false
101
+ };
102
+ await EventBus.startStream(req);
103
+ } else return Promise.reject("No Camera Access");
104
+ }
105
+ async function stopMeeting() {
106
+ console.log("stopMeeting ...");
107
+ _xapi.default.Command.UserInterface.WebView.Clear({
108
+ Target: "PersistentWebApp"
109
+ });
110
+ _xapi.default.Command.Video.Selfview.Set({
111
+ FullscreenMode: "Off",
112
+ Mode: "Off",
113
+ PIPPosition: "LowerRight"
114
+ });
115
+ _xapi.default.Command.UserInterface.Extensions.Panel.Close();
116
+ }
117
+ async function setCameraPosition(_ref) {
118
+ let {
119
+ Pan,
120
+ Tilt,
121
+ Zoom
122
+ } = _ref;
123
+ _xapi.default.Command.Camera.PositionSet({
124
+ CameraId: "1",
125
+ Pan: Pan,
126
+ Tilt: Tilt,
127
+ Zoom: Zoom
128
+ });
129
+ }
130
+
131
+ // Add the management panel to UI
132
+ async function addPanel() {
133
+ console.info("Adding panel");
134
+ const xml = uiExtension;
135
+ await _xapi.default.Command.UserInterface.Extensions.Panel.Save({
136
+ PanelId: "jibb_panel"
137
+ }, xml);
138
+
139
+ // Update manager on layout change
140
+ _xapi.default.Event.UserInterface.Extensions.Widget.LayoutUpdated.once(addPanel);
141
+ }
142
+ function sleep(ms) {
143
+ return new Promise(resolve => setTimeout(resolve, ms));
144
+ }
145
+ let config = new Config("64f9fe98-dd9d-4285-bb82-668debfa4a5c");
146
+ var meetingId = "";
147
+ // Startup!
148
+ async function main() {
149
+ addPanel();
150
+ _xapi.default.Event.UserInterface.Extensions.Panel.Clicked.on(value => {
151
+ if (value.PanelId == "jibb_panel") {
152
+ setCameraPosition({
153
+ Pan: 981,
154
+ Tilt: 42,
155
+ Zoom: 4586
156
+ });
157
+ _xapi.default.Command.Video.Selfview.Set({
158
+ FullscreenMode: "Off",
159
+ Mode: "On",
160
+ PIPPosition: "LowerRight"
161
+ });
162
+ }
163
+ });
164
+ _xapi.default.Event.UserInterface.Extensions.Widget.Action.on(event => {
165
+ if (event.Type == "released") {
166
+ switch (event.WidgetId) {
167
+ case "jibb_start_toggle":
168
+ console.log("start toggle" + event.Value);
169
+ if (event.Value == "start") {
170
+ autoStartMeeting();
171
+ } else if (event.Value == "stop") {
172
+ stopMeeting();
173
+ }
174
+ break;
175
+ default:
176
+ break;
177
+ }
178
+ }
179
+ });
180
+ }
181
+ const uiExtension = "<Extensions>\n<Version>1.9</Version>\n<Panel>\n <Order>1</Order>\n <PanelId>jibb_panel</PanelId>\n <Location>HomeScreenAndCallControls</Location>\n <Icon>Custom</Icon>\n <Name>JIBB</Name>\n <ActivityType>Custom</ActivityType>\n <CustomIcon>\n\t<Content>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</Content>\n\t<Id>d5c72d04a0311f930447729e1331908693ed5d5494d6e1003149ddb0a4a5ed95</Id>\n </CustomIcon>\n <Page>\n\t<Name>JIBB</Name>\n\t<Row>\n\t <Name>Row</Name>\n\t <Widget>\n\t\t<WidgetId>jibb_start_toggle</WidgetId>\n\t\t<Type>GroupButton</Type>\n\t\t<Options>size=4</Options>\n\t\t<ValueSpace>\n\t\t <Value>\n\t\t\t<Key>start</Key>\n\t\t\t<Name>Start</Name>\n\t\t </Value>\n\t\t <Value>\n\t\t\t<Key>stop</Key>\n\t\t\t<Name>Stop</Name>\n\t\t </Value>\n\t\t</ValueSpace>\n\t </Widget>\n\t</Row>\n\t<Options>hideRowNames=1</Options>\n </Page>\n</Panel>\n</Extensions>\n ";
182
+ main();