@norskvideo/norsk-sdk 1.0.368 → 1.0.370
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/lib/package.json +2 -2
- package/lib/src/media_nodes/processor.d.ts +49 -2
- package/lib/src/media_nodes/processor.js +105 -1
- package/lib/src/sdk.js +4 -6
- package/package.json +2 -2
- package/src/sdk.ts +7 -3
- package/dist/norsk-sdk.d.ts +0 -5945
- package/lib/src/tsdoc-metadata.json +0 -11
package/lib/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"license": "MIT",
|
|
3
3
|
"name": "@norskvideo/norsk-sdk",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.370",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@bufbuild/protobuf": "^0.3.0",
|
|
7
7
|
"@grpc/grpc-js": "^1.2.2",
|
|
8
|
-
"@norskvideo/norsk-api": "1.0.
|
|
8
|
+
"@norskvideo/norsk-api": "1.0.370",
|
|
9
9
|
"lodash": "^4.17.21",
|
|
10
10
|
"typescript-nullable": "^0.6.0"
|
|
11
11
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { PlainMessage } from "@bufbuild/protobuf";
|
|
3
|
-
import { StreamStatisticsSampling, Subscription } from "@norskvideo/norsk-api/lib/media_pb";
|
|
3
|
+
import { StreamStatisticsSampling, Subscription, SipEvent_Status } from "@norskvideo/norsk-api/lib/media_pb";
|
|
4
4
|
import { FrameRate, VancPayloadFormat, VancType2AncillaryId } from "../types";
|
|
5
5
|
import { AutoSinkMediaNode, MediaClient, MediaNodeState, SinkNodeSettings, SourceMediaNode, SourceMediaNodeEvents, SourceNodeSettings, StreamStatisticsMixin } from "./common";
|
|
6
6
|
import { AacProfile, AudioMeasureLevels, AwsCredentials, ChannelLayout, ComposeMissingStreamBehaviour, ComposeHardwareAcceleration, Db, IceServerSettings, LoganH264, LoganHevc, MultiStreamStatistics, NvidiaH264, NvidiaHevc, PixelFormat, QuadraH264, QuadraHevc, AmdU30H264, AmdU30Hevc, AmdMA35DH264, AmdMA35DHevc, Resolution, SampleAspectRatio, SampleRate, SentenceBuildMode, SimpleEasing, StabilizationMode, StreamKey, StreamMetadata, X264Codec, X265Codec, SubscriptionError, DeinterlaceSettings, Scte35SpliceInfoSection, Interval, SampleFormat } from "./types";
|
|
@@ -1160,6 +1160,52 @@ export declare class WebRTCBrowserNode extends AutoProcessorMediaNode<"audio" |
|
|
|
1160
1160
|
/** @public The URL of the local player */
|
|
1161
1161
|
playerUrl: string;
|
|
1162
1162
|
}
|
|
1163
|
+
/**
|
|
1164
|
+
* @public
|
|
1165
|
+
* Settings for a SIP session
|
|
1166
|
+
*/
|
|
1167
|
+
export interface SipSettings extends ProcessorNodeSettings<SipNode>, StreamStatisticsMixin {
|
|
1168
|
+
sourceName: string;
|
|
1169
|
+
bufferDelayMs?: number;
|
|
1170
|
+
account: SipAccountSettings;
|
|
1171
|
+
call: SipCallSettings;
|
|
1172
|
+
onStatus?: (status: SipEvent_Status) => void;
|
|
1173
|
+
onConnectionStats?: (stats: SipConnectionStatistics) => void;
|
|
1174
|
+
}
|
|
1175
|
+
export interface SipAccountSettings {
|
|
1176
|
+
id: string;
|
|
1177
|
+
credentials: SipAccountCredentials;
|
|
1178
|
+
regUri?: string;
|
|
1179
|
+
}
|
|
1180
|
+
export interface SipAccountCredentials {
|
|
1181
|
+
realm: string;
|
|
1182
|
+
username: string;
|
|
1183
|
+
credential: SipAccountCredential;
|
|
1184
|
+
}
|
|
1185
|
+
export declare type SipAccountCredential = {
|
|
1186
|
+
type: "plain";
|
|
1187
|
+
password: string;
|
|
1188
|
+
} | {
|
|
1189
|
+
type: "digest";
|
|
1190
|
+
digest: string;
|
|
1191
|
+
};
|
|
1192
|
+
export interface SipCallSettings {
|
|
1193
|
+
address: string;
|
|
1194
|
+
}
|
|
1195
|
+
export interface SipConnectionStatistics {
|
|
1196
|
+
send: SipStreamStatistics;
|
|
1197
|
+
receive: SipStreamStatistics;
|
|
1198
|
+
}
|
|
1199
|
+
export interface SipStreamStatistics {
|
|
1200
|
+
numBytes: number;
|
|
1201
|
+
numPackets: number;
|
|
1202
|
+
}
|
|
1203
|
+
/**
|
|
1204
|
+
* @public
|
|
1205
|
+
* see: {@link NorskDuplex.sip}
|
|
1206
|
+
*/
|
|
1207
|
+
export declare class SipNode extends AutoProcessorMediaNode<"audio"> {
|
|
1208
|
+
}
|
|
1163
1209
|
/**
|
|
1164
1210
|
* @public
|
|
1165
1211
|
* Methods that allow you to both ingest and egest media from your application
|
|
@@ -1171,10 +1217,11 @@ export interface NorskDuplex {
|
|
|
1171
1217
|
* The browser client must conform to a custom protocol as implemented in the hosted test page.
|
|
1172
1218
|
* (Available from {@link WebRTCBrowserNode.playerUrl}
|
|
1173
1219
|
* For general WebRTC ingest prefer the WHIP input node, and for egest to a downstream media server
|
|
1174
|
-
* use the WHIP output node.
|
|
1220
|
+
* use the WHIP output node. For browser egest (e.g. stream preview) use the WHEP output node.
|
|
1175
1221
|
* @param settings - Options for the webrtc node
|
|
1176
1222
|
*/
|
|
1177
1223
|
webRtcBrowser(settings: WebRTCBrowserSettings): Promise<WebRTCBrowserNode>;
|
|
1224
|
+
sip(settings: SipSettings): Promise<SipNode>;
|
|
1178
1225
|
}
|
|
1179
1226
|
/**
|
|
1180
1227
|
* @public
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.NorskProcessor = exports.WebRTCBrowserNode = exports.StreamChaosMonkeyNode = exports.VideoTransformNode = exports.VideoDecodeNode = exports.VideoEncodeNode = exports.AudioTranscribeWhisperNode = exports.AudioTranscribeAzureNode = exports.SubtitleConvertNode = exports.SubtitleTranslateAwsNode = exports.AudioTranscribeAwsNode = exports.AudioBuildMultichannelNode = exports.AudioSplitMultichannelNode = exports.AudioGainNode = exports.AudioMixMatrixNode = exports.AudioMixNode = exports.VideoComposeNode = exports.AudioEncodeNode = exports.MetadataCombineMode = exports.AncillaryNode = exports.StreamConditionNode = exports.StreamAlignNode = exports.StreamSyncNode = exports.JitterBufferNode = exports.StreamMetadataOverrideNode = exports.StreamKeyOverrideNode = exports.StreamTimestampNudgeNode = exports.AudioMeasureLevelsNode = exports.StreamStatisticsNode = exports.StreamSwitchSmoothNode = exports.StreamSwitchHardNode = exports.AutoProcessorMediaNode = exports.ProcessorMediaNode = void 0;
|
|
6
|
+
exports.NorskProcessor = exports.SipNode = exports.WebRTCBrowserNode = exports.StreamChaosMonkeyNode = exports.VideoTransformNode = exports.VideoDecodeNode = exports.VideoEncodeNode = exports.AudioTranscribeWhisperNode = exports.AudioTranscribeAzureNode = exports.SubtitleConvertNode = exports.SubtitleTranslateAwsNode = exports.AudioTranscribeAwsNode = exports.AudioBuildMultichannelNode = exports.AudioSplitMultichannelNode = exports.AudioGainNode = exports.AudioMixMatrixNode = exports.AudioMixNode = exports.VideoComposeNode = exports.AudioEncodeNode = exports.MetadataCombineMode = exports.AncillaryNode = exports.StreamConditionNode = exports.StreamAlignNode = exports.StreamSyncNode = exports.JitterBufferNode = exports.StreamMetadataOverrideNode = exports.StreamKeyOverrideNode = exports.StreamTimestampNudgeNode = exports.AudioMeasureLevelsNode = exports.StreamStatisticsNode = exports.StreamSwitchSmoothNode = exports.StreamSwitchHardNode = exports.AutoProcessorMediaNode = exports.ProcessorMediaNode = void 0;
|
|
7
7
|
const events_1 = __importDefault(require("events"));
|
|
8
8
|
const media_pb_1 = require("@norskvideo/norsk-api/lib/media_pb");
|
|
9
9
|
const common_pb_1 = require("@norskvideo/norsk-api/lib/shared/common_pb");
|
|
@@ -2418,6 +2418,110 @@ class WebRTCBrowserNode extends AutoProcessorMediaNode {
|
|
|
2418
2418
|
}
|
|
2419
2419
|
}
|
|
2420
2420
|
exports.WebRTCBrowserNode = WebRTCBrowserNode;
|
|
2421
|
+
/**
|
|
2422
|
+
* @public
|
|
2423
|
+
* see: {@link NorskDuplex.sip}
|
|
2424
|
+
*/
|
|
2425
|
+
class SipNode extends AutoProcessorMediaNode {
|
|
2426
|
+
/** @internal */
|
|
2427
|
+
constructor(settings, client, unregisterNode) {
|
|
2428
|
+
super(client, unregisterNode, () => this.grpcStream, async (subscription) => this.grpcStream.write((0, utils_1.provideFull)(media_pb_1.SipMessage, (0, utils_1.mkMessageCase)({ subscription }))));
|
|
2429
|
+
this.defaultSubscriptionValidation = this.restrictiveSubscriptionValidation;
|
|
2430
|
+
this.subscriptionValidation = this.restrictiveSubscriptionValidation;
|
|
2431
|
+
function accountToApi(account) {
|
|
2432
|
+
const cred = account.credentials.credential;
|
|
2433
|
+
const credential = cred.type === "digest" ? (0, utils_1.provideFull)(media_pb_1.SipCredentialData, (0, utils_1.mkMessageCase)({ digest: cred.digest })) : (0, utils_1.provideFull)(media_pb_1.SipCredentialData, (0, utils_1.mkMessageCase)({ plain: cred.password }));
|
|
2434
|
+
return (0, utils_1.provideFull)(media_pb_1.SipAccount, {
|
|
2435
|
+
id: account.id,
|
|
2436
|
+
regUri: account.regUri || "",
|
|
2437
|
+
credentials: (0, utils_1.provideFull)(media_pb_1.SipCredentials, {
|
|
2438
|
+
realm: account.credentials.realm,
|
|
2439
|
+
username: account.credentials.username,
|
|
2440
|
+
credential
|
|
2441
|
+
})
|
|
2442
|
+
});
|
|
2443
|
+
}
|
|
2444
|
+
function callToApi(call) {
|
|
2445
|
+
return (0, utils_1.provideFull)(media_pb_1.SipCall, {
|
|
2446
|
+
address: call.address
|
|
2447
|
+
});
|
|
2448
|
+
}
|
|
2449
|
+
function toConnectionStatistics(stats) {
|
|
2450
|
+
return ({
|
|
2451
|
+
send: {
|
|
2452
|
+
numBytes: stats.send?.numBytes || 0,
|
|
2453
|
+
numPackets: stats.send?.numPackets || 0
|
|
2454
|
+
},
|
|
2455
|
+
receive: {
|
|
2456
|
+
numBytes: stats.recv?.numBytes || 0,
|
|
2457
|
+
numPackets: stats.recv?.numPackets || 0
|
|
2458
|
+
}
|
|
2459
|
+
});
|
|
2460
|
+
}
|
|
2461
|
+
const sipConfig = (0, utils_1.provideFull)(media_pb_1.SipConfiguration, {
|
|
2462
|
+
...settings,
|
|
2463
|
+
id: settings.id
|
|
2464
|
+
? (0, utils_1.provideFull)(media_pb_1.MediaNodeId, { id: settings.id })
|
|
2465
|
+
: undefined,
|
|
2466
|
+
sourceName: settings.sourceName,
|
|
2467
|
+
account: accountToApi(settings.account),
|
|
2468
|
+
bufferDelayMs: (0, types_2.toOptInt)(settings.bufferDelayMs),
|
|
2469
|
+
call: callToApi(settings.call),
|
|
2470
|
+
statsSampling: settings.statsSampling
|
|
2471
|
+
? (0, utils_1.provideFull)(media_pb_1.StreamStatisticsSampling, settings.statsSampling)
|
|
2472
|
+
: undefined
|
|
2473
|
+
});
|
|
2474
|
+
this.grpcStream = this.client.media.createDuplexSip();
|
|
2475
|
+
this.grpcStream.write((0, utils_1.provideFull)(media_pb_1.SipMessage, (0, utils_1.mkMessageCase)({ configuration: sipConfig })));
|
|
2476
|
+
this.initialised = new Promise((resolve, reject) => {
|
|
2477
|
+
this.grpcStream.on("data", (data) => {
|
|
2478
|
+
const messageCase = data.message.case;
|
|
2479
|
+
switch (messageCase) {
|
|
2480
|
+
case undefined:
|
|
2481
|
+
break;
|
|
2482
|
+
case "subscriptionResponse":
|
|
2483
|
+
super.subscriptionResponse(data.message.value);
|
|
2484
|
+
break;
|
|
2485
|
+
case "inboundContext": {
|
|
2486
|
+
const context = data.message.value;
|
|
2487
|
+
super.handleInboundContext(context);
|
|
2488
|
+
break;
|
|
2489
|
+
}
|
|
2490
|
+
case "outboundContext": {
|
|
2491
|
+
const context = data.message.value;
|
|
2492
|
+
super.outboundContextChange(context);
|
|
2493
|
+
break;
|
|
2494
|
+
}
|
|
2495
|
+
case "nodeId": {
|
|
2496
|
+
this.id = data.message.value.id;
|
|
2497
|
+
settings.onCreate && settings.onCreate(this);
|
|
2498
|
+
resolve();
|
|
2499
|
+
break;
|
|
2500
|
+
}
|
|
2501
|
+
case "streamStatistics":
|
|
2502
|
+
settings.onStreamStatistics?.((0, types_2.fromStreamStatistics)(data.message.value, this.subscribedStreams));
|
|
2503
|
+
break;
|
|
2504
|
+
case "status":
|
|
2505
|
+
settings.onStatus?.(data.message.value);
|
|
2506
|
+
break;
|
|
2507
|
+
case "connectionStatistics":
|
|
2508
|
+
settings.onConnectionStats?.(toConnectionStatistics(data.message.value));
|
|
2509
|
+
break;
|
|
2510
|
+
default:
|
|
2511
|
+
(0, utils_1.exhaustiveCheck)(messageCase);
|
|
2512
|
+
}
|
|
2513
|
+
});
|
|
2514
|
+
(0, common_1.registerStreamHandlers)(this.grpcStream, () => unregisterNode(this), "webRtc", reject, settings);
|
|
2515
|
+
});
|
|
2516
|
+
}
|
|
2517
|
+
/** @internal */
|
|
2518
|
+
static async create(settings, client, unregisterNode) {
|
|
2519
|
+
const node = new SipNode(settings, client, unregisterNode);
|
|
2520
|
+
await node.initialised;
|
|
2521
|
+
return node;
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
exports.SipNode = SipNode;
|
|
2421
2525
|
/** @public */
|
|
2422
2526
|
class NorskProcessor {
|
|
2423
2527
|
constructor(client) {
|
package/lib/src/sdk.js
CHANGED
|
@@ -25,9 +25,6 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
25
25
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
26
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
27
|
};
|
|
28
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
29
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
30
|
-
};
|
|
31
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
29
|
exports.streamKeysAreEqual = exports.requireExactAV = exports.requireAV = exports.subtitlesToPin = exports.sourceToPin = exports.avToPin = exports.audioToPin = exports.videoToPin = exports.mkEncryption = exports.selectPlaylist = exports.selectExactKey = exports.selectVideoRendition = exports.selectAncillary = exports.selectVideo = exports.selectAudio = exports.selectSubtitles = exports.selectAV = exports.selectAll = exports.mkSine = exports.newSilentMatrix = exports.ancillaryStreamKeys = exports.playlistStreamKeys = exports.subtitleStreamKeys = exports.videoStreamKeys = exports.audioStreamKeys = exports.ancillaryStreams = exports.playlistStreams = exports.subtitleStreams = exports.videoStreams = exports.audioStreams = exports.Norsk = exports.Version = exports.AudioCodec = exports.AmdMA35DLoad = exports.CurrentLoad = void 0;
|
|
33
30
|
const grpc = __importStar(require("@grpc/grpc-js"));
|
|
@@ -42,8 +39,8 @@ const output_1 = require("./media_nodes/output");
|
|
|
42
39
|
const system_1 = require("./system");
|
|
43
40
|
const debug_1 = require("./media_nodes/debug");
|
|
44
41
|
const mediaStore_1 = require("./media_nodes/mediaStore");
|
|
45
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
46
42
|
const pj = require("../package.json");
|
|
43
|
+
const connectivity_state_1 = require("@grpc/grpc-js/build/src/connectivity-state");
|
|
47
44
|
__exportStar(require("./types"), exports);
|
|
48
45
|
__exportStar(require("./system"), exports);
|
|
49
46
|
__exportStar(require("./media_nodes/types"), exports);
|
|
@@ -143,6 +140,7 @@ class Norsk {
|
|
|
143
140
|
};
|
|
144
141
|
this.duplex = {
|
|
145
142
|
webRtcBrowser: async (settings) => processor_1.WebRTCBrowserNode.create(settings, this._client(), unregisterNode).then(registerNode),
|
|
143
|
+
sip: async (settings) => processor_1.SipNode.create(settings, this._client(), unregisterNode).then(registerNode)
|
|
146
144
|
};
|
|
147
145
|
}
|
|
148
146
|
/** @internal */
|
|
@@ -226,7 +224,7 @@ class Norsk {
|
|
|
226
224
|
const stringVersion = `${this.version.majorVersion}.${this.version.minorVersion}.${this.version.buildNumber}`;
|
|
227
225
|
if (stringVersion != this.sdkVersion) {
|
|
228
226
|
const warning = `Norsk version mismatch: SDK=${this.sdkVersion}, runtime=${stringVersion}\nBEWARE POTENTIAL GRPC API CHANGES\nFunctionality may be partially or completely broken`;
|
|
229
|
-
console.error(
|
|
227
|
+
console.error(warning);
|
|
230
228
|
(0, utils_1.errorlog)(warning);
|
|
231
229
|
}
|
|
232
230
|
this.resolveVersion();
|
|
@@ -344,7 +342,7 @@ class Norsk {
|
|
|
344
342
|
break;
|
|
345
343
|
}
|
|
346
344
|
}
|
|
347
|
-
(0, utils_1.debuglog)("Channel connectivity state change: %d", connectivityState);
|
|
345
|
+
(0, utils_1.debuglog)("Channel connectivity state change: %d (%s)", connectivityState, connectivity_state_1.ConnectivityState[connectivityState]);
|
|
348
346
|
this.connectivityState = connectivityState;
|
|
349
347
|
channel.watchConnectivityState(connectivityState, Infinity, () => {
|
|
350
348
|
this.connectivityStateWatcher();
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"license": "MIT",
|
|
3
3
|
"name": "@norskvideo/norsk-sdk",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.370",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@bufbuild/protobuf": "^0.3.0",
|
|
7
7
|
"@grpc/grpc-js": "^1.2.2",
|
|
8
|
-
"@norskvideo/norsk-api": "1.0.
|
|
8
|
+
"@norskvideo/norsk-api": "1.0.370",
|
|
9
9
|
"lodash": "^4.17.21",
|
|
10
10
|
"typescript-nullable": "^0.6.0"
|
|
11
11
|
},
|
package/src/sdk.ts
CHANGED
|
@@ -56,6 +56,8 @@ import {
|
|
|
56
56
|
WebRTCBrowserNode,
|
|
57
57
|
WebRTCBrowserSettings,
|
|
58
58
|
NorskDuplex,
|
|
59
|
+
SipSettings,
|
|
60
|
+
SipNode,
|
|
59
61
|
} from "./media_nodes/processor";
|
|
60
62
|
import {
|
|
61
63
|
CmafAudioOutputNode,
|
|
@@ -109,9 +111,9 @@ import {
|
|
|
109
111
|
MediaStoreSnapshotSettings,
|
|
110
112
|
MediaStoreSnapshot,
|
|
111
113
|
} from "./media_nodes/mediaStore";
|
|
112
|
-
import chalk from "chalk";
|
|
113
114
|
|
|
114
115
|
import pj = require("../package.json");
|
|
116
|
+
import { ConnectivityState } from "@grpc/grpc-js/build/src/connectivity-state";
|
|
115
117
|
|
|
116
118
|
export * from "./types";
|
|
117
119
|
export * from "./system";
|
|
@@ -345,7 +347,7 @@ export class Norsk {
|
|
|
345
347
|
const stringVersion = `${this.version.majorVersion}.${this.version.minorVersion}.${this.version.buildNumber}`;
|
|
346
348
|
if (stringVersion != this.sdkVersion) {
|
|
347
349
|
const warning = `Norsk version mismatch: SDK=${this.sdkVersion}, runtime=${stringVersion}\nBEWARE POTENTIAL GRPC API CHANGES\nFunctionality may be partially or completely broken`;
|
|
348
|
-
console.error(
|
|
350
|
+
console.error(warning);
|
|
349
351
|
errorlog(warning)
|
|
350
352
|
}
|
|
351
353
|
|
|
@@ -473,7 +475,7 @@ export class Norsk {
|
|
|
473
475
|
break;
|
|
474
476
|
}
|
|
475
477
|
}
|
|
476
|
-
debuglog("Channel connectivity state change: %d", connectivityState);
|
|
478
|
+
debuglog("Channel connectivity state change: %d (%s)", connectivityState, ConnectivityState[connectivityState]);
|
|
477
479
|
|
|
478
480
|
this.connectivityState = connectivityState;
|
|
479
481
|
channel.watchConnectivityState(connectivityState, Infinity, () => {
|
|
@@ -615,6 +617,8 @@ export class Norsk {
|
|
|
615
617
|
this.duplex = {
|
|
616
618
|
webRtcBrowser: async (settings: WebRTCBrowserSettings) =>
|
|
617
619
|
WebRTCBrowserNode.create(settings, this._client(), unregisterNode).then(registerNode),
|
|
620
|
+
sip: async (settings: SipSettings) =>
|
|
621
|
+
SipNode.create(settings, this._client(), unregisterNode).then(registerNode)
|
|
618
622
|
};
|
|
619
623
|
}
|
|
620
624
|
}
|