@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 CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "license": "MIT",
3
3
  "name": "@norskvideo/norsk-sdk",
4
- "version": "1.0.368",
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.368",
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(chalk_1.default.red(warning));
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.368",
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.368",
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(chalk.red(warning));
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
  }