@baasix/sdk 0.1.9 → 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/dist/index.d.cts CHANGED
@@ -1096,6 +1096,19 @@ interface RoomMember {
1096
1096
  isCreator: boolean;
1097
1097
  metadata: Record<string, any>;
1098
1098
  }
1099
+ /**
1100
+ * A single message from the room's history buffer, replayed when you join.
1101
+ * Has the same shape as a live {@link RoomMessage} (minus the `room` field).
1102
+ */
1103
+ interface RoomHistoryMessage {
1104
+ event: string;
1105
+ payload: any;
1106
+ sender: {
1107
+ userId: string | number;
1108
+ socketId: string;
1109
+ };
1110
+ timestamp: string;
1111
+ }
1099
1112
  interface SubscriptionCallback<T = any> {
1100
1113
  (payload: SubscriptionPayload<T>): void;
1101
1114
  }
@@ -1275,25 +1288,32 @@ declare class RealtimeModule {
1275
1288
  * will be visible to all other members via {@link getRoomMembers} and in
1276
1289
  * `room:user:joined` events.
1277
1290
  *
1291
+ * Returns the room's message history (up to 200 messages) so late joiners
1292
+ * can replay past messages immediately.
1293
+ *
1278
1294
  * @param roomName - The room to join.
1279
1295
  * @param metadata - Optional key/value pairs stored alongside this member.
1296
+ * @returns An object containing the buffered `history` for the room.
1280
1297
  *
1281
1298
  * @example
1282
1299
  * ```typescript
1283
- * // Join a room with metadata
1284
- * await baasix.realtime.joinRoom('game:lobby', {
1300
+ * const { history } = await baasix.realtime.joinRoom('game:lobby', {
1285
1301
  * username: 'Alice',
1286
1302
  * avatar: 'https://example.com/alice.png',
1287
- * team: 'blue',
1288
1303
  * });
1289
1304
  *
1290
- * // Listen for other users joining (includes their metadata)
1291
- * baasix.realtime.onUserJoined('game:lobby', (data) => {
1292
- * console.log(data.metadata.username, 'joined');
1305
+ * // Render past messages first
1306
+ * history.forEach((msg) => renderMessage(msg));
1307
+ *
1308
+ * // Then listen for new ones
1309
+ * baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) => {
1310
+ * renderMessage(data);
1293
1311
  * });
1294
1312
  * ```
1295
1313
  */
1296
- joinRoom(roomName: string, metadata?: Record<string, any>): Promise<void>;
1314
+ joinRoom(roomName: string, metadata?: Record<string, any>): Promise<{
1315
+ history: RoomHistoryMessage[];
1316
+ }>;
1297
1317
  /**
1298
1318
  * Leave a custom room
1299
1319
  *
@@ -1353,18 +1373,27 @@ declare class RealtimeModule {
1353
1373
  */
1354
1374
  onRoomCreatorChanged(roomName: string, callback: (data: RoomCreatorChangedEvent) => void): () => void;
1355
1375
  /**
1356
- * Send a message to a room
1376
+ * Send a message to a room.
1377
+ *
1378
+ * By default the message is stored in the room's history buffer so late
1379
+ * joiners can replay it. Pass `{ history: false }` to broadcast without
1380
+ * persisting (e.g. ephemeral cursor positions, typing indicators).
1357
1381
  *
1358
1382
  * @example
1359
1383
  * ```typescript
1360
- * // Send a chat message
1384
+ * // Persisted replayed to future joiners
1361
1385
  * await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
1362
1386
  *
1363
- * // Send a game event
1364
- * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 });
1387
+ * // Ephemeral broadcast only, never stored in history
1388
+ * await baasix.realtime.sendToRoom('game:lobby', 'typing', { userId }, { history: false });
1389
+ *
1390
+ * // Game move — skips history
1391
+ * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 }, { history: false });
1365
1392
  * ```
1366
1393
  */
1367
- sendToRoom(roomName: string, event: string, payload: any): Promise<void>;
1394
+ sendToRoom(roomName: string, event: string, payload: any, options?: {
1395
+ history?: boolean;
1396
+ }): Promise<void>;
1368
1397
  /**
1369
1398
  * Listen for messages in a room with a specific event type
1370
1399
  *
package/dist/index.d.ts CHANGED
@@ -1096,6 +1096,19 @@ interface RoomMember {
1096
1096
  isCreator: boolean;
1097
1097
  metadata: Record<string, any>;
1098
1098
  }
1099
+ /**
1100
+ * A single message from the room's history buffer, replayed when you join.
1101
+ * Has the same shape as a live {@link RoomMessage} (minus the `room` field).
1102
+ */
1103
+ interface RoomHistoryMessage {
1104
+ event: string;
1105
+ payload: any;
1106
+ sender: {
1107
+ userId: string | number;
1108
+ socketId: string;
1109
+ };
1110
+ timestamp: string;
1111
+ }
1099
1112
  interface SubscriptionCallback<T = any> {
1100
1113
  (payload: SubscriptionPayload<T>): void;
1101
1114
  }
@@ -1275,25 +1288,32 @@ declare class RealtimeModule {
1275
1288
  * will be visible to all other members via {@link getRoomMembers} and in
1276
1289
  * `room:user:joined` events.
1277
1290
  *
1291
+ * Returns the room's message history (up to 200 messages) so late joiners
1292
+ * can replay past messages immediately.
1293
+ *
1278
1294
  * @param roomName - The room to join.
1279
1295
  * @param metadata - Optional key/value pairs stored alongside this member.
1296
+ * @returns An object containing the buffered `history` for the room.
1280
1297
  *
1281
1298
  * @example
1282
1299
  * ```typescript
1283
- * // Join a room with metadata
1284
- * await baasix.realtime.joinRoom('game:lobby', {
1300
+ * const { history } = await baasix.realtime.joinRoom('game:lobby', {
1285
1301
  * username: 'Alice',
1286
1302
  * avatar: 'https://example.com/alice.png',
1287
- * team: 'blue',
1288
1303
  * });
1289
1304
  *
1290
- * // Listen for other users joining (includes their metadata)
1291
- * baasix.realtime.onUserJoined('game:lobby', (data) => {
1292
- * console.log(data.metadata.username, 'joined');
1305
+ * // Render past messages first
1306
+ * history.forEach((msg) => renderMessage(msg));
1307
+ *
1308
+ * // Then listen for new ones
1309
+ * baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) => {
1310
+ * renderMessage(data);
1293
1311
  * });
1294
1312
  * ```
1295
1313
  */
1296
- joinRoom(roomName: string, metadata?: Record<string, any>): Promise<void>;
1314
+ joinRoom(roomName: string, metadata?: Record<string, any>): Promise<{
1315
+ history: RoomHistoryMessage[];
1316
+ }>;
1297
1317
  /**
1298
1318
  * Leave a custom room
1299
1319
  *
@@ -1353,18 +1373,27 @@ declare class RealtimeModule {
1353
1373
  */
1354
1374
  onRoomCreatorChanged(roomName: string, callback: (data: RoomCreatorChangedEvent) => void): () => void;
1355
1375
  /**
1356
- * Send a message to a room
1376
+ * Send a message to a room.
1377
+ *
1378
+ * By default the message is stored in the room's history buffer so late
1379
+ * joiners can replay it. Pass `{ history: false }` to broadcast without
1380
+ * persisting (e.g. ephemeral cursor positions, typing indicators).
1357
1381
  *
1358
1382
  * @example
1359
1383
  * ```typescript
1360
- * // Send a chat message
1384
+ * // Persisted replayed to future joiners
1361
1385
  * await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
1362
1386
  *
1363
- * // Send a game event
1364
- * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 });
1387
+ * // Ephemeral broadcast only, never stored in history
1388
+ * await baasix.realtime.sendToRoom('game:lobby', 'typing', { userId }, { history: false });
1389
+ *
1390
+ * // Game move — skips history
1391
+ * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 }, { history: false });
1365
1392
  * ```
1366
1393
  */
1367
- sendToRoom(roomName: string, event: string, payload: any): Promise<void>;
1394
+ sendToRoom(roomName: string, event: string, payload: any, options?: {
1395
+ history?: boolean;
1396
+ }): Promise<void>;
1368
1397
  /**
1369
1398
  * Listen for messages in a room with a specific event type
1370
1399
  *
package/dist/index.js CHANGED
@@ -3699,21 +3699,26 @@ var RealtimeModule = class {
3699
3699
  * will be visible to all other members via {@link getRoomMembers} and in
3700
3700
  * `room:user:joined` events.
3701
3701
  *
3702
+ * Returns the room's message history (up to 200 messages) so late joiners
3703
+ * can replay past messages immediately.
3704
+ *
3702
3705
  * @param roomName - The room to join.
3703
3706
  * @param metadata - Optional key/value pairs stored alongside this member.
3707
+ * @returns An object containing the buffered `history` for the room.
3704
3708
  *
3705
3709
  * @example
3706
3710
  * ```typescript
3707
- * // Join a room with metadata
3708
- * await baasix.realtime.joinRoom('game:lobby', {
3711
+ * const { history } = await baasix.realtime.joinRoom('game:lobby', {
3709
3712
  * username: 'Alice',
3710
3713
  * avatar: 'https://example.com/alice.png',
3711
- * team: 'blue',
3712
3714
  * });
3713
3715
  *
3714
- * // Listen for other users joining (includes their metadata)
3715
- * baasix.realtime.onUserJoined('game:lobby', (data) => {
3716
- * console.log(data.metadata.username, 'joined');
3716
+ * // Render past messages first
3717
+ * history.forEach((msg) => renderMessage(msg));
3718
+ *
3719
+ * // Then listen for new ones
3720
+ * baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) => {
3721
+ * renderMessage(data);
3717
3722
  * });
3718
3723
  * ```
3719
3724
  */
@@ -3725,7 +3730,7 @@ var RealtimeModule = class {
3725
3730
  this.socket.emit("room:join", { room: roomName, metadata }, (response) => {
3726
3731
  if (response.status === "success") {
3727
3732
  this.setupRoomListeners(roomName);
3728
- resolve();
3733
+ resolve({ history: response.history ?? [] });
3729
3734
  } else {
3730
3735
  reject(new Error(response.message || "Failed to join room"));
3731
3736
  }
@@ -3863,25 +3868,33 @@ var RealtimeModule = class {
3863
3868
  };
3864
3869
  }
3865
3870
  /**
3866
- * Send a message to a room
3867
- *
3871
+ * Send a message to a room.
3872
+ *
3873
+ * By default the message is stored in the room's history buffer so late
3874
+ * joiners can replay it. Pass `{ history: false }` to broadcast without
3875
+ * persisting (e.g. ephemeral cursor positions, typing indicators).
3876
+ *
3868
3877
  * @example
3869
3878
  * ```typescript
3870
- * // Send a chat message
3879
+ * // Persisted replayed to future joiners
3871
3880
  * await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
3872
- *
3873
- * // Send a game event
3874
- * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 });
3881
+ *
3882
+ * // Ephemeral broadcast only, never stored in history
3883
+ * await baasix.realtime.sendToRoom('game:lobby', 'typing', { userId }, { history: false });
3884
+ *
3885
+ * // Game move — skips history
3886
+ * await baasix.realtime.sendToRoom('game:123', 'move', { x: 10, y: 20 }, { history: false });
3875
3887
  * ```
3876
3888
  */
3877
- async sendToRoom(roomName, event, payload) {
3889
+ async sendToRoom(roomName, event, payload, options = {}) {
3878
3890
  if (!this.socket?.connected) {
3879
3891
  throw new Error("Not connected. Call connect() first.");
3880
3892
  }
3893
+ const history = options.history ?? true;
3881
3894
  return new Promise((resolve, reject) => {
3882
3895
  this.socket.emit(
3883
3896
  "room:message",
3884
- { room: roomName, event, payload },
3897
+ { room: roomName, event, payload, history },
3885
3898
  (response) => {
3886
3899
  if (response.status === "success") {
3887
3900
  resolve();