@whereby.com/media 8.0.0 → 8.0.2
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/dist/index.cjs +135 -146
- package/dist/index.d.cts +28 -20
- package/dist/index.d.mts +28 -20
- package/dist/index.d.ts +28 -20
- package/dist/index.mjs +135 -146
- package/dist/legacy-esm.js +135 -146
- package/package.json +2 -2
package/dist/legacy-esm.js
CHANGED
|
@@ -2196,8 +2196,7 @@ var _a$4;
|
|
|
2196
2196
|
const adapter$4 = (_a$4 = adapterRaw.default) !== null && _a$4 !== void 0 ? _a$4 : adapterRaw;
|
|
2197
2197
|
const logger$7 = new Logger();
|
|
2198
2198
|
class Session {
|
|
2199
|
-
constructor({
|
|
2200
|
-
this.peerConnectionId = peerConnectionId;
|
|
2199
|
+
constructor({ clientId, bandwidth, peerConnectionConfig, deprioritizeH264Encoding, incrementAnalyticMetric, }) {
|
|
2201
2200
|
this.relayCandidateSeen = false;
|
|
2202
2201
|
this.serverReflexiveCandidateSeen = false;
|
|
2203
2202
|
this.publicHostCandidateSeen = false;
|
|
@@ -2734,8 +2733,8 @@ class P2pRtcManager {
|
|
|
2734
2733
|
}
|
|
2735
2734
|
disconnectAll() {
|
|
2736
2735
|
logger$6.info("disconnectAll()");
|
|
2737
|
-
Object.keys(this.peerConnections).forEach((
|
|
2738
|
-
this.disconnect(
|
|
2736
|
+
Object.keys(this.peerConnections).forEach((clientId) => {
|
|
2737
|
+
this.disconnect(clientId);
|
|
2739
2738
|
});
|
|
2740
2739
|
this.peerConnections = {};
|
|
2741
2740
|
this._socketListenerDeregisterFunctions.forEach((func) => {
|
|
@@ -2934,16 +2933,14 @@ class P2pRtcManager {
|
|
|
2934
2933
|
_emit(eventName, data) {
|
|
2935
2934
|
this._emitter.emit(eventName, data);
|
|
2936
2935
|
}
|
|
2937
|
-
_getSession(
|
|
2938
|
-
if (!(
|
|
2936
|
+
_getSession(clientId) {
|
|
2937
|
+
if (!(clientId in this.peerConnections)) {
|
|
2939
2938
|
return null;
|
|
2940
2939
|
}
|
|
2941
|
-
return this.peerConnections[
|
|
2940
|
+
return this.peerConnections[clientId];
|
|
2942
2941
|
}
|
|
2943
|
-
_createSession({ clientId, initialBandwidth, isOfferer
|
|
2944
|
-
|
|
2945
|
-
throw new Error("peerConnectionId is missing");
|
|
2946
|
-
}
|
|
2942
|
+
_createSession({ clientId, initialBandwidth, isOfferer }) {
|
|
2943
|
+
var _a, _b;
|
|
2947
2944
|
if (!clientId) {
|
|
2948
2945
|
throw new Error("clientId is missing");
|
|
2949
2946
|
}
|
|
@@ -2958,17 +2955,121 @@ class P2pRtcManager {
|
|
|
2958
2955
|
browserVersion >= 14 &&
|
|
2959
2956
|
this._features.deprioritizeH264OnSafari;
|
|
2960
2957
|
const session = new Session({
|
|
2961
|
-
peerConnectionId,
|
|
2962
2958
|
clientId,
|
|
2963
2959
|
peerConnectionConfig,
|
|
2964
2960
|
bandwidth: initialBandwidth,
|
|
2965
2961
|
deprioritizeH264Encoding,
|
|
2966
2962
|
incrementAnalyticMetric: (metric) => this.analytics[metric]++,
|
|
2967
2963
|
});
|
|
2968
|
-
this.peerConnections[
|
|
2964
|
+
this.peerConnections[clientId] = session;
|
|
2969
2965
|
setTimeout(() => this._emit(rtcManagerEvents.NEW_PC), 0);
|
|
2970
2966
|
this.analytics.numNewPc++;
|
|
2971
2967
|
const { pc } = session;
|
|
2968
|
+
pc.onicegatheringstatechange = (event) => {
|
|
2969
|
+
const connection = event.target;
|
|
2970
|
+
switch (connection.iceGatheringState) {
|
|
2971
|
+
case "gathering":
|
|
2972
|
+
if (this._icePublicIPGatheringTimeoutID)
|
|
2973
|
+
clearTimeout(this._icePublicIPGatheringTimeoutID);
|
|
2974
|
+
this._icePublicIPGatheringTimeoutID = setTimeout(() => {
|
|
2975
|
+
if (!session.publicHostCandidateSeen &&
|
|
2976
|
+
!session.relayCandidateSeen &&
|
|
2977
|
+
!session.serverReflexiveCandidateSeen) {
|
|
2978
|
+
if (pc.iceConnectionState !== "connected" && pc.iceConnectionState !== "completed")
|
|
2979
|
+
this.analytics.numIceNoPublicIpGatheredIn3sec++;
|
|
2980
|
+
}
|
|
2981
|
+
}, ICE_PUBLIC_IP_GATHERING_TIMEOUT);
|
|
2982
|
+
break;
|
|
2983
|
+
case "complete":
|
|
2984
|
+
if (this._icePublicIPGatheringTimeoutID)
|
|
2985
|
+
clearTimeout(this._icePublicIPGatheringTimeoutID);
|
|
2986
|
+
this._icePublicIPGatheringTimeoutID = null;
|
|
2987
|
+
break;
|
|
2988
|
+
}
|
|
2989
|
+
};
|
|
2990
|
+
pc.onicecandidate = (event) => {
|
|
2991
|
+
if (event.candidate) {
|
|
2992
|
+
if (event.candidate.type === "relayed") {
|
|
2993
|
+
this.analytics.P2PRelayedIceCandidate++;
|
|
2994
|
+
}
|
|
2995
|
+
switch (event.candidate.type) {
|
|
2996
|
+
case "host":
|
|
2997
|
+
const address = event.candidate.address;
|
|
2998
|
+
if (!address) {
|
|
2999
|
+
break;
|
|
3000
|
+
}
|
|
3001
|
+
try {
|
|
3002
|
+
if (ipRegex.v4({ exact: true }).test(address)) {
|
|
3003
|
+
const ipv4 = checkIp(address);
|
|
3004
|
+
if (ipv4.isPublicIp)
|
|
3005
|
+
session.publicHostCandidateSeen = true;
|
|
3006
|
+
}
|
|
3007
|
+
else if (ipRegex.v6({ exact: true }).test(address.replace(/^\[(.*)\]/, "$1"))) {
|
|
3008
|
+
const ipv6 = new Address6(address.replace(/^\[(.*)\]/, "$1"));
|
|
3009
|
+
session.ipv6HostCandidateSeen = true;
|
|
3010
|
+
if (ipv6.getScope() === "Global") {
|
|
3011
|
+
session.publicHostCandidateSeen = true;
|
|
3012
|
+
}
|
|
3013
|
+
if (ipv6.isTeredo()) {
|
|
3014
|
+
session.ipv6HostCandidateTeredoSeen = true;
|
|
3015
|
+
}
|
|
3016
|
+
if (ipv6.is6to4()) {
|
|
3017
|
+
session.ipv6HostCandidate6to4Seen = true;
|
|
3018
|
+
}
|
|
3019
|
+
}
|
|
3020
|
+
else {
|
|
3021
|
+
const uuidv4 = address.replace(/.local/, "");
|
|
3022
|
+
if (uuidv4 && validate(uuidv4, 4)) {
|
|
3023
|
+
session.mdnsHostCandidateSeen = true;
|
|
3024
|
+
}
|
|
3025
|
+
}
|
|
3026
|
+
}
|
|
3027
|
+
catch (error) {
|
|
3028
|
+
logger$6.info("Error during parsing candidates! Error: ", { error });
|
|
3029
|
+
}
|
|
3030
|
+
break;
|
|
3031
|
+
case "srflx":
|
|
3032
|
+
session.serverReflexiveCandidateSeen = true;
|
|
3033
|
+
break;
|
|
3034
|
+
case "relayed":
|
|
3035
|
+
case "relay":
|
|
3036
|
+
session.relayCandidateSeen = true;
|
|
3037
|
+
break;
|
|
3038
|
+
}
|
|
3039
|
+
this._emitServerEvent(RELAY_MESSAGES.ICE_CANDIDATE, {
|
|
3040
|
+
receiverId: clientId,
|
|
3041
|
+
message: event.candidate,
|
|
3042
|
+
});
|
|
3043
|
+
}
|
|
3044
|
+
else {
|
|
3045
|
+
this._emitServerEvent(RELAY_MESSAGES.ICE_END_OF_CANDIDATES, {
|
|
3046
|
+
receiverId: clientId,
|
|
3047
|
+
});
|
|
3048
|
+
if (!session.publicHostCandidateSeen &&
|
|
3049
|
+
!session.relayCandidateSeen &&
|
|
3050
|
+
!session.serverReflexiveCandidateSeen &&
|
|
3051
|
+
pc.iceConnectionState !== "connected" &&
|
|
3052
|
+
pc.iceConnectionState !== "completed") {
|
|
3053
|
+
this.analytics.numIceNoPublicIpGathered++;
|
|
3054
|
+
}
|
|
3055
|
+
if (session.ipv6HostCandidateSeen) {
|
|
3056
|
+
this.analytics.numIceIpv6Seen++;
|
|
3057
|
+
if (session.ipv6HostCandidate6to4Seen)
|
|
3058
|
+
this.analytics.numIceIpv6SixToFour++;
|
|
3059
|
+
if (session.ipv6HostCandidateTeredoSeen)
|
|
3060
|
+
this.analytics.numIceIpv6TeredoSeen++;
|
|
3061
|
+
}
|
|
3062
|
+
if (session.mdnsHostCandidateSeen)
|
|
3063
|
+
this.analytics.numIceMdnsSeen++;
|
|
3064
|
+
}
|
|
3065
|
+
};
|
|
3066
|
+
pc.onnegotiationneeded = () => {
|
|
3067
|
+
if (pc.iceConnectionState === "new" || !session.connectionStatus) {
|
|
3068
|
+
return;
|
|
3069
|
+
}
|
|
3070
|
+
logger$6.info(`onnegotiationneeded client ${clientId}`);
|
|
3071
|
+
this._negotiatePeerConnection({ clientId, session });
|
|
3072
|
+
};
|
|
2972
3073
|
pc.ontrack = (event) => {
|
|
2973
3074
|
const stream = event.streams[0];
|
|
2974
3075
|
if (!stream) {
|
|
@@ -3100,16 +3201,22 @@ class P2pRtcManager {
|
|
|
3100
3201
|
});
|
|
3101
3202
|
}
|
|
3102
3203
|
}
|
|
3204
|
+
if (this._features.increaseIncomingMediaBufferOn) {
|
|
3205
|
+
this._setJitterBufferTarget(pc);
|
|
3206
|
+
}
|
|
3207
|
+
if (((_b = (_a = this._localCameraStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b.length) && this._stoppedVideoTrack) {
|
|
3208
|
+
pc.addTrack(this._stoppedVideoTrack, this._localCameraStream);
|
|
3209
|
+
}
|
|
3103
3210
|
return session;
|
|
3104
3211
|
}
|
|
3105
|
-
_cleanup(
|
|
3106
|
-
const session = this._getSession(
|
|
3212
|
+
_cleanup(clientId) {
|
|
3213
|
+
const session = this._getSession(clientId);
|
|
3107
3214
|
if (!session) {
|
|
3108
|
-
logger$6.warn("No RTCPeerConnection in RTCManager.disconnect()",
|
|
3215
|
+
logger$6.warn("No RTCPeerConnection in RTCManager.disconnect()", clientId);
|
|
3109
3216
|
return;
|
|
3110
3217
|
}
|
|
3111
3218
|
session.close();
|
|
3112
|
-
delete this.peerConnections[
|
|
3219
|
+
delete this.peerConnections[clientId];
|
|
3113
3220
|
}
|
|
3114
3221
|
_forEachPeerConnection(func) {
|
|
3115
3222
|
Object.values(this.peerConnections).forEach((peerConnection) => {
|
|
@@ -3210,7 +3317,7 @@ class P2pRtcManager {
|
|
|
3210
3317
|
else {
|
|
3211
3318
|
initialBandwidth = this._changeBandwidthForAllClients(true);
|
|
3212
3319
|
}
|
|
3213
|
-
session = this.
|
|
3320
|
+
session = this._createSession({
|
|
3214
3321
|
clientId,
|
|
3215
3322
|
initialBandwidth,
|
|
3216
3323
|
isOfferer: true,
|
|
@@ -3374,128 +3481,6 @@ class P2pRtcManager {
|
|
|
3374
3481
|
});
|
|
3375
3482
|
return bandwidth;
|
|
3376
3483
|
}
|
|
3377
|
-
_createP2pSession({ clientId, initialBandwidth, isOfferer = false, }) {
|
|
3378
|
-
var _a, _b;
|
|
3379
|
-
const session = this._createSession({
|
|
3380
|
-
peerConnectionId: clientId,
|
|
3381
|
-
clientId,
|
|
3382
|
-
initialBandwidth,
|
|
3383
|
-
isOfferer,
|
|
3384
|
-
});
|
|
3385
|
-
const pc = session.pc;
|
|
3386
|
-
if (this._features.increaseIncomingMediaBufferOn) {
|
|
3387
|
-
this._setJitterBufferTarget(pc);
|
|
3388
|
-
}
|
|
3389
|
-
if (((_b = (_a = this._localCameraStream) === null || _a === void 0 ? void 0 : _a.getVideoTracks()) === null || _b === void 0 ? void 0 : _b.length) && this._stoppedVideoTrack) {
|
|
3390
|
-
pc.addTrack(this._stoppedVideoTrack, this._localCameraStream);
|
|
3391
|
-
}
|
|
3392
|
-
pc.onicegatheringstatechange = (event) => {
|
|
3393
|
-
const connection = event.target;
|
|
3394
|
-
switch (connection.iceGatheringState) {
|
|
3395
|
-
case "gathering":
|
|
3396
|
-
if (this._icePublicIPGatheringTimeoutID)
|
|
3397
|
-
clearTimeout(this._icePublicIPGatheringTimeoutID);
|
|
3398
|
-
this._icePublicIPGatheringTimeoutID = setTimeout(() => {
|
|
3399
|
-
if (!session.publicHostCandidateSeen &&
|
|
3400
|
-
!session.relayCandidateSeen &&
|
|
3401
|
-
!session.serverReflexiveCandidateSeen) {
|
|
3402
|
-
if (pc.iceConnectionState !== "connected" && pc.iceConnectionState !== "completed")
|
|
3403
|
-
this.analytics.numIceNoPublicIpGatheredIn3sec++;
|
|
3404
|
-
}
|
|
3405
|
-
}, ICE_PUBLIC_IP_GATHERING_TIMEOUT);
|
|
3406
|
-
break;
|
|
3407
|
-
case "complete":
|
|
3408
|
-
if (this._icePublicIPGatheringTimeoutID)
|
|
3409
|
-
clearTimeout(this._icePublicIPGatheringTimeoutID);
|
|
3410
|
-
this._icePublicIPGatheringTimeoutID = null;
|
|
3411
|
-
break;
|
|
3412
|
-
}
|
|
3413
|
-
};
|
|
3414
|
-
pc.onicecandidate = (event) => {
|
|
3415
|
-
if (event.candidate) {
|
|
3416
|
-
if (event.candidate.type === "relayed") {
|
|
3417
|
-
this.analytics.P2PRelayedIceCandidate++;
|
|
3418
|
-
}
|
|
3419
|
-
switch (event.candidate.type) {
|
|
3420
|
-
case "host":
|
|
3421
|
-
const address = event.candidate.address;
|
|
3422
|
-
if (!address) {
|
|
3423
|
-
break;
|
|
3424
|
-
}
|
|
3425
|
-
try {
|
|
3426
|
-
if (ipRegex.v4({ exact: true }).test(address)) {
|
|
3427
|
-
const ipv4 = checkIp(address);
|
|
3428
|
-
if (ipv4.isPublicIp)
|
|
3429
|
-
session.publicHostCandidateSeen = true;
|
|
3430
|
-
}
|
|
3431
|
-
else if (ipRegex.v6({ exact: true }).test(address.replace(/^\[(.*)\]/, "$1"))) {
|
|
3432
|
-
const ipv6 = new Address6(address.replace(/^\[(.*)\]/, "$1"));
|
|
3433
|
-
session.ipv6HostCandidateSeen = true;
|
|
3434
|
-
if (ipv6.getScope() === "Global") {
|
|
3435
|
-
session.publicHostCandidateSeen = true;
|
|
3436
|
-
}
|
|
3437
|
-
if (ipv6.isTeredo()) {
|
|
3438
|
-
session.ipv6HostCandidateTeredoSeen = true;
|
|
3439
|
-
}
|
|
3440
|
-
if (ipv6.is6to4()) {
|
|
3441
|
-
session.ipv6HostCandidate6to4Seen = true;
|
|
3442
|
-
}
|
|
3443
|
-
}
|
|
3444
|
-
else {
|
|
3445
|
-
const uuidv4 = address.replace(/.local/, "");
|
|
3446
|
-
if (uuidv4 && validate(uuidv4, 4)) {
|
|
3447
|
-
session.mdnsHostCandidateSeen = true;
|
|
3448
|
-
}
|
|
3449
|
-
}
|
|
3450
|
-
}
|
|
3451
|
-
catch (error) {
|
|
3452
|
-
logger$6.info("Error during parsing candidates! Error: ", { error });
|
|
3453
|
-
}
|
|
3454
|
-
break;
|
|
3455
|
-
case "srflx":
|
|
3456
|
-
session.serverReflexiveCandidateSeen = true;
|
|
3457
|
-
break;
|
|
3458
|
-
case "relayed":
|
|
3459
|
-
case "relay":
|
|
3460
|
-
session.relayCandidateSeen = true;
|
|
3461
|
-
break;
|
|
3462
|
-
}
|
|
3463
|
-
this._emitServerEvent(RELAY_MESSAGES.ICE_CANDIDATE, {
|
|
3464
|
-
receiverId: clientId,
|
|
3465
|
-
message: event.candidate,
|
|
3466
|
-
});
|
|
3467
|
-
}
|
|
3468
|
-
else {
|
|
3469
|
-
this._emitServerEvent(RELAY_MESSAGES.ICE_END_OF_CANDIDATES, {
|
|
3470
|
-
receiverId: clientId,
|
|
3471
|
-
});
|
|
3472
|
-
if (!session.publicHostCandidateSeen &&
|
|
3473
|
-
!session.relayCandidateSeen &&
|
|
3474
|
-
!session.serverReflexiveCandidateSeen &&
|
|
3475
|
-
pc.iceConnectionState !== "connected" &&
|
|
3476
|
-
pc.iceConnectionState !== "completed") {
|
|
3477
|
-
this.analytics.numIceNoPublicIpGathered++;
|
|
3478
|
-
}
|
|
3479
|
-
if (session.ipv6HostCandidateSeen) {
|
|
3480
|
-
this.analytics.numIceIpv6Seen++;
|
|
3481
|
-
if (session.ipv6HostCandidate6to4Seen)
|
|
3482
|
-
this.analytics.numIceIpv6SixToFour++;
|
|
3483
|
-
if (session.ipv6HostCandidateTeredoSeen)
|
|
3484
|
-
this.analytics.numIceIpv6TeredoSeen++;
|
|
3485
|
-
}
|
|
3486
|
-
if (session.mdnsHostCandidateSeen)
|
|
3487
|
-
this.analytics.numIceMdnsSeen++;
|
|
3488
|
-
}
|
|
3489
|
-
};
|
|
3490
|
-
pc.onnegotiationneeded = () => {
|
|
3491
|
-
if (pc.iceConnectionState === "new" || !session.connectionStatus) {
|
|
3492
|
-
return;
|
|
3493
|
-
}
|
|
3494
|
-
logger$6.info(`onnegotiationneeded client ${clientId}`);
|
|
3495
|
-
this._negotiatePeerConnection({ clientId, session });
|
|
3496
|
-
};
|
|
3497
|
-
return session;
|
|
3498
|
-
}
|
|
3499
3484
|
acceptNewStream({ streamId, clientId }) {
|
|
3500
3485
|
logger$6.info("acceptNewStream() [streamId: %s}, clientId: %s]", streamId, clientId);
|
|
3501
3486
|
let session = this._getSession(clientId);
|
|
@@ -3509,7 +3494,7 @@ class P2pRtcManager {
|
|
|
3509
3494
|
else {
|
|
3510
3495
|
initialBandwidth = this._changeBandwidthForAllClients(true);
|
|
3511
3496
|
}
|
|
3512
|
-
session = this.
|
|
3497
|
+
session = this._createSession({
|
|
3513
3498
|
clientId,
|
|
3514
3499
|
initialBandwidth,
|
|
3515
3500
|
isOfferer: false,
|
|
@@ -6741,11 +6726,11 @@ class BandwidthTester extends EventEmitter {
|
|
|
6741
6726
|
const wsUrl = `wss://${host}`;
|
|
6742
6727
|
this._vegaConnection = new VegaConnection(wsUrl, "whereby-sfu#bw-test-v1");
|
|
6743
6728
|
this._vegaConnection.on("open", () => this._start());
|
|
6744
|
-
this._vegaConnection.on("close", () => this.close());
|
|
6729
|
+
this._vegaConnection.on("close", () => this.close(true));
|
|
6745
6730
|
this._vegaConnection.on("message", (message) => this._onMessage(message));
|
|
6746
6731
|
this._startTimeout();
|
|
6747
6732
|
}
|
|
6748
|
-
close() {
|
|
6733
|
+
close(vegaConnectionClosed) {
|
|
6749
6734
|
logger$1.info("close()");
|
|
6750
6735
|
this.closed = true;
|
|
6751
6736
|
if (!!this._timeout || Date.now() - this._startTime < 750) {
|
|
@@ -6753,6 +6738,12 @@ class BandwidthTester extends EventEmitter {
|
|
|
6753
6738
|
error: true,
|
|
6754
6739
|
});
|
|
6755
6740
|
}
|
|
6741
|
+
else if (vegaConnectionClosed && this._resultTimeout) {
|
|
6742
|
+
this.emit("result", {
|
|
6743
|
+
error: true,
|
|
6744
|
+
});
|
|
6745
|
+
clearTimeout(this._resultTimeout);
|
|
6746
|
+
}
|
|
6756
6747
|
this._clearTimeouts();
|
|
6757
6748
|
clearInterval(this._drawInterval);
|
|
6758
6749
|
this._drawInterval = null;
|
|
@@ -7095,9 +7086,7 @@ function buildDeviceList({ busyDeviceIds, devices, kind }) {
|
|
|
7095
7086
|
label: `${busyDeviceIds.includes(d.deviceId) ? "(busy) " : ""}${d.label || d.deviceId.slice(0, 5)}`,
|
|
7096
7087
|
busy: busyDeviceIds.includes(d.deviceId),
|
|
7097
7088
|
}));
|
|
7098
|
-
return deviceList && deviceList.length !== 0
|
|
7099
|
-
? deviceList
|
|
7100
|
-
: [{ [idFieldsByKind[kind]]: "", label: "Default" }];
|
|
7089
|
+
return deviceList && deviceList.length !== 0 ? deviceList : [{ [idFieldsByKind[kind]]: "", label: "Default" }];
|
|
7101
7090
|
}
|
|
7102
7091
|
function getUserMedia(constraints) {
|
|
7103
7092
|
if (!constraints.audio && !constraints.video) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@whereby.com/media",
|
|
3
3
|
"description": "Media library for Whereby",
|
|
4
|
-
"version": "8.0.
|
|
4
|
+
"version": "8.0.2",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/whereby/sdk",
|
|
7
7
|
"repository": {
|
|
@@ -61,10 +61,10 @@
|
|
|
61
61
|
"prettier": "^3.5.3",
|
|
62
62
|
"process": "^0.11.10",
|
|
63
63
|
"typescript": "^5.8.3",
|
|
64
|
+
"@whereby.com/eslint-config": "0.1.0",
|
|
64
65
|
"@whereby.com/jest-config": "0.1.0",
|
|
65
66
|
"@whereby.com/prettier-config": "0.1.0",
|
|
66
67
|
"@whereby.com/rollup-config": "0.1.1",
|
|
67
|
-
"@whereby.com/eslint-config": "0.1.0",
|
|
68
68
|
"@whereby.com/tsconfig": "0.1.0"
|
|
69
69
|
},
|
|
70
70
|
"engines": {
|