@ohos-ports/genesys-cloud-streaming-client 20.1.0-beta.1
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/README.md +47 -0
- package/dist/cjs/alerting-leader.d.ts +29 -0
- package/dist/cjs/alerting-leader.js +163 -0
- package/dist/cjs/client.d.ts +84 -0
- package/dist/cjs/client.js +680 -0
- package/dist/cjs/connection-manager.d.ts +18 -0
- package/dist/cjs/connection-manager.js +120 -0
- package/dist/cjs/connection-transfer.d.ts +7 -0
- package/dist/cjs/connection-transfer.js +20 -0
- package/dist/cjs/http-client.d.ts +18 -0
- package/dist/cjs/http-client.js +230 -0
- package/dist/cjs/index.d.ts +10 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/messenger.d.ts +37 -0
- package/dist/cjs/messenger.js +54 -0
- package/dist/cjs/notifications.d.ts +94 -0
- package/dist/cjs/notifications.js +495 -0
- package/dist/cjs/ping.d.ts +21 -0
- package/dist/cjs/ping.js +60 -0
- package/dist/cjs/polyfills.d.ts +0 -0
- package/dist/cjs/polyfills.js +6 -0
- package/dist/cjs/server-monitor.d.ts +16 -0
- package/dist/cjs/server-monitor.js +44 -0
- package/dist/cjs/stanza-definitions/webrtc-signaling.d.ts +29 -0
- package/dist/cjs/stanza-definitions/webrtc-signaling.js +113 -0
- package/dist/cjs/stanza-definitions/xep0051.d.ts +19 -0
- package/dist/cjs/stanza-definitions/xep0051.js +28 -0
- package/dist/cjs/stats-formatter.d.ts +6 -0
- package/dist/cjs/stats-formatter.js +63 -0
- package/dist/cjs/types/genesys-cloud-media-session.d.ts +64 -0
- package/dist/cjs/types/genesys-cloud-media-session.js +353 -0
- package/dist/cjs/types/interfaces.d.ts +310 -0
- package/dist/cjs/types/interfaces.js +22 -0
- package/dist/cjs/types/libs.d.ts +32 -0
- package/dist/cjs/types/libs.js +1 -0
- package/dist/cjs/types/media-session.d.ts +76 -0
- package/dist/cjs/types/media-session.js +2 -0
- package/dist/cjs/types/named-agent.d.ts +13 -0
- package/dist/cjs/types/named-agent.js +2 -0
- package/dist/cjs/types/offline-error.d.ts +2 -0
- package/dist/cjs/types/offline-error.js +5 -0
- package/dist/cjs/types/sasl-error.d.ts +8 -0
- package/dist/cjs/types/sasl-error.js +12 -0
- package/dist/cjs/types/stanza-media-session.d.ts +56 -0
- package/dist/cjs/types/stanza-media-session.js +255 -0
- package/dist/cjs/types/streaming-client-extension.d.ts +14 -0
- package/dist/cjs/types/streaming-client-extension.js +2 -0
- package/dist/cjs/types/timeout-error.d.ts +3 -0
- package/dist/cjs/types/timeout-error.js +9 -0
- package/dist/cjs/types/user-cancelled-error.d.ts +2 -0
- package/dist/cjs/types/user-cancelled-error.js +5 -0
- package/dist/cjs/utils.d.ts +34 -0
- package/dist/cjs/utils.js +202 -0
- package/dist/cjs/webrtc.d.ts +126 -0
- package/dist/cjs/webrtc.js +891 -0
- package/dist/deploy-info.json +21 -0
- package/dist/es/alerting-leader.d.ts +29 -0
- package/dist/es/alerting-leader.js +177 -0
- package/dist/es/client.d.ts +84 -0
- package/dist/es/client.js +699 -0
- package/dist/es/connection-manager.d.ts +18 -0
- package/dist/es/connection-manager.js +124 -0
- package/dist/es/connection-transfer.d.ts +7 -0
- package/dist/es/connection-transfer.js +16 -0
- package/dist/es/http-client.d.ts +18 -0
- package/dist/es/http-client.js +194 -0
- package/dist/es/index.bundle.js +39629 -0
- package/dist/es/index.d.ts +10 -0
- package/dist/es/index.js +10 -0
- package/dist/es/messenger.d.ts +37 -0
- package/dist/es/messenger.js +62 -0
- package/dist/es/notifications.d.ts +94 -0
- package/dist/es/notifications.js +507 -0
- package/dist/es/ping.d.ts +21 -0
- package/dist/es/ping.js +68 -0
- package/dist/es/polyfills.d.ts +0 -0
- package/dist/es/polyfills.js +6 -0
- package/dist/es/server-monitor.d.ts +16 -0
- package/dist/es/server-monitor.js +41 -0
- package/dist/es/stanza-definitions/webrtc-signaling.d.ts +29 -0
- package/dist/es/stanza-definitions/webrtc-signaling.js +110 -0
- package/dist/es/stanza-definitions/xep0051.d.ts +19 -0
- package/dist/es/stanza-definitions/xep0051.js +25 -0
- package/dist/es/stats-formatter.d.ts +6 -0
- package/dist/es/stats-formatter.js +54 -0
- package/dist/es/types/genesys-cloud-media-session.d.ts +64 -0
- package/dist/es/types/genesys-cloud-media-session.js +379 -0
- package/dist/es/types/interfaces.d.ts +310 -0
- package/dist/es/types/interfaces.js +19 -0
- package/dist/es/types/libs.d.ts +32 -0
- package/dist/es/types/libs.js +1 -0
- package/dist/es/types/media-session.d.ts +76 -0
- package/dist/es/types/media-session.js +1 -0
- package/dist/es/types/named-agent.d.ts +13 -0
- package/dist/es/types/named-agent.js +1 -0
- package/dist/es/types/offline-error.d.ts +2 -0
- package/dist/es/types/offline-error.js +2 -0
- package/dist/es/types/sasl-error.d.ts +8 -0
- package/dist/es/types/sasl-error.js +9 -0
- package/dist/es/types/stanza-media-session.d.ts +56 -0
- package/dist/es/types/stanza-media-session.js +264 -0
- package/dist/es/types/streaming-client-extension.d.ts +14 -0
- package/dist/es/types/streaming-client-extension.js +1 -0
- package/dist/es/types/timeout-error.d.ts +3 -0
- package/dist/es/types/timeout-error.js +5 -0
- package/dist/es/types/user-cancelled-error.d.ts +2 -0
- package/dist/es/types/user-cancelled-error.js +2 -0
- package/dist/es/utils.d.ts +34 -0
- package/dist/es/utils.js +192 -0
- package/dist/es/webrtc.d.ts +126 -0
- package/dist/es/webrtc.js +917 -0
- package/dist/manifest.json +19 -0
- package/dist/npm/CHANGELOG.md +637 -0
- package/dist/npm/README.md +47 -0
- package/dist/npm/alerting-leader.d.ts +29 -0
- package/dist/npm/alerting-leader.js +163 -0
- package/dist/npm/client.d.ts +84 -0
- package/dist/npm/client.js +680 -0
- package/dist/npm/connection-manager.d.ts +18 -0
- package/dist/npm/connection-manager.js +120 -0
- package/dist/npm/connection-transfer.d.ts +7 -0
- package/dist/npm/connection-transfer.js +20 -0
- package/dist/npm/http-client.d.ts +18 -0
- package/dist/npm/http-client.js +230 -0
- package/dist/npm/index.d.ts +10 -0
- package/dist/npm/index.js +31 -0
- package/dist/npm/messenger.d.ts +37 -0
- package/dist/npm/messenger.js +54 -0
- package/dist/npm/module.js +10 -0
- package/dist/npm/notifications.d.ts +94 -0
- package/dist/npm/notifications.js +495 -0
- package/dist/npm/ping.d.ts +21 -0
- package/dist/npm/ping.js +60 -0
- package/dist/npm/polyfills.d.ts +0 -0
- package/dist/npm/polyfills.js +6 -0
- package/dist/npm/server-monitor.d.ts +16 -0
- package/dist/npm/server-monitor.js +44 -0
- package/dist/npm/stanza-definitions/webrtc-signaling.d.ts +29 -0
- package/dist/npm/stanza-definitions/webrtc-signaling.js +113 -0
- package/dist/npm/stanza-definitions/xep0051.d.ts +19 -0
- package/dist/npm/stanza-definitions/xep0051.js +28 -0
- package/dist/npm/stats-formatter.d.ts +6 -0
- package/dist/npm/stats-formatter.js +63 -0
- package/dist/npm/types/genesys-cloud-media-session.d.ts +64 -0
- package/dist/npm/types/genesys-cloud-media-session.js +353 -0
- package/dist/npm/types/interfaces.d.ts +310 -0
- package/dist/npm/types/interfaces.js +22 -0
- package/dist/npm/types/libs.d.ts +32 -0
- package/dist/npm/types/libs.js +1 -0
- package/dist/npm/types/media-session.d.ts +76 -0
- package/dist/npm/types/media-session.js +2 -0
- package/dist/npm/types/named-agent.d.ts +13 -0
- package/dist/npm/types/named-agent.js +2 -0
- package/dist/npm/types/offline-error.d.ts +2 -0
- package/dist/npm/types/offline-error.js +5 -0
- package/dist/npm/types/sasl-error.d.ts +8 -0
- package/dist/npm/types/sasl-error.js +12 -0
- package/dist/npm/types/stanza-media-session.d.ts +56 -0
- package/dist/npm/types/stanza-media-session.js +255 -0
- package/dist/npm/types/streaming-client-extension.d.ts +14 -0
- package/dist/npm/types/streaming-client-extension.js +2 -0
- package/dist/npm/types/timeout-error.d.ts +3 -0
- package/dist/npm/types/timeout-error.js +9 -0
- package/dist/npm/types/user-cancelled-error.d.ts +2 -0
- package/dist/npm/types/user-cancelled-error.js +5 -0
- package/dist/npm/utils.d.ts +34 -0
- package/dist/npm/utils.js +207 -0
- package/dist/npm/webrtc.d.ts +126 -0
- package/dist/npm/webrtc.js +893 -0
- package/dist/streaming-client.browser.js +2 -0
- package/dist/streaming-client.browser.js.LICENSE.txt +12 -0
- package/dist/v20/streaming-client.browser.js +2 -0
- package/dist/v20/streaming-client.browser.js.LICENSE.txt +12 -0
- package/dist/v20.1.0/streaming-client.browser.js +2 -0
- package/dist/v20.1.0/streaming-client.browser.js.LICENSE.txt +12 -0
- package/package.json +132 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Logger from 'genesys-cloud-client-logger';
|
|
2
|
+
import { IClientConfig } from './types/interfaces';
|
|
3
|
+
import { NamedAgent } from './types/named-agent';
|
|
4
|
+
export declare class ConnectionManager {
|
|
5
|
+
private logger;
|
|
6
|
+
private config;
|
|
7
|
+
currentStanzaInstance?: NamedAgent;
|
|
8
|
+
constructor(logger: Logger, config: IClientConfig);
|
|
9
|
+
setConfig(config: IClientConfig): void;
|
|
10
|
+
getNewStanzaConnection(): Promise<NamedAgent>;
|
|
11
|
+
private handleSessionStarted;
|
|
12
|
+
private handleSessionSasl;
|
|
13
|
+
private handleSessionDisconnected;
|
|
14
|
+
private checkForErrorStanza;
|
|
15
|
+
private getStanzaOptions;
|
|
16
|
+
private getJwtOptions;
|
|
17
|
+
private getStandardOptions;
|
|
18
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// so the idea here is any time stanza gets disconnected, we are effectively going to kill that instance of
|
|
3
|
+
// stanza and never reuse it. We may reuse the config for a given stanza client, but every connection attempt
|
|
4
|
+
// will merit its own brand new client. The purpose of this is because the stanza.connect() is not transactional
|
|
5
|
+
// and failed connection attempts trigger `disconnect` events either by timeout or some actual error. This is
|
|
6
|
+
// a problem because it effectively means we can get multiple disconnect events for a single connection attempt
|
|
7
|
+
// which makes trying to reconnect a stanza instance an tricky endeavor because we don't know if a disconnect
|
|
8
|
+
// event applies to a past connection attempt or if it applies to the most recent connection attempt. For this
|
|
9
|
+
// reason, we want a vanilla instance of stanza every time we call `connect` so wires don't get crossed.
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ConnectionManager = void 0;
|
|
15
|
+
const stanza_1 = require("stanza");
|
|
16
|
+
const sasl_error_1 = __importDefault(require("./types/sasl-error"));
|
|
17
|
+
const utils_1 = require("./utils");
|
|
18
|
+
class ConnectionManager {
|
|
19
|
+
constructor(logger, config) {
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
this.config = config;
|
|
22
|
+
}
|
|
23
|
+
setConfig(config) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
}
|
|
26
|
+
async getNewStanzaConnection() {
|
|
27
|
+
const options = this.getStanzaOptions();
|
|
28
|
+
const stanza = (0, stanza_1.createClient)({});
|
|
29
|
+
this.currentStanzaInstance = stanza;
|
|
30
|
+
// this is a hack because stanza messes up the auth mechanism priority.
|
|
31
|
+
stanza.sasl.mechanisms.find(mech => mech.name === 'ANONYMOUS').priority = 0;
|
|
32
|
+
stanza.sasl.mechanisms = stanza.sasl.mechanisms.sort((a, b) => b.priority - a.priority);
|
|
33
|
+
// we are going to give the stanza instance an id for tracking and logging purposes
|
|
34
|
+
stanza.id = globalThis.crypto.randomUUID();
|
|
35
|
+
const channelId = stanza.channelId = this.config.channelId;
|
|
36
|
+
let boundCheckForErrorStanza;
|
|
37
|
+
let boundSessionStarted;
|
|
38
|
+
let boundSessionSasl;
|
|
39
|
+
let boundSessionDisconnected;
|
|
40
|
+
const connectionAttemptPromise = (0, utils_1.timeoutPromise)((resolve, reject) => {
|
|
41
|
+
boundCheckForErrorStanza = this.checkForErrorStanza.bind(this, stanza);
|
|
42
|
+
stanza.on('raw:incoming', boundCheckForErrorStanza);
|
|
43
|
+
boundSessionStarted = this.handleSessionStarted.bind(this, stanza, resolve);
|
|
44
|
+
stanza.on('session:started', boundSessionStarted);
|
|
45
|
+
boundSessionSasl = this.handleSessionSasl.bind(this, stanza, reject);
|
|
46
|
+
stanza.on('sasl', boundSessionSasl);
|
|
47
|
+
boundSessionDisconnected = this.handleSessionDisconnected.bind(this, stanza, reject);
|
|
48
|
+
stanza.on('disconnected', boundSessionDisconnected);
|
|
49
|
+
stanza.updateConfig(options);
|
|
50
|
+
stanza.connect();
|
|
51
|
+
}, 15 * 1000, 'connecting to streaming service', { channelId, stanzaInstanceId: stanza.id });
|
|
52
|
+
connectionAttemptPromise.catch(() => stanza.disconnect());
|
|
53
|
+
return connectionAttemptPromise.finally(() => {
|
|
54
|
+
stanza.off('raw:incoming', boundCheckForErrorStanza);
|
|
55
|
+
stanza.off('session:started', boundSessionStarted);
|
|
56
|
+
stanza.off('sasl', boundSessionSasl);
|
|
57
|
+
stanza.off('disconnected', boundSessionDisconnected);
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
handleSessionStarted(stanza, resolve) {
|
|
61
|
+
this.logger.info('new stanza instance connected', { stanzaInstanceId: stanza.id, channelId: stanza.channelId });
|
|
62
|
+
resolve(stanza);
|
|
63
|
+
}
|
|
64
|
+
handleSessionSasl(stanza, reject, sasl) {
|
|
65
|
+
if (sasl.type === 'failure') {
|
|
66
|
+
reject(new sasl_error_1.default(sasl.condition, stanza.channelId, stanza.id));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
handleSessionDisconnected(stanza, reject) {
|
|
70
|
+
this.logger.error('stanza disconnected', { stanzaInstanceId: stanza.id, channelId: stanza.channelId });
|
|
71
|
+
reject();
|
|
72
|
+
}
|
|
73
|
+
checkForErrorStanza(stanza, rawStanza) {
|
|
74
|
+
if (rawStanza.includes('error')) {
|
|
75
|
+
this.logger.error('Received a stanza during setup that tripped the error filter', { rawStanza, stanzaInstanceId: stanza.id, channelId: stanza.channelId });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
getStanzaOptions() {
|
|
79
|
+
if (this.config.jwt) {
|
|
80
|
+
return this.getJwtOptions();
|
|
81
|
+
}
|
|
82
|
+
return this.getStandardOptions();
|
|
83
|
+
}
|
|
84
|
+
getJwtOptions() {
|
|
85
|
+
const config = this.config;
|
|
86
|
+
const jwt = (0, utils_1.parseJwt)(config.jwt);
|
|
87
|
+
let jidDomain;
|
|
88
|
+
const jwtJid = jwt.data.jid;
|
|
89
|
+
try {
|
|
90
|
+
jidDomain = jwtJid.split('@')[1].replace('conference.', '');
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
throw new Error('failed to parse jid');
|
|
94
|
+
}
|
|
95
|
+
const wsHost = config.host.replace(/\/$/, '');
|
|
96
|
+
return {
|
|
97
|
+
resource: config.jidResource,
|
|
98
|
+
transports: {
|
|
99
|
+
websocket: `${wsHost}/stream/jwt/${config.jwt}`
|
|
100
|
+
},
|
|
101
|
+
server: jidDomain
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
getStandardOptions() {
|
|
105
|
+
const config = this.config;
|
|
106
|
+
const wsHost = config.host.replace(/\/$/, '');
|
|
107
|
+
return {
|
|
108
|
+
jid: config.jid,
|
|
109
|
+
resource: config.jidResource,
|
|
110
|
+
credentials: {
|
|
111
|
+
username: config.jid,
|
|
112
|
+
password: `authKey:${config.authToken}`
|
|
113
|
+
},
|
|
114
|
+
transports: {
|
|
115
|
+
websocket: `${wsHost}/stream/channels/${config.channelId}`
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.ConnectionManager = ConnectionManager;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConnectionTransfer = void 0;
|
|
4
|
+
const xep0051_1 = require("./stanza-definitions/xep0051");
|
|
5
|
+
class ConnectionTransfer {
|
|
6
|
+
constructor(client, stanzaInstance) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
this.stanzaInstance = stanzaInstance;
|
|
9
|
+
stanzaInstance.stanzas.define(xep0051_1.connectionTransfer);
|
|
10
|
+
// Hawk maps `v2.system.socket_closing` to XEP-0051 Connection Transfer
|
|
11
|
+
// The docs says we have up to one minute to disconnect and connect a new WebSocket, so we should be proactive in reconnecting.
|
|
12
|
+
stanzaInstance.on('iq:set:connectionTransfer', (iq) => {
|
|
13
|
+
client.logger.warn('connection transfer (socket_closing) event received', { stanzaInstanceId: stanzaInstance.id, channelId: stanzaInstance.channelId });
|
|
14
|
+
void client.disconnect();
|
|
15
|
+
client.emit('disconnected', { reconnecting: true });
|
|
16
|
+
void client.connect({ keepTryingOnFailure: true });
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.ConnectionTransfer = ConnectionTransfer;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { RetryPromise } from './utils';
|
|
2
|
+
import { RequestApiOptions, ISuperagentNetworkError, ISuperagentResponseError, INetworkError, IResponseError, ICustomHeader, IHttpClientOptions } from './types/interfaces';
|
|
3
|
+
export declare class HttpClient {
|
|
4
|
+
customHeaders?: ICustomHeader;
|
|
5
|
+
private _httpRetryingRequests;
|
|
6
|
+
static retryStatusCodes: Set<number>;
|
|
7
|
+
static retryNetworkErrorCodes: Set<string>;
|
|
8
|
+
constructor(httpClientOptions?: IHttpClientOptions);
|
|
9
|
+
requestApiWithRetry<T = any>(path: string, opts: RequestApiOptions, retryInterval?: number): RetryPromise<T>;
|
|
10
|
+
requestApi(path: string, opts: RequestApiOptions): Promise<any>;
|
|
11
|
+
private handleResponse;
|
|
12
|
+
stopAllRetries(): void;
|
|
13
|
+
cancelRetryRequest(retryId: string): true;
|
|
14
|
+
formatRequestError(error: Error | ISuperagentNetworkError | ISuperagentResponseError): Error | INetworkError | IResponseError;
|
|
15
|
+
private isSuperagentNetworkError;
|
|
16
|
+
private isSuperagentResponseError;
|
|
17
|
+
private _buildUri;
|
|
18
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.HttpClient = void 0;
|
|
27
|
+
const axios_1 = __importStar(require("axios"));
|
|
28
|
+
const utils_1 = require("./utils");
|
|
29
|
+
const correlationIdHeaderName = 'inin-correlation-id';
|
|
30
|
+
class HttpClient {
|
|
31
|
+
constructor(httpClientOptions) {
|
|
32
|
+
this._httpRetryingRequests = new Map();
|
|
33
|
+
this.customHeaders = httpClientOptions === null || httpClientOptions === void 0 ? void 0 : httpClientOptions.customHeaders;
|
|
34
|
+
}
|
|
35
|
+
requestApiWithRetry(path, opts, retryInterval) {
|
|
36
|
+
const maxRetries = opts.maxAttempts || 10;
|
|
37
|
+
let retryCount = 0;
|
|
38
|
+
const retry = (0, utils_1.retryPromise)(this.requestApi.bind(this, path, opts), (error) => {
|
|
39
|
+
var _a, _b, _c;
|
|
40
|
+
retryCount++;
|
|
41
|
+
if (retryCount >= maxRetries) {
|
|
42
|
+
(opts.logger || console).info('Max retries reached, will not retry.', { maxRetries, retryCount, path });
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
let retryValue = false;
|
|
46
|
+
if (error === null || error === void 0 ? void 0 : error.response) {
|
|
47
|
+
retryValue = HttpClient.retryStatusCodes.has(error.response.status || 0);
|
|
48
|
+
// This *should* be an axios error according to typings, but it appears this could be an AxiosError *or* and XmlHttpRequest
|
|
49
|
+
// we'll check both to be safe
|
|
50
|
+
const retryAfter = ((_a = error.response.headers) === null || _a === void 0 ? void 0 : _a['retry-after']) || ((_c = (_b = error.response).getResponseHeader) === null || _c === void 0 ? void 0 : _c.call(_b, 'retry-after'));
|
|
51
|
+
if (retryAfter) {
|
|
52
|
+
(opts.logger || console).debug('retry-after header found on response. setting retry delay', { retryAfter });
|
|
53
|
+
// retry after comes in seconds, we need to return milliseconds
|
|
54
|
+
retryValue = parseInt(retryAfter, 10) * 1000;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Check network error codes independently - error may have both response (with status 0) and a network error code.
|
|
58
|
+
if ((error === null || error === void 0 ? void 0 : error.code) && retryValue === false) {
|
|
59
|
+
// Retry on network error codes - request didn't make it to the server or no response was received
|
|
60
|
+
if (HttpClient.retryNetworkErrorCodes.has(error.code)) {
|
|
61
|
+
(opts.logger || console).debug('Retry network error code found, will retry.', { code: error.code });
|
|
62
|
+
retryValue = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return retryValue;
|
|
66
|
+
}, retryInterval, opts.logger);
|
|
67
|
+
this._httpRetryingRequests.set(retry._id, retry);
|
|
68
|
+
retry.promise.then(() => this.cancelRetryRequest(retry._id), () => this.cancelRetryRequest(retry._id));
|
|
69
|
+
return retry;
|
|
70
|
+
}
|
|
71
|
+
requestApi(path, opts) {
|
|
72
|
+
const logger = opts.logger || console;
|
|
73
|
+
const start = new Date().getTime();
|
|
74
|
+
opts.customHeaders = {
|
|
75
|
+
...(this.customHeaders || {}),
|
|
76
|
+
...(opts.customHeaders || {})
|
|
77
|
+
};
|
|
78
|
+
const url = this._buildUri(opts.host, path, opts.version);
|
|
79
|
+
const headers = {
|
|
80
|
+
'content-type': opts.contentType || 'application/json',
|
|
81
|
+
...opts.customHeaders
|
|
82
|
+
};
|
|
83
|
+
const params = {
|
|
84
|
+
method: opts.method,
|
|
85
|
+
url,
|
|
86
|
+
data: opts.data,
|
|
87
|
+
responseType: opts.responseType,
|
|
88
|
+
timeout: opts.requestTimeout || 30000,
|
|
89
|
+
headers,
|
|
90
|
+
signal: opts.signal
|
|
91
|
+
};
|
|
92
|
+
// default to include auth header
|
|
93
|
+
if (!opts.noAuthHeader) {
|
|
94
|
+
params.headers.Authorization = `Bearer ${opts.authToken}`;
|
|
95
|
+
}
|
|
96
|
+
const boundHandler = this.handleResponse.bind(this, logger, start, params);
|
|
97
|
+
return (0, axios_1.default)(params)
|
|
98
|
+
.then(boundHandler, boundHandler);
|
|
99
|
+
}
|
|
100
|
+
handleResponse(logger, start, params, res) {
|
|
101
|
+
var _a, _b, _c;
|
|
102
|
+
const now = new Date().getTime();
|
|
103
|
+
const elapsed = (now - start) + 'ms';
|
|
104
|
+
if (res instanceof axios_1.AxiosError) {
|
|
105
|
+
// sanitize the auth token
|
|
106
|
+
if ((_b = (_a = res.config) === null || _a === void 0 ? void 0 : _a.headers) === null || _b === void 0 ? void 0 : _b.Authorization) {
|
|
107
|
+
res.config.headers.Authorization = 'redacted';
|
|
108
|
+
}
|
|
109
|
+
// handles request timeout
|
|
110
|
+
if (res.code === 'ECONNABORTED') {
|
|
111
|
+
logger.debug(`request error: ${params.url}`, {
|
|
112
|
+
message: res.message,
|
|
113
|
+
now,
|
|
114
|
+
elapsed
|
|
115
|
+
}, { skipServer: true });
|
|
116
|
+
return Promise.reject(res);
|
|
117
|
+
}
|
|
118
|
+
/* istanbul ignore next */
|
|
119
|
+
const response = res.response || {};
|
|
120
|
+
const status = response.status;
|
|
121
|
+
const correlationId = response.headers && response.headers[correlationIdHeaderName];
|
|
122
|
+
const body = response.data;
|
|
123
|
+
const error = {
|
|
124
|
+
...res,
|
|
125
|
+
text: (_c = response.request) === null || _c === void 0 ? void 0 : _c.response
|
|
126
|
+
};
|
|
127
|
+
logger.debug(`request error: ${params.url}`, {
|
|
128
|
+
message: res.message,
|
|
129
|
+
now,
|
|
130
|
+
elapsed,
|
|
131
|
+
status,
|
|
132
|
+
correlationId,
|
|
133
|
+
body
|
|
134
|
+
}, { skipServer: true });
|
|
135
|
+
return Promise.reject(error);
|
|
136
|
+
}
|
|
137
|
+
const status = res.status;
|
|
138
|
+
const correlationId = res.headers[correlationIdHeaderName];
|
|
139
|
+
const body = JSON.stringify(res.data);
|
|
140
|
+
logger.debug(`response: ${params.method.toUpperCase()} ${params.url}`, {
|
|
141
|
+
now,
|
|
142
|
+
status,
|
|
143
|
+
elapsed,
|
|
144
|
+
correlationId,
|
|
145
|
+
body
|
|
146
|
+
}, { skipServer: true });
|
|
147
|
+
return Promise.resolve(res);
|
|
148
|
+
}
|
|
149
|
+
stopAllRetries() {
|
|
150
|
+
Array.from(this._httpRetryingRequests.keys())
|
|
151
|
+
.forEach(key => this.cancelRetryRequest(key));
|
|
152
|
+
}
|
|
153
|
+
cancelRetryRequest(retryId) {
|
|
154
|
+
const value = this._httpRetryingRequests.get(retryId);
|
|
155
|
+
if (value) {
|
|
156
|
+
/* if the promise has already completed, this will do nothing. Still need to remove it from the map */
|
|
157
|
+
value.cancel(new Error('Retry request cancelled'));
|
|
158
|
+
this._httpRetryingRequests.delete(retryId);
|
|
159
|
+
}
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
formatRequestError(error) {
|
|
163
|
+
/* if network error */
|
|
164
|
+
if (this.isSuperagentNetworkError(error)) {
|
|
165
|
+
return {
|
|
166
|
+
status: error.status,
|
|
167
|
+
method: error.method,
|
|
168
|
+
url: error.url,
|
|
169
|
+
crossDomain: error.crossDomain,
|
|
170
|
+
message: error.message,
|
|
171
|
+
name: error.name,
|
|
172
|
+
stack: error.stack
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/* if superagent response error */
|
|
176
|
+
if (this.isSuperagentResponseError(error)) {
|
|
177
|
+
const res = error.response;
|
|
178
|
+
return {
|
|
179
|
+
status: error.status,
|
|
180
|
+
correlationId: res.headers['inin-correlation-id'],
|
|
181
|
+
// Potentially could contain PII
|
|
182
|
+
// responseBody: res.text,
|
|
183
|
+
// requestBody: res.req._data,
|
|
184
|
+
// url: res.error.url,
|
|
185
|
+
message: 'Error making HTTP request',
|
|
186
|
+
method: res.req.method,
|
|
187
|
+
name: res.error.name,
|
|
188
|
+
stack: res.error.stack
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/* if we don't have a superagent error */
|
|
192
|
+
return error;
|
|
193
|
+
}
|
|
194
|
+
isSuperagentNetworkError(error) {
|
|
195
|
+
return (error &&
|
|
196
|
+
// these properties may have the value of `undefined` but they will still be set
|
|
197
|
+
error.hasOwnProperty('status') &&
|
|
198
|
+
error.hasOwnProperty('method') &&
|
|
199
|
+
error.hasOwnProperty('url'));
|
|
200
|
+
}
|
|
201
|
+
isSuperagentResponseError(error) {
|
|
202
|
+
return !!(error &&
|
|
203
|
+
error.response &&
|
|
204
|
+
error.response.body &&
|
|
205
|
+
error.response.req);
|
|
206
|
+
}
|
|
207
|
+
_buildUri(host, path, version = 'v2') {
|
|
208
|
+
path = path.replace(/^\/+|\/+$/g, ''); // trim leading/trailing /
|
|
209
|
+
if (host.indexOf('http') === 0) {
|
|
210
|
+
return `${host}/api/${version}/${path}`;
|
|
211
|
+
}
|
|
212
|
+
return `https://api.${host}/api/${version}/${path}`;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.HttpClient = HttpClient;
|
|
216
|
+
HttpClient.retryStatusCodes = new Set([
|
|
217
|
+
408,
|
|
218
|
+
413,
|
|
219
|
+
429,
|
|
220
|
+
500,
|
|
221
|
+
502,
|
|
222
|
+
503,
|
|
223
|
+
504
|
|
224
|
+
]);
|
|
225
|
+
HttpClient.retryNetworkErrorCodes = new Set([
|
|
226
|
+
'ECONNABORTED',
|
|
227
|
+
'ECONNRESET',
|
|
228
|
+
'ERR_NETWORK',
|
|
229
|
+
'ETIMEDOUT'
|
|
230
|
+
]);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference path="types/libs.d.ts" />
|
|
2
|
+
import { Client } from './client';
|
|
3
|
+
export * from './types/genesys-cloud-media-session';
|
|
4
|
+
export * from './types/stanza-media-session';
|
|
5
|
+
export * from './types/media-session';
|
|
6
|
+
export * from './types/interfaces';
|
|
7
|
+
export * from './messenger';
|
|
8
|
+
export { HttpClient } from './http-client';
|
|
9
|
+
export { StreamingClientError, StreamingSubscriptionError, parseJwt } from './utils';
|
|
10
|
+
export default Client;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.parseJwt = exports.StreamingSubscriptionError = exports.StreamingClientError = exports.HttpClient = void 0;
|
|
18
|
+
/// <reference path="types/libs.ts" />
|
|
19
|
+
const client_1 = require("./client");
|
|
20
|
+
__exportStar(require("./types/genesys-cloud-media-session"), exports);
|
|
21
|
+
__exportStar(require("./types/stanza-media-session"), exports);
|
|
22
|
+
__exportStar(require("./types/media-session"), exports);
|
|
23
|
+
__exportStar(require("./types/interfaces"), exports);
|
|
24
|
+
__exportStar(require("./messenger"), exports);
|
|
25
|
+
var http_client_1 = require("./http-client");
|
|
26
|
+
Object.defineProperty(exports, "HttpClient", { enumerable: true, get: function () { return http_client_1.HttpClient; } });
|
|
27
|
+
var utils_1 = require("./utils");
|
|
28
|
+
Object.defineProperty(exports, "StreamingClientError", { enumerable: true, get: function () { return utils_1.StreamingClientError; } });
|
|
29
|
+
Object.defineProperty(exports, "StreamingSubscriptionError", { enumerable: true, get: function () { return utils_1.StreamingSubscriptionError; } });
|
|
30
|
+
Object.defineProperty(exports, "parseJwt", { enumerable: true, get: function () { return utils_1.parseJwt; } });
|
|
31
|
+
exports.default = client_1.Client;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ReceivedMessage } from 'stanza/protocol';
|
|
2
|
+
import { Client } from './client';
|
|
3
|
+
import { NamedAgent } from './types/named-agent';
|
|
4
|
+
import { GenesysMediaMessage, StreamingClientExtension } from './types/interfaces';
|
|
5
|
+
import { Emitter } from 'strict-event-emitter';
|
|
6
|
+
declare type MessageWithMediaMessage = {
|
|
7
|
+
from?: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
to?: string;
|
|
10
|
+
mediaMessage: GenesysMediaMessage;
|
|
11
|
+
};
|
|
12
|
+
export declare type MediaMessageEvent = MessageWithMediaMessage & {
|
|
13
|
+
fromMyUser: boolean;
|
|
14
|
+
fromMyClient: boolean;
|
|
15
|
+
};
|
|
16
|
+
export declare type MessengerEvents = {
|
|
17
|
+
mediaMessage: [MediaMessageEvent];
|
|
18
|
+
};
|
|
19
|
+
export declare class MessengerExtension extends Emitter<MessengerEvents> implements StreamingClientExtension {
|
|
20
|
+
private client;
|
|
21
|
+
private stanzaInstance;
|
|
22
|
+
constructor(client: Client, stanzaInstance: NamedAgent);
|
|
23
|
+
get bareJid(): string;
|
|
24
|
+
handleStanzaInstanceChange(stanzaInstance: NamedAgent): void;
|
|
25
|
+
isMediaMessage(msg: any): msg is MessageWithMediaMessage;
|
|
26
|
+
handleMessage(msg: ReceivedMessage): void;
|
|
27
|
+
/**
|
|
28
|
+
* @param msg
|
|
29
|
+
* @returns Promise<messageId>
|
|
30
|
+
*/
|
|
31
|
+
broadcastMessage(msg: MessageWithMediaMessage): Promise<string>;
|
|
32
|
+
get expose(): MessengerExtensionApi;
|
|
33
|
+
}
|
|
34
|
+
export interface MessengerExtensionApi extends Pick<Emitter<MessengerEvents>, 'on' | 'off' | 'once' | 'addListener' | 'removeListener'> {
|
|
35
|
+
broadcastMessage(msg: MessageWithMediaMessage): Promise<string>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MessengerExtension = void 0;
|
|
4
|
+
const strict_event_emitter_1 = require("strict-event-emitter");
|
|
5
|
+
const JID_1 = require("stanza/JID");
|
|
6
|
+
class MessengerExtension extends strict_event_emitter_1.Emitter {
|
|
7
|
+
constructor(client, stanzaInstance) {
|
|
8
|
+
super();
|
|
9
|
+
this.client = client;
|
|
10
|
+
this.stanzaInstance = stanzaInstance;
|
|
11
|
+
}
|
|
12
|
+
get bareJid() {
|
|
13
|
+
return (0, JID_1.toBare)(this.stanzaInstance.jid);
|
|
14
|
+
}
|
|
15
|
+
handleStanzaInstanceChange(stanzaInstance) {
|
|
16
|
+
this.stanzaInstance = stanzaInstance;
|
|
17
|
+
}
|
|
18
|
+
isMediaMessage(msg) {
|
|
19
|
+
return !!msg.mediaMessage;
|
|
20
|
+
}
|
|
21
|
+
handleMessage(msg) {
|
|
22
|
+
if (!this.isMediaMessage(msg)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const fromMyClient = msg.from === this.stanzaInstance.jid;
|
|
26
|
+
const fromMyUser = (0, JID_1.toBare)(msg.from) === this.bareJid;
|
|
27
|
+
this.emit('mediaMessage', { ...msg, fromMyClient, fromMyUser });
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @param msg
|
|
31
|
+
* @returns Promise<messageId>
|
|
32
|
+
*/
|
|
33
|
+
async broadcastMessage(msg) {
|
|
34
|
+
const id = globalThis.crypto.randomUUID();
|
|
35
|
+
msg.id = id;
|
|
36
|
+
msg.from = this.stanzaInstance.jid;
|
|
37
|
+
if (!msg.to) {
|
|
38
|
+
msg.to = this.bareJid;
|
|
39
|
+
}
|
|
40
|
+
await this.stanzaInstance.send('message', msg);
|
|
41
|
+
return id;
|
|
42
|
+
}
|
|
43
|
+
get expose() {
|
|
44
|
+
return {
|
|
45
|
+
broadcastMessage: this.broadcastMessage.bind(this),
|
|
46
|
+
on: this.on.bind(this),
|
|
47
|
+
once: this.once.bind(this),
|
|
48
|
+
off: this.off.bind(this),
|
|
49
|
+
removeListener: this.removeListener.bind(this),
|
|
50
|
+
addListener: this.addListener.bind(this)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
exports.MessengerExtension = MessengerExtension;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { PubsubEvent, PubsubSubscription, PubsubSubscriptionWithOptions } from 'stanza/protocol';
|
|
2
|
+
import { Client } from './client';
|
|
3
|
+
import { IClientOptions, StreamingClientExtension } from './types/interfaces';
|
|
4
|
+
import { NamedAgent } from './types/named-agent';
|
|
5
|
+
import { AxiosResponse } from 'axios';
|
|
6
|
+
export declare class Notifications implements StreamingClientExtension {
|
|
7
|
+
client: Client;
|
|
8
|
+
stanzaInstance?: NamedAgent;
|
|
9
|
+
subscriptions: any;
|
|
10
|
+
bulkSubscriptions: any;
|
|
11
|
+
topicPriorities: any;
|
|
12
|
+
debouncedResubscribe: () => Promise<BulkSubscribeResult>;
|
|
13
|
+
enablePartialBulkResubscribe: boolean;
|
|
14
|
+
private internalSubscriptions;
|
|
15
|
+
private pendingBulkSubscribeRetry?;
|
|
16
|
+
private pendingConnectedWait?;
|
|
17
|
+
constructor(client: any, options?: IClientOptions);
|
|
18
|
+
get pubsubHost(): string;
|
|
19
|
+
handleStanzaInstanceChange(stanza: NamedAgent): void;
|
|
20
|
+
topicHandlers(topic: string): Array<(obj?: any) => void>;
|
|
21
|
+
pubsubEvent({ pubsub }: {
|
|
22
|
+
pubsub: PubsubEvent;
|
|
23
|
+
}): void;
|
|
24
|
+
xmppSubscribe(topic: string): Promise<PubsubSubscriptionWithOptions | void>;
|
|
25
|
+
xmppUnsubscribe(topic: string): Promise<PubsubSubscription | void>;
|
|
26
|
+
mapCombineTopics(topics: string[]): Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
}>;
|
|
29
|
+
prioritizeTopicList(topics: Array<{
|
|
30
|
+
id: string;
|
|
31
|
+
}>): Array<{
|
|
32
|
+
id: string;
|
|
33
|
+
}>;
|
|
34
|
+
getTopicPriority(topic: string, returnDefault?: boolean): number;
|
|
35
|
+
truncateTopicList(topics: Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
}>): Array<{
|
|
38
|
+
id: string;
|
|
39
|
+
}>;
|
|
40
|
+
makeBulkSubscribeRequest(topics: string[], options: any): Promise<AxiosResponse<ChannelTopicsEntityListing>>;
|
|
41
|
+
createSubscription(topic: string, handler: (obj?: any) => void): void;
|
|
42
|
+
removeSubscription(topic: string, handler: (obj?: any) => void): void;
|
|
43
|
+
removeTopicPriority(topic: string): void;
|
|
44
|
+
getActiveIndividualTopics(): string[];
|
|
45
|
+
resubscribe(): Promise<BulkSubscribeResult>;
|
|
46
|
+
subscriptionsKeepAlive(): void;
|
|
47
|
+
getTopicParts(topic: string): {
|
|
48
|
+
prefix: string;
|
|
49
|
+
postfixes: string[];
|
|
50
|
+
};
|
|
51
|
+
setTopicPriorities(priorities?: {}): void;
|
|
52
|
+
subscribe(topic: string, handler?: (..._: any[]) => void, immediate?: boolean, priority?: number): Promise<TopicSubscribeResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Use `_subscribeInternal` when subscribing to a topic from within streaming-client itself.
|
|
55
|
+
* Internal subscriptions won't be overwritten by subscriptions from consumers and will be prioritized
|
|
56
|
+
* over subscriptions from consumers.
|
|
57
|
+
*/
|
|
58
|
+
_subscribeInternal(topic: string): Promise<PubsubSubscriptionWithOptions | void>;
|
|
59
|
+
unsubscribe(topic: string, handler?: (..._: any[]) => void, immediate?: boolean): Promise<any>;
|
|
60
|
+
bulkSubscribe(topics: string[], options?: BulkSubscribeOpts, priorities?: {
|
|
61
|
+
[topicName: string]: number;
|
|
62
|
+
}): Promise<BulkSubscribeResult>;
|
|
63
|
+
get expose(): NotificationsAPI;
|
|
64
|
+
}
|
|
65
|
+
export interface NotificationsAPI {
|
|
66
|
+
subscribe(topic: string, handler?: (..._: any[]) => void, immediate?: boolean, priority?: number): Promise<any>;
|
|
67
|
+
unsubscribe(topic: string, handler?: (..._: any[]) => void, immediate?: boolean): Promise<any>;
|
|
68
|
+
bulkSubscribe(topics: string[], options?: BulkSubscribeOpts, priorities?: {
|
|
69
|
+
[topicName: string]: number;
|
|
70
|
+
}): Promise<any>;
|
|
71
|
+
}
|
|
72
|
+
export interface BulkSubscribeOpts {
|
|
73
|
+
replace?: boolean;
|
|
74
|
+
force?: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface BulkSubscribeResult {
|
|
77
|
+
[topic: string]: TopicSubscribeResult;
|
|
78
|
+
}
|
|
79
|
+
export interface TopicSubscribeResult {
|
|
80
|
+
topic: string;
|
|
81
|
+
state: 'Permitted' | 'Rejected' | 'Unknown';
|
|
82
|
+
rejectionReason?: string;
|
|
83
|
+
missingPermissions?: string[];
|
|
84
|
+
}
|
|
85
|
+
export interface ChannelTopicResponseEntity {
|
|
86
|
+
id: string;
|
|
87
|
+
state: 'Permitted' | 'Rejected';
|
|
88
|
+
rejectionReason?: string;
|
|
89
|
+
missingPermissions?: string[];
|
|
90
|
+
selfUri?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface ChannelTopicsEntityListing {
|
|
93
|
+
entities: ChannelTopicResponseEntity[];
|
|
94
|
+
}
|