@baasix/sdk 0.1.8 → 0.1.10
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/README.md +10 -5
- package/dist/index.cjs +46 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +57 -12
- package/dist/index.d.ts +57 -12
- package/dist/index.js +46 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1058,12 +1058,17 @@ channel.unsubscribe();
|
|
|
1058
1058
|
Custom rooms enable real-time communication between users for chat, games, or collaborative features. The **first user to join** a room becomes its creator. If the creator leaves temporarily, ownership transfers to the next member — but the **original creator automatically reclaims ownership** when they rejoin. If the room empties and is recreated, the next joiner becomes the new owner.
|
|
1059
1059
|
|
|
1060
1060
|
```typescript
|
|
1061
|
-
// Join a room
|
|
1062
|
-
await baasix.realtime.joinRoom('game:lobby'
|
|
1061
|
+
// Join a room — pass optional metadata stored alongside your membership
|
|
1062
|
+
await baasix.realtime.joinRoom('game:lobby', {
|
|
1063
|
+
username: 'Alice',
|
|
1064
|
+
avatar: 'https://example.com/alice.png',
|
|
1065
|
+
team: 'blue',
|
|
1066
|
+
});
|
|
1063
1067
|
|
|
1064
1068
|
// Get current members (you must be in the room)
|
|
1069
|
+
// Each entry includes userId, socketId, isCreator, and metadata
|
|
1065
1070
|
const members = await baasix.realtime.getRoomMembers('game:lobby');
|
|
1066
|
-
// [{ socketId: string, userId: string|number, isCreator: boolean }, ...]
|
|
1071
|
+
// [{ socketId: string, userId: string|number, isCreator: boolean, metadata: Record<string,any> }, ...]
|
|
1067
1072
|
|
|
1068
1073
|
// Send a message to all room members
|
|
1069
1074
|
await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
|
|
@@ -1073,9 +1078,9 @@ const unsubscribe = baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) =
|
|
|
1073
1078
|
console.log(`${data.sender.userId}: ${data.payload.text}`);
|
|
1074
1079
|
});
|
|
1075
1080
|
|
|
1076
|
-
// Listen for users joining / leaving
|
|
1081
|
+
// Listen for users joining / leaving (joined event includes their metadata)
|
|
1077
1082
|
baasix.realtime.onRoomUserJoined('game:lobby', (data) => {
|
|
1078
|
-
console.log(`${data.
|
|
1083
|
+
console.log(`${data.metadata.username} joined`);
|
|
1079
1084
|
});
|
|
1080
1085
|
baasix.realtime.onRoomUserLeft('game:lobby', (data) => {
|
|
1081
1086
|
console.log(`${data.userId} left`);
|
package/dist/index.cjs
CHANGED
|
@@ -3695,28 +3695,44 @@ var RealtimeModule = class {
|
|
|
3695
3695
|
// Custom Rooms API
|
|
3696
3696
|
// ===================
|
|
3697
3697
|
/**
|
|
3698
|
-
* Join a custom room for real-time communication
|
|
3699
|
-
*
|
|
3698
|
+
* Join a custom room for real-time communication.
|
|
3699
|
+
*
|
|
3700
|
+
* You can optionally attach metadata (e.g. display name, avatar, team) that
|
|
3701
|
+
* will be visible to all other members via {@link getRoomMembers} and in
|
|
3702
|
+
* `room:user:joined` events.
|
|
3703
|
+
*
|
|
3704
|
+
* Returns the room's message history (up to 200 messages) so late joiners
|
|
3705
|
+
* can replay past messages immediately.
|
|
3706
|
+
*
|
|
3707
|
+
* @param roomName - The room to join.
|
|
3708
|
+
* @param metadata - Optional key/value pairs stored alongside this member.
|
|
3709
|
+
* @returns An object containing the buffered `history` for the room.
|
|
3710
|
+
*
|
|
3700
3711
|
* @example
|
|
3701
3712
|
* ```typescript
|
|
3702
|
-
*
|
|
3703
|
-
*
|
|
3704
|
-
*
|
|
3705
|
-
*
|
|
3713
|
+
* const { history } = await baasix.realtime.joinRoom('game:lobby', {
|
|
3714
|
+
* username: 'Alice',
|
|
3715
|
+
* avatar: 'https://example.com/alice.png',
|
|
3716
|
+
* });
|
|
3717
|
+
*
|
|
3718
|
+
* // Render past messages first
|
|
3719
|
+
* history.forEach((msg) => renderMessage(msg));
|
|
3720
|
+
*
|
|
3721
|
+
* // Then listen for new ones
|
|
3706
3722
|
* baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) => {
|
|
3707
|
-
*
|
|
3723
|
+
* renderMessage(data);
|
|
3708
3724
|
* });
|
|
3709
3725
|
* ```
|
|
3710
3726
|
*/
|
|
3711
|
-
async joinRoom(roomName) {
|
|
3727
|
+
async joinRoom(roomName, metadata = {}) {
|
|
3712
3728
|
if (!this.socket?.connected) {
|
|
3713
3729
|
throw new Error("Not connected. Call connect() first.");
|
|
3714
3730
|
}
|
|
3715
3731
|
return new Promise((resolve, reject) => {
|
|
3716
|
-
this.socket.emit("room:join", { room: roomName }, (response) => {
|
|
3732
|
+
this.socket.emit("room:join", { room: roomName, metadata }, (response) => {
|
|
3717
3733
|
if (response.status === "success") {
|
|
3718
3734
|
this.setupRoomListeners(roomName);
|
|
3719
|
-
resolve();
|
|
3735
|
+
resolve({ history: response.history ?? [] });
|
|
3720
3736
|
} else {
|
|
3721
3737
|
reject(new Error(response.message || "Failed to join room"));
|
|
3722
3738
|
}
|
|
@@ -3750,11 +3766,14 @@ var RealtimeModule = class {
|
|
|
3750
3766
|
* Get the list of users currently in a room.
|
|
3751
3767
|
* You must already be a member of the room to call this.
|
|
3752
3768
|
*
|
|
3769
|
+
* Each entry includes `userId`, `socketId`, `isCreator`, and `metadata`
|
|
3770
|
+
* (the custom object the member passed to {@link joinRoom}).
|
|
3771
|
+
*
|
|
3753
3772
|
* @example
|
|
3754
3773
|
* ```typescript
|
|
3755
3774
|
* const members = await baasix.realtime.getRoomMembers('game:lobby');
|
|
3756
3775
|
* members.forEach(m => {
|
|
3757
|
-
* console.log(m.
|
|
3776
|
+
* console.log(m.metadata.username, m.isCreator ? '(owner)' : '');
|
|
3758
3777
|
* });
|
|
3759
3778
|
* ```
|
|
3760
3779
|
*/
|
|
@@ -3851,25 +3870,33 @@ var RealtimeModule = class {
|
|
|
3851
3870
|
};
|
|
3852
3871
|
}
|
|
3853
3872
|
/**
|
|
3854
|
-
* Send a message to a room
|
|
3855
|
-
*
|
|
3873
|
+
* Send a message to a room.
|
|
3874
|
+
*
|
|
3875
|
+
* By default the message is stored in the room's history buffer so late
|
|
3876
|
+
* joiners can replay it. Pass `{ history: false }` to broadcast without
|
|
3877
|
+
* persisting (e.g. ephemeral cursor positions, typing indicators).
|
|
3878
|
+
*
|
|
3856
3879
|
* @example
|
|
3857
3880
|
* ```typescript
|
|
3858
|
-
* //
|
|
3881
|
+
* // Persisted — replayed to future joiners
|
|
3859
3882
|
* await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
|
|
3860
|
-
*
|
|
3861
|
-
* //
|
|
3862
|
-
* await baasix.realtime.sendToRoom('game:
|
|
3883
|
+
*
|
|
3884
|
+
* // Ephemeral — broadcast only, never stored in history
|
|
3885
|
+
* await baasix.realtime.sendToRoom('game:lobby', 'typing', { userId }, { history: false });
|
|
3886
|
+
*
|
|
3887
|
+
* // Game move — skips history
|
|
3888
|
+
* await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 }, { history: false });
|
|
3863
3889
|
* ```
|
|
3864
3890
|
*/
|
|
3865
|
-
async sendToRoom(roomName, event, payload) {
|
|
3891
|
+
async sendToRoom(roomName, event, payload, options = {}) {
|
|
3866
3892
|
if (!this.socket?.connected) {
|
|
3867
3893
|
throw new Error("Not connected. Call connect() first.");
|
|
3868
3894
|
}
|
|
3895
|
+
const history = options.history ?? true;
|
|
3869
3896
|
return new Promise((resolve, reject) => {
|
|
3870
3897
|
this.socket.emit(
|
|
3871
3898
|
"room:message",
|
|
3872
|
-
{ room: roomName, event, payload },
|
|
3899
|
+
{ room: roomName, event, payload, history },
|
|
3873
3900
|
(response) => {
|
|
3874
3901
|
if (response.status === "success") {
|
|
3875
3902
|
resolve();
|