Research
Security News
Threat Actor Exposes Playbook for Exploiting npm to Build Blockchain-Powered Botnets
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
@skyway-sdk/room
Advanced tools
複数人で通信をするアプリケーションを作るための ライブラリ です。 通信方式を P2P と SFU の 2 種類から選択できます。
npm i @skyway-sdk/room
クライアントアプリケーションは通信を開始するまでに以下のフローをたどります。
1. SkyWay Auth Token を取得(生成)する
2. Room を作成する
メディア通信を行うグループの単位を Room と呼びます。 メディア通信を開始するにはまず Room を作る権限を持った SkyWay Auth Token を用いて Room を作成する必要があります。
3. クライアントが Room に Join して Room の Member となる
4. Stream を Room 内に Publish および Subscribe する
Member が Stream を Publish すると Room 上に Stream の情報である Publication というリソースが生成されます。
他の Member はこの Publication を Subscribe すると Subscription というリソースが Room 上に生成され、Subscription に対応する Stream を受信し、通信を開始できます。
Room ライブラリ の用語、仕様について説明します。
複数の Member が通信するグループの単位です。
それぞれの Member は Room 内にいる他の Member と映像/音声/データの送受信が出来ます。(なお、SFU Roomの場合はデータの送受信ができません。)
通信方式を P2P と SFU の 2 種類から選択可能です。
Room は 一意な識別子である ID と、オプショナルな値である Name を持ちます。
ID は Room 作成時に自動的に払い出される値であり、Name はユーザが Channel を作成する際に指定することができる任意の値です。
また、アプリケーション内で重複した Name を指定することはできません。
Member は他のクライアントとの通信を管理するエージェントです。
映像や音声を送信したり、受信したりすることが出来ます。
Member は 一意な識別子である ID と、オプショナルな値である Name を持ちます。
ID は Member 作成時に自動的に払い出される値であり、Name はクライアントが Channel に Join する際に指定することができる任意の値です。
Room 内で重複した Name を指定することはできません。
Room 内で Member が通信する映像/音声/データを Stream と呼びます。
三種類の Stream が存在します。
あるクライアントが用意した Stream を他の Member が受信可能にするために Room 内に公開する操作のことを Publish と呼びます。Stream を Publish すると Room 内に Publication というリソースが生成されます。
他の Member は Publication を Subscribe することで Subscription というリソースを得られて、Stream の受信が開始されます。
Publication を Unpublish すると SkyWay サービス側で関連する Subscription を Unsubscribe して削除します。
あるクライアントが Room に存在する Publication を Subscribe した時に得られるリソースです。Subscription には Stream が含まれており、映像・音声・データの受信が可能です。
Room 内の Subscription のプロパティを確認することで、どの Member がどの Publication を Subscribe しているかを把握することができます。
クライアントの Member が Subscribe していない Subscription の Stream を参照することはできません。Member が Stream を受信するためには必ずその Member が Publication を Subscribe して Subscription を作る必要があります。
Subscription と紐ついている Publication が Unpublish されると Subscription は自動的に Unsubscribe されます。
アプリケーションの設定を行います。
import { SkyWayContext } from '@skyway-sdk/room';
const context = await SkyWayContext.Create(tokenString);
事前にSkyWay Auth Tokenの取得が必要になります。
SkyWay Auth Token は、仕様に基づいて自身で作成するか、@skyway-sdk/token
ライブラリを使って作成することができます。
@skyway-sdk/token
ライブラリは Node.js サーバとブラウザで動作しますが、SkyWay Auth Tokenでユーザの行動を認可したい場合は必ずサーバ側で作成して下さい。
import { SkyWayAuthToken } from '@skyway-sdk/token';
const token = new SkyWayAuthToken(parameters);
const tokenString = token.encode('secret');
Member の参加する Room の作成/取得を行います。
作成
新しい Room を作成します。
import { SkyWayContext, SkyWayRoom } from '@skyway-sdk/room';
const context = await SkyWayContext.Create(tokenString);
const room = await SkyWayRoom.Create(context, {
type: 'p2p',
id: 'something',
});
Room 作成時に、RoomType を指定する必要があります。
p2p
もしくは sfu
Room 作成時に、任意の RoomId を指定することができます。
取得
既存の Room を取得します。
import { SkyWayContext, SkyWayRoom } from '@skyway-sdk/room';
const context = await SkyWayContext.Create(tokenString);
const room = await SkyWayRoom.Find(context, roomId, roomType);
取得もしくは作成
任意の Room の取得を試みて、存在しなければ作成します。
import { SkyWayContext, SkyWayRoom } from '@skyway-sdk/room';
const context = await SkyWayContext.Create(tokenString);
const room = await SkyWayRoom.FindOrCreate(context, {
type: 'sfu',
id: 'channelId',
});
Room には P2PRoom と SfuRoom の 2 種類が存在します。 API は P2PRoom と SfuRoom で共通しています。
const member: LocalRoomMember = await room.join();
Room に参加すると LocalRoomMember インスタンスを取得できます。
Member
Stream の Member の情報のリストを参照することが出来ます。
const members = room.members;
Publication
Stream の Publication のリストを参照することが出来ます。
const publications = room.publications;
Subscription
Stream の Subscription のリストを参照することが出来ます。
const subscriptions = room.subscriptions;
Stream の Publish、Subscribe などを行うことが出来ます。
Room に Stream を Publish することができます。
import { SkyWayMediaDevices } from '@skyway-sdk/room';
...
const video = await SkyWayMediaDevices.createCameraVideoStream();
const publication = await member.publish(video,options);
Room の種類によって Publish 時に指定できる Option が異なります。
P2P
interface Option {
metadata?: string | undefined;
codecCapabilities?: Codec[];
encodings?: EncodingParameters[];
}
SFU
interface Option {
metadata?: string | undefined;
codecCapabilities?: Codec[];
encodings?: EncodingParameters[];
maxSubscribers?: number;
}
maxSubscribers では Publish した Stream を Subscribe できる数の上限値を指定できます。指定しない場合、maxSubscribers には 10 がセットされます。
なお、SkyWay Beta提供中は以下の制限があります。制限値は50人での双方向通信を想定した値に基づいております。
Simulcast を利用する場合は encodings に複数のパラメータをセットします
const video = await SkyWayMediaDevices.createCameraVideoStream();
const publication = await member.publish(video, {
encodings: [
// 複数のパラメータをセットする
{ maxBitrate: 10_000, scaleResolutionDownBy: 8 },
{ maxBitrate: 680_000, scaleResolutionDownBy: 1 },
],
});
Room 上の Stream の Publication を Unpublish することができます。 関連する Subscription が自動的に Unsubscribe されます。
await member.unpublish(publication.id);
Room 上の Stream の Publication を Subscribe することができます。
const { subscription, stream } = await member.subscribe(publication.id);
Subscribe している Stream の Subscription を Unsubscribe することができます。
await member.unsubscribe(subscription.id);
Member に紐付いた Metadata を更新することができます
await member.updateMetadata('metadata');
各種 Stream の取得が出来ます。
マイク
const audio = await SkyWayMediaDevices.createMicrophoneAudioStream(options);
カメラ
const video = await SkyWayMediaDevices.createCameraVideoStream(options);
DataChannel
※SFU Room では使用できません。
const data = await SkyWayMediaDevices.createDataStream();
SkyWay の Stream を Html で再生する方法が 2 種類あります。
element に適用する
HtmlAudioElement / HtmlVideoElement に Stream を適用することが出来ます。
const localVideo = document.getElementById(
'js-local-stream'
) as HTMLVideoElement;
localVideo.muted = true;
localVideo.playsInline = true;
// 適用する
skywayStream.attach(localVideo);
await localVideo.play();
MediaStream を作る
MediaStream を作成して使うことが出来ます。
const stream = new MediaStream([
// MediaStreamTrackにアクセスできる
skywayStream.track,
]);
Publication の情報の参照と Publication の操作ができます
Publication に紐付いた Metadata を更新することができます
await publication.updateMetadata('metadata');
Subscription の情報の参照と Subscription の操作ができます
Subscription から映像/音声/データの Stream を参照できます。 ローカルで Subscribe している Subscription でなければ undefined となります
const stream = subscription.stream;
if (stream.contentType === 'data') {
stream.onData.add((data) => {
console.log(data);
});
} else {
const track = stream.track;
}
FAQs
The official Next Generation JavaScript SDK for SkyWay
The npm package @skyway-sdk/room receives a total of 806 weekly downloads. As such, @skyway-sdk/room popularity was classified as not popular.
We found that @skyway-sdk/room demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
Security News
NVD’s backlog surpasses 20,000 CVEs as analysis slows and NIST announces new system updates to address ongoing delays.
Security News
Research
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.