@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,264 @@
|
|
|
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 Control 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 114 or comment line 153 to disable it.
|
|
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 242 is is the exported XML panel
|
|
35
|
+
* </ul>
|
|
36
|
+
*
|
|
37
|
+
* @name webexDevice camera Control
|
|
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
|
+
default:
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
const uiExtension = "<Extensions>\n<Version>1.9</Version>\n<Panel>\n <Order>2</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\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<Row>\n\t <Name>Row</Name>\n\t <Widget>\n\t\t<WidgetId>jibb_camera_control</WidgetId>\n\t\t<Type>DirectionalPad</Type>\n\t\t<Options>size=4</Options>\n\t </Widget>\n\t</Row>\n\t<Row>\n\t <Name>Row</Name>\n\t <Widget>\n\t\t<WidgetId>jibb_zoom_out</WidgetId>\n\t\t<Type>Button</Type>\n\t\t<Options>size=1;icon=zoom_out</Options>\n\t </Widget>\n\t <Widget>\n\t\t<WidgetId>jibb_zoom_in</WidgetId>\n\t\t<Type>Button</Type>\n\t\t<Options>size=1;icon=zoom_in</Options>\n\t </Widget>\n\t</Row>\n\t<Options>hideRowNames=1</Options>\n </Page>\n</Panel>\n</Extensions>\n ";
|
|
264
|
+
main();
|
package/package.json
CHANGED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PostProcessing = void 0;
|
|
7
|
+
require("core-js/modules/es.promise.js");
|
|
8
|
+
var _config = require("./config.js");
|
|
9
|
+
var _auth = require("./auth.js");
|
|
10
|
+
var _index = _interopRequireDefault(require("../http/index.js"));
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
class PostProcessing {
|
|
13
|
+
async createPDFNotes(sourceUrl) {
|
|
14
|
+
let customCorners = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
|
|
15
|
+
let headers = {
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
"Accept": "application/json",
|
|
18
|
+
"x-jibb-user-jwt": await _auth.Auth.getUserToken()
|
|
19
|
+
};
|
|
20
|
+
let body = {
|
|
21
|
+
"config": {
|
|
22
|
+
"surfaceType": "WHITEBOARD"
|
|
23
|
+
},
|
|
24
|
+
"runtimeConfig": {
|
|
25
|
+
"enable_estimation": true,
|
|
26
|
+
"fixed_corners": true,
|
|
27
|
+
"flip_up_down": false,
|
|
28
|
+
"flip_left_right": false,
|
|
29
|
+
"rotation": "RATATE_0",
|
|
30
|
+
"enableColor": false
|
|
31
|
+
},
|
|
32
|
+
"sourceUrl": sourceUrl
|
|
33
|
+
};
|
|
34
|
+
if (customCorners) {
|
|
35
|
+
body["runtimeConfig"]["customCorners"] = customCorners;
|
|
36
|
+
}
|
|
37
|
+
let response = await _index.default.post("".concat(_config.Config.apiBaseURL, "/v1/ipsa-post-processing/run"), body, {
|
|
38
|
+
headers
|
|
39
|
+
});
|
|
40
|
+
return response.data;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
exports.PostProcessing = PostProcessing;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PermissionDeniedError = exports.NotStartedError = exports.NotFoundError = exports.NotConnectedError = exports.InvalidArgumentError = exports.AlreadyStartedError = exports.AlreadyConnectedError = void 0;
|
|
7
|
+
class NotFoundError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = "NotFoundError";
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.NotFoundError = NotFoundError;
|
|
14
|
+
class NotStartedError extends Error {
|
|
15
|
+
constructor(message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = "NotStartedError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.NotStartedError = NotStartedError;
|
|
21
|
+
class NotConnectedError extends Error {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = "NotConnectedError";
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.NotConnectedError = NotConnectedError;
|
|
28
|
+
class AlreadyStartedError extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = "AlreadyStartedError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.AlreadyStartedError = AlreadyStartedError;
|
|
35
|
+
class AlreadyConnectedError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = "AlreadyConnectedError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.AlreadyConnectedError = AlreadyConnectedError;
|
|
42
|
+
class PermissionDeniedError extends Error {
|
|
43
|
+
constructor(message) {
|
|
44
|
+
super(message);
|
|
45
|
+
this.name = "PermissionDeniedError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.PermissionDeniedError = PermissionDeniedError;
|
|
49
|
+
class InvalidArgumentError extends Error {
|
|
50
|
+
constructor(message) {
|
|
51
|
+
super(message);
|
|
52
|
+
this.name = "InvalidArgumentError";
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.InvalidArgumentError = InvalidArgumentError;
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
"use strict";
|
|
3
3
|
|
|
4
4
|
var $protobuf = require("protobufjs/light");
|
|
5
|
-
|
|
6
|
-
var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $protobuf.Root()))
|
|
7
|
-
.addJSON({
|
|
5
|
+
var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $protobuf.Root())).addJSON({
|
|
8
6
|
types: {
|
|
9
7
|
options: {
|
|
10
8
|
go_package: "github.com/Inkerz/jibbapis/sdk/go/types"
|
|
@@ -391,14 +389,7 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr
|
|
|
391
389
|
Request: {
|
|
392
390
|
oneofs: {
|
|
393
391
|
Command: {
|
|
394
|
-
oneof: [
|
|
395
|
-
"config",
|
|
396
|
-
"ipsa",
|
|
397
|
-
"resetSession",
|
|
398
|
-
"recalibrate",
|
|
399
|
-
"runtimeConfig",
|
|
400
|
-
"appConfig"
|
|
401
|
-
]
|
|
392
|
+
oneof: ["config", "ipsa", "resetSession", "recalibrate", "runtimeConfig", "appConfig"]
|
|
402
393
|
}
|
|
403
394
|
},
|
|
404
395
|
fields: {
|
|
@@ -1112,13 +1103,7 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr
|
|
|
1112
1103
|
Message: {
|
|
1113
1104
|
oneofs: {
|
|
1114
1105
|
event: {
|
|
1115
|
-
oneof: [
|
|
1116
|
-
"join",
|
|
1117
|
-
"leave",
|
|
1118
|
-
"update",
|
|
1119
|
-
"drawing",
|
|
1120
|
-
"pointer"
|
|
1121
|
-
]
|
|
1106
|
+
oneof: ["join", "leave", "update", "drawing", "pointer"]
|
|
1122
1107
|
}
|
|
1123
1108
|
},
|
|
1124
1109
|
fields: {
|
|
@@ -1220,24 +1205,7 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr
|
|
|
1220
1205
|
BusMessage: {
|
|
1221
1206
|
oneofs: {
|
|
1222
1207
|
messageType: {
|
|
1223
|
-
oneof: [
|
|
1224
|
-
"clientConnected",
|
|
1225
|
-
"clientDisconnected",
|
|
1226
|
-
"tooManyPublishers",
|
|
1227
|
-
"ipsaResponse",
|
|
1228
|
-
"startRequest",
|
|
1229
|
-
"stopRequest",
|
|
1230
|
-
"newPageRequest",
|
|
1231
|
-
"previewRequest",
|
|
1232
|
-
"previewResponse",
|
|
1233
|
-
"cameraListRequest",
|
|
1234
|
-
"cameraListResponse",
|
|
1235
|
-
"runtimeConfigRequest",
|
|
1236
|
-
"clientStatusRequest",
|
|
1237
|
-
"recordingStarted",
|
|
1238
|
-
"recordingStopped",
|
|
1239
|
-
"error"
|
|
1240
|
-
]
|
|
1208
|
+
oneof: ["clientConnected", "clientDisconnected", "tooManyPublishers", "ipsaResponse", "startRequest", "stopRequest", "newPageRequest", "previewRequest", "previewResponse", "cameraListRequest", "cameraListResponse", "runtimeConfigRequest", "clientStatusRequest", "recordingStarted", "recordingStopped", "error"]
|
|
1241
1209
|
}
|
|
1242
1210
|
},
|
|
1243
1211
|
fields: {
|
|
@@ -1353,5 +1321,4 @@ var $root = ($protobuf.roots["default"] || ($protobuf.roots["default"] = new $pr
|
|
|
1353
1321
|
}
|
|
1354
1322
|
}
|
|
1355
1323
|
});
|
|
1356
|
-
|
|
1357
|
-
module.exports = $root;
|
|
1324
|
+
module.exports = $root;
|
package/types/proto.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.types = exports.meeting = exports.ipsa = exports.cilix = void 0;
|
|
7
|
+
const root = require("./jibb.pb.js");
|
|
8
|
+
const ipsa = root.lookup("jibb.ipsa.v1");
|
|
9
|
+
exports.ipsa = ipsa;
|
|
10
|
+
const types = root.lookup("types");
|
|
11
|
+
exports.types = types;
|
|
12
|
+
const cilix = root.lookup("cilix");
|
|
13
|
+
exports.cilix = cilix;
|
|
14
|
+
const meeting = root.lookup("meeting");
|
|
15
|
+
exports.meeting = meeting;
|
package/types/types.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.UserType = exports.UserClaims = exports.MeetingTypes = exports.MeetingClaims = exports.AccessLevel = void 0;
|
|
7
|
+
var _jwtDecode = _interopRequireDefault(require("jwt-decode"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
const MeetingTypes = {
|
|
10
|
+
DEFAULT: 0,
|
|
11
|
+
WHITEBOARD: 1
|
|
12
|
+
};
|
|
13
|
+
exports.MeetingTypes = MeetingTypes;
|
|
14
|
+
const AccessLevel = {
|
|
15
|
+
USER: "USER",
|
|
16
|
+
ADMIN: "ADMIN",
|
|
17
|
+
SUPERADMIN: "SUPERADMIN"
|
|
18
|
+
};
|
|
19
|
+
exports.AccessLevel = AccessLevel;
|
|
20
|
+
const UserType = {
|
|
21
|
+
UNKNOWN: 0,
|
|
22
|
+
LIMITED: 1,
|
|
23
|
+
MEMBER: 2,
|
|
24
|
+
ADMIN: 3,
|
|
25
|
+
OWNER: 4
|
|
26
|
+
};
|
|
27
|
+
exports.UserType = UserType;
|
|
28
|
+
class MeetingClaims {
|
|
29
|
+
constructor(token) {
|
|
30
|
+
this.claims = (0, _jwtDecode.default)(token);
|
|
31
|
+
this.expiryTime = new Date(this.claims.exp * 1000);
|
|
32
|
+
this.owner = this.claims.data.owner;
|
|
33
|
+
this.meetindId = this.claims.data.meeting_id;
|
|
34
|
+
this.title = this.claims.data.title;
|
|
35
|
+
this.capacity = this.claims.data.capacity;
|
|
36
|
+
this.permission = this.claims.data.permission;
|
|
37
|
+
this.meetingType = this.claims.data.meeting_type;
|
|
38
|
+
this.isTemporary = this.claims.data.is_temporary;
|
|
39
|
+
}
|
|
40
|
+
getSecondsUntilExpiry() {
|
|
41
|
+
return this.expiryTime - Date.now() - 60;
|
|
42
|
+
}
|
|
43
|
+
isExpired() {
|
|
44
|
+
return this.getSecondsUntilExpiry() <= 0;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.MeetingClaims = MeetingClaims;
|
|
48
|
+
class UserClaims {
|
|
49
|
+
constructor(token) {
|
|
50
|
+
var _this$claims$data;
|
|
51
|
+
this.token = token;
|
|
52
|
+
this.claims = (0, _jwtDecode.default)(token);
|
|
53
|
+
this.expiryTime = new Date(this.claims.exp * 1000);
|
|
54
|
+
this.email = (_this$claims$data = this.claims.data) === null || _this$claims$data === void 0 ? void 0 : _this$claims$data.email;
|
|
55
|
+
this.userId = this.claims.sub;
|
|
56
|
+
}
|
|
57
|
+
getSecondsUntilExpiry() {
|
|
58
|
+
return this.expiryTime - Date.now() - 60;
|
|
59
|
+
}
|
|
60
|
+
isExpired() {
|
|
61
|
+
return this.getSecondsUntilExpiry() <= 0;
|
|
62
|
+
}
|
|
63
|
+
getUserId() {
|
|
64
|
+
return this.userId;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.UserClaims = UserClaims;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.CachedVariable = void 0;
|
|
7
|
+
class CachedVariable {
|
|
8
|
+
constructor() {
|
|
9
|
+
let expirySeconds = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 60;
|
|
10
|
+
this.value = null;
|
|
11
|
+
this.expirySeconds = expirySeconds;
|
|
12
|
+
this.expiryTime = Date.now();
|
|
13
|
+
}
|
|
14
|
+
isExpired() {
|
|
15
|
+
return this.value == null || Date.now() > this.expiryTime;
|
|
16
|
+
}
|
|
17
|
+
get() {
|
|
18
|
+
if (this.isExpired()) return undefined;else return this.value;
|
|
19
|
+
}
|
|
20
|
+
set(value) {
|
|
21
|
+
this.value = value;
|
|
22
|
+
this.expiryTime = Date.now() + this.expirySeconds * 1000;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.CachedVariable = CachedVariable;
|
package/utils/future.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.Future = void 0;
|
|
7
|
+
require("core-js/modules/es.promise.js");
|
|
8
|
+
class Future {
|
|
9
|
+
constructor() {
|
|
10
|
+
let self = this;
|
|
11
|
+
this.resolve = undefined;
|
|
12
|
+
this.reject = undefined;
|
|
13
|
+
this.promise = new Promise((resolve, reject) => {
|
|
14
|
+
self.resolve = resolve;
|
|
15
|
+
self.reject = reject;
|
|
16
|
+
});
|
|
17
|
+
this.promise.catch(() => {
|
|
18
|
+
return undefined;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
get() {
|
|
22
|
+
return this.promise;
|
|
23
|
+
}
|
|
24
|
+
reject(val) {
|
|
25
|
+
this.reject(val);
|
|
26
|
+
}
|
|
27
|
+
set(val) {
|
|
28
|
+
this.resolve(val);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.Future = Future;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.promise.js");
|
|
4
|
+
require("core-js/modules/es.global-this.js");
|
|
5
|
+
var _axios = _interopRequireDefault(require("axios"));
|
|
6
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
7
|
+
class HttpClient {
|
|
8
|
+
async get(url, headers) {
|
|
9
|
+
let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
10
|
+
options.headers = headers;
|
|
11
|
+
return _axios.default.get(url, options);
|
|
12
|
+
}
|
|
13
|
+
async post(url) {
|
|
14
|
+
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
15
|
+
let headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
16
|
+
return _axios.default.post(url, body, {
|
|
17
|
+
headers: headers
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async patch(url) {
|
|
21
|
+
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
22
|
+
let headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
23
|
+
return _axios.default.patch(url, body, {
|
|
24
|
+
headers: headers
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async put(url) {
|
|
28
|
+
let body = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
29
|
+
let headers = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
30
|
+
return _axios.default.put(url, body, {
|
|
31
|
+
headers: headers
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async delete(url) {
|
|
35
|
+
let headers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
36
|
+
return _axios.default.delete(url, {
|
|
37
|
+
headers: headers
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
globalThis.http = new HttpClient();
|