@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 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.userId} joined`);
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
- * // Join a room
3703
- * await baasix.realtime.joinRoom('game:lobby');
3704
- *
3705
- * // Listen for messages
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
- * console.log(`${data.sender.userId}: ${data.payload.text}`);
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.userId, m.isCreator ? '(owner)' : '');
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
- * // Send a chat message
3881
+ * // Persisted replayed to future joiners
3859
3882
  * await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
3860
- *
3861
- * // Send a game event
3862
- * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 });
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();