jam-core-react
Advanced tools
Comparing version 0.3.13 to 0.3.14
@@ -306,2 +306,4 @@ // ../../jam-core-react/backend-hooks.ts | ||
prop._deps.set(fragment, (value) => { | ||
if (pureObj[key] === value) | ||
return; | ||
pureObj[key] = value; | ||
@@ -442,7 +444,80 @@ emit(fragment, pureObj, [key]); | ||
// ../../lib/identity-utils.js | ||
import base64 from "compact-base64"; | ||
import ssr from "simple-signed-records-engine"; | ||
import { toBytes as toBytes2, toBase64 as toBase642 } from "fast-base64/js"; | ||
import { toUrl, fromUrl } from "fast-base64/url"; | ||
// ../../lib/watsign-records.js | ||
import { sign, verify } from "watsign"; | ||
import { toBytes, toBase64 } from "fast-base64"; | ||
// ../../lib/util.js | ||
function mergeObject(obj, partialObj) { | ||
for (let key in partialObj) { | ||
let value = partialObj[key]; | ||
if (value !== void 0) { | ||
obj[key] = value; | ||
} | ||
} | ||
} | ||
function concatBytes(...arrays) { | ||
if (!arrays.length) | ||
return null; | ||
let totalLength = arrays.reduce((acc, value) => acc + value.length, 0); | ||
let result = new Uint8Array(totalLength); | ||
let length = 0; | ||
for (let array of arrays) { | ||
result.set(array, length); | ||
length += array.length; | ||
} | ||
return result; | ||
} | ||
// ../../lib/watsign-records.js | ||
async function signData({ record, keypair: keypair2, validSeconds, validUntil }) { | ||
let Certified = await toBase64(new TextEncoder().encode(JSON.stringify(record))); | ||
let Expiration = validUntil || (validSeconds || 1800) + Math.floor(Date.now() / 1e3); | ||
let bytesToSign = await createBytesToSign({ | ||
Version: 0, | ||
Expiration, | ||
KeyType: "ed25519", | ||
Certified | ||
}); | ||
let Signatures = []; | ||
try { | ||
Signatures.push(await createSignature(bytesToSign, keypair2)); | ||
} catch { | ||
} | ||
return { | ||
Version: 0, | ||
Expiration, | ||
KeyType: "ed25519", | ||
Certified, | ||
Signatures | ||
}; | ||
} | ||
async function createSignature(bytesToSign, { publicKey, secretKey }) { | ||
let signatureBytes = await sign(bytesToSign, secretKey); | ||
let signature = await toBase64(signatureBytes); | ||
return { | ||
Identity: await toBase64(publicKey), | ||
Payload: signature | ||
}; | ||
} | ||
async function createBytesToSign({ Version, Expiration, KeyType, Certified }) { | ||
let versionBytes = new Uint8Array(4); | ||
let expirationBytes = new Uint8Array(8); | ||
let keyTypeBytes = new TextEncoder().encode(KeyType); | ||
let payloadBytes = await toBytes(Certified); | ||
for (let i = 0; i < 4; i++) { | ||
versionBytes[i] = Version >> 8 * i & 255; | ||
} | ||
for (let i = 0; i < 8; i++) { | ||
expirationBytes[i] = Expiration >> 8 * i & 255; | ||
} | ||
return concatBytes(versionBytes, expirationBytes, keyTypeBytes, payloadBytes); | ||
} | ||
// ../../lib/identity-utils.js | ||
var MESSAGE_VALIDITY_SECONDS = 300; | ||
function signData(identity, data) { | ||
return ssr.sign({ | ||
async function signData2(identity, data) { | ||
return signData({ | ||
record: data, | ||
@@ -453,4 +528,5 @@ keypair: keypair(identity), | ||
} | ||
function signedToken(identity) { | ||
return base64.encodeUrl(JSON.stringify(signData(identity, {}))); | ||
async function signedToken(identity) { | ||
let signed = await signData2(identity, {}); | ||
return encode(new TextEncoder().encode(JSON.stringify(signed))); | ||
} | ||
@@ -464,4 +540,7 @@ function keypair(identity) { | ||
function decode(base64String) { | ||
return Uint8Array.from(base64.decodeUrl(base64String, "binary")); | ||
return toBytes2(fromUrl(base64String)); | ||
} | ||
function encode(binaryData) { | ||
return toUrl(toBase642(binaryData)); | ||
} | ||
@@ -473,14 +552,2 @@ // ../../jam-core-react/backend-hooks.ts | ||
import { update } from "minimal-state"; | ||
// ../../lib/util.js | ||
function mergeObject(obj, partialObj) { | ||
for (let key in partialObj) { | ||
let value = partialObj[key]; | ||
if (value !== void 0) { | ||
obj[key] = value; | ||
} | ||
} | ||
} | ||
// ../../lib/GetRequest.js | ||
function GetRequest({ path, dontFetch, fetchOnMount, getToken }) { | ||
@@ -517,3 +584,3 @@ let ourState = "idle"; | ||
if (getToken) | ||
headers.Authorization = `Token ${getToken()}`; | ||
headers.Authorization = `Token ${await getToken()}`; | ||
let res = await fetch(path, { headers }).catch(console.warn); | ||
@@ -520,0 +587,0 @@ let { state, data, status } = getCache(path); |
@@ -26,3 +26,3 @@ import React from 'react'; | ||
setState: { | ||
<L extends "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: { | ||
<L extends "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: { | ||
myIdentity: import("../jam-core/state").IdentityType | null; | ||
@@ -61,2 +61,3 @@ myId: string | null; | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -101,2 +102,3 @@ isRecording: boolean; | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -108,3 +110,3 @@ isRecording: boolean; | ||
}; | ||
onState: (key: "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
onState: (key: "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
createRoom: (roomId: string, partialRoom?: Partial<import("../jam-core/state").RoomType> | undefined) => Promise<boolean>; | ||
@@ -129,2 +131,4 @@ updateRoom: (roomId: string, room: import("../jam-core/state").RoomType) => Promise<boolean>; | ||
downloadRecording: (fileName?: string | undefined) => Promise<void>; | ||
startPodcastRecording: () => Promise<void>; | ||
stopPodcastRecording: () => Promise<void>; | ||
}; | ||
@@ -172,2 +176,3 @@ declare function JamProvider({ children, state, api, options, onState, }: { | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -199,3 +204,3 @@ isRecording: boolean; | ||
setState: { | ||
<L extends "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: { | ||
<L extends "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: { | ||
myIdentity: import("../jam-core/state").IdentityType | null; | ||
@@ -234,2 +239,3 @@ myId: string | null; | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -274,2 +280,3 @@ isRecording: boolean; | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -281,3 +288,3 @@ isRecording: boolean; | ||
}; | ||
onState: (key: "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
onState: (key: "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
createRoom: (roomId: string, partialRoom?: Partial<import("../jam-core/state").RoomType> | undefined) => Promise<boolean>; | ||
@@ -302,2 +309,4 @@ updateRoom: (roomId: string, room: import("../jam-core/state").RoomType) => Promise<boolean>; | ||
downloadRecording: (fileName?: string | undefined) => Promise<void>; | ||
startPodcastRecording: () => Promise<void>; | ||
stopPodcastRecording: () => Promise<void>; | ||
}]; | ||
@@ -304,0 +313,0 @@ declare type T = StateType; |
@@ -48,2 +48,4 @@ import { is, set, on, update, until } from 'minimal-state'; | ||
downloadRecording: (fileName?: string | undefined) => Promise<void>; | ||
startPodcastRecording: () => Promise<void>; | ||
stopPodcastRecording: () => Promise<void>; | ||
}; | ||
@@ -101,6 +103,6 @@ declare function createJam({ jamConfig, initialProps, cachedRooms, debug: debug_ }?: { | ||
setState: { | ||
<L extends "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: StateType[L]): void; | ||
<L extends "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio">(key: L, value: StateType[L]): void; | ||
(state: Partial<StateType>): void; | ||
}; | ||
onState: (key: "identities" | "roomId" | "myIdentity" | "myId" | "swarm" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
onState: (key: "identities" | "swarm" | "roomId" | "myIdentity" | "myId" | "micMuted" | "handRaised" | "inRoom" | "room" | "hasRoom" | "isRoomLoading" | "iAmSpeaker" | "iAmModerator" | "otherDeviceInRoom" | "peers" | "peerState" | "myPeerState" | "reactions" | "soundMuted" | "audioFile" | "audioFileElement" | "myAudio" | "audioPlayError" | "hasMicFailed" | "speaking" | "isRecording" | "isSomeoneRecording" | "recordedAudio" | undefined, listener: (...args: unknown[]) => void) => () => void; | ||
createRoom: (roomId: string, partialRoom?: Partial<RoomType> | undefined) => Promise<boolean>; | ||
@@ -125,2 +127,4 @@ updateRoom: (roomId: string, room: RoomType) => Promise<boolean>; | ||
downloadRecording: (fileName?: string | undefined) => Promise<void>; | ||
startPodcastRecording: () => Promise<void>; | ||
stopPodcastRecording: () => Promise<void>; | ||
}]; |
import { IdentityInfo, IdentityType } from './state'; | ||
export { Identity, importDefaultIdentity, importRoomIdentity, updateInfo }; | ||
declare function Identity(): ({ roomId }: { | ||
declare function Identity({ swarm }: { | ||
swarm: any; | ||
}): ({ roomId }: { | ||
roomId: any; | ||
@@ -9,5 +11,5 @@ }) => any; | ||
seed?: string; | ||
}): void; | ||
}): Promise<void>; | ||
declare function importRoomIdentity(roomId: string, identity: Partial<IdentityType> & { | ||
seed?: string; | ||
}): void; | ||
}): Promise<void>; |
@@ -75,2 +75,3 @@ export { defaultProps, defaultState }; | ||
audioPlayError: boolean; | ||
hasMicFailed: boolean; | ||
speaking: Set<string>; | ||
@@ -77,0 +78,0 @@ isRecording: boolean; |
{ | ||
"name": "jam-core-react", | ||
"description": "React hooks for creating custom audio spaces like Clubhouse / Twitter Spaces, made with WebRTC", | ||
"version": "0.3.13", | ||
"version": "0.3.14", | ||
"main": "dist/index.js", | ||
@@ -22,7 +22,7 @@ "license": "AGPL-3.0", | ||
"dependencies": { | ||
"compact-base64": "^2.1.2", | ||
"jam-core": "0.3.13", | ||
"fast-base64": "^0.1.6", | ||
"jam-core": "0.3.14", | ||
"minimal-state": "^5.6.0", | ||
"simple-signed-records-engine": "0.1.2", | ||
"use-minimal-state": "^3.5.0" | ||
"use-minimal-state": "^3.5.0", | ||
"watsign": "^0.1.6" | ||
}, | ||
@@ -29,0 +29,0 @@ "peerDependencies": { |
Sorry, the diff of this file is too big to display
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
1
399709
2573
+ Addedfast-base64@^0.1.6
+ Addedwatsign@^0.1.6
+ Added@types/node@22.13.1(transitive)
+ Addedfast-base64@0.1.8(transitive)
+ Addedjam-core@0.3.14(transitive)
+ Addedwatever-js-wrapper@0.3.2(transitive)
+ Addedwatsign@0.1.9(transitive)
- Removedcompact-base64@^2.1.2
- Removedsimple-signed-records-engine@0.1.2
- Removed@babel/polyfill@7.12.1(transitive)
- Removed@types/node@22.13.4(transitive)
- Removedbase64-js@1.5.1(transitive)
- Removedbuffer@6.0.3(transitive)
- Removedcompact-base64@2.1.3(transitive)
- Removedcore-js@2.6.12(transitive)
- Removedieee754@1.2.1(transitive)
- Removedjam-core@0.3.13(transitive)
- Removedregenerator-runtime@0.13.11(transitive)
- Removedsimple-signed-records-engine@0.1.2(transitive)
- Removedtweetnacl@1.0.3(transitive)
- Removedtweetnacl-util@0.15.1(transitive)
Updatedjam-core@0.3.14