@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.
- package/api/admin.js +418 -0
- package/api/auth.js +246 -0
- package/api/eventbus.js +249 -0
- package/api/index.js +53 -0
- package/api/meeting.js +488 -0
- package/api/recording.js +260 -0
- package/api/superadmin.js +105 -0
- package/api/user.js +51 -0
- package/api/webexbot.js +41 -0
- package/api/whiteboard.js +179 -0
- package/config.js +16 -0
- package/examples/browser/462.jibb.js +306 -0
- package/{src/examples → examples}/browser/index.html +0 -0
- package/examples/browser/jibb.js +7381 -0
- package/examples/browser/startSession.js +102 -0
- package/{src/examples → examples}/examples.js +1 -0
- package/examples/webexDevicesMacros/cameraPresets/jibb.js +280 -0
- package/examples/webexDevicesMacros/simplestExample/jibb.js +182 -0
- package/examples/webexDevicesMacros/webexDevice JSSDK/jibb_WebexXapi.js +3033 -0
- package/examples/webexDevicesMacros/withCameraControl/jibb.js +264 -0
- package/package.json +1 -1
- package/post-processing.js +43 -0
- package/types/exceptions.js +55 -0
- package/{src/types → types}/jibb.pb.js +5 -38
- package/types/proto.js +15 -0
- package/types/types.js +67 -0
- package/utils/cached_variable.js +25 -0
- package/utils/future.js +31 -0
- package/utils/http/http.axios.js +41 -0
- package/utils/http/index.js +10 -0
- package/utils/index.js +11 -0
- package/utils/logger/index.js +19 -0
- package/utils/logger/logger.empty.js +25 -0
- package/utils/logger/logger.pino.js +19 -0
- package/ws/connection_base.js +95 -0
- package/ws/eventbus.js +376 -0
- package/ws/index.js +36 -0
- package/ws/ipsa.js +262 -0
- package/ws/meeting.js +181 -0
- package/ws/observable_connection.js +87 -0
- package/ws/retry_connection.js +94 -0
- package/.babelrc +0 -31
- package/README.md +0 -4
- package/src/api/admin.js +0 -333
- package/src/api/auth.js +0 -208
- package/src/api/eventbus.js +0 -246
- package/src/api/index.js +0 -26
- package/src/api/meeting.js +0 -421
- package/src/api/recording.js +0 -225
- package/src/api/superadmin.js +0 -84
- package/src/api/user.js +0 -46
- package/src/api/webexbot.js +0 -32
- package/src/api/whiteboard.js +0 -175
- package/src/config.js +0 -12
- package/src/examples/browser/462.jibb.js +0 -1
- package/src/examples/browser/jibb.js +0 -2
- package/src/examples/browser/startSession.js +0 -112
- package/src/examples/webexDevicesMacros/cameraPresets/jibb.js +0 -338
- package/src/examples/webexDevicesMacros/simplestExample/jibb.js +0 -212
- package/src/examples/webexDevicesMacros/webexDevice JSSDK/jibb_WebexXapi.js +0 -2
- package/src/examples/webexDevicesMacros/withCameraControl/jibb.js +0 -303
- package/src/index.webex-devices.js +0 -13
- package/src/post-processing.js +0 -39
- package/src/types/exceptions.js +0 -48
- package/src/types/proto.js +0 -7
- package/src/types/types.js +0 -64
- package/src/utils/cached_variable.js +0 -23
- package/src/utils/future.js +0 -24
- package/src/utils/http/http.axios.js +0 -34
- package/src/utils/http/http.xapi.js +0 -87
- package/src/utils/http/index.js +0 -8
- package/src/utils/index.js +0 -5
- package/src/utils/logger/index.js +0 -11
- package/src/utils/logger/logger.empty.js +0 -25
- package/src/utils/logger/logger.pino.js +0 -15
- package/src/ws/connection_base.js +0 -81
- package/src/ws/eventbus.js +0 -363
- package/src/ws/index.js +0 -15
- package/src/ws/ipsa.js +0 -246
- package/src/ws/meeting.js +0 -170
- package/src/ws/observable_connection.js +0 -84
- package/src/ws/retry_connection.js +0 -82
- 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();
|
|
@@ -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();
|