@baasix/sdk 0.1.10 → 0.1.12

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,21 +1058,41 @@ 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 — pass optional metadata stored alongside your membership
1062
- await baasix.realtime.joinRoom('game:lobby', {
1061
+ // Join a room — pass optional metadata stored alongside your membership.
1062
+ // Returns { history } — the room's last 200 messages, replayed for late joiners.
1063
+ const { history } = await baasix.realtime.joinRoom('game:lobby', {
1063
1064
  username: 'Alice',
1064
1065
  avatar: 'https://example.com/alice.png',
1065
1066
  team: 'blue',
1066
1067
  });
1067
1068
 
1069
+ // Replay buffered messages so the user sees missed events immediately
1070
+ // Each entry: { event, payload, sender: { userId, socketId }, timestamp }
1071
+ history.forEach((msg) => {
1072
+ addMessageToUI(msg.sender.userId, msg.payload.text);
1073
+ });
1074
+
1068
1075
  // Get current members (you must be in the room)
1069
1076
  // Each entry includes userId, socketId, isCreator, and metadata
1070
1077
  const members = await baasix.realtime.getRoomMembers('game:lobby');
1071
1078
  // [{ socketId: string, userId: string|number, isCreator: boolean, metadata: Record<string,any> }, ...]
1072
1079
 
1073
- // Send a message to all room members
1080
+ // List all active rooms no membership required
1081
+ const rooms = await baasix.realtime.listRooms();
1082
+ // [{ name: 'game:lobby', memberCount: 4 }, { name: 'chat:general', memberCount: 12 }]
1083
+
1084
+ // Filter by name prefix — e.g. show only 'game:' rooms
1085
+ const gameRooms = await baasix.realtime.listRooms('game:');
1086
+ // [{ name: 'game:lobby', memberCount: 4 }, { name: 'game:arena', memberCount: 8 }]
1087
+
1088
+ // Send a persisted message — stored in the history buffer (default)
1074
1089
  await baasix.realtime.sendToRoom('game:lobby', 'chat', { text: 'Hello!' });
1075
1090
 
1091
+ // Send an ephemeral message — broadcast only, NOT stored in history
1092
+ // Ideal for high-frequency events: cursors, typing indicators, presence pings
1093
+ await baasix.realtime.sendToRoom('game:lobby', 'typing', { userId }, { history: false });
1094
+ await baasix.realtime.sendToRoom('game:lobby', 'cursor', { x: 120, y: 340 }, { history: false });
1095
+
1076
1096
  // Listen for room messages
1077
1097
  const unsubscribe = baasix.realtime.onRoomMessage('game:lobby', 'chat', (data) => {
1078
1098
  console.log(`${data.sender.userId}: ${data.payload.text}`);
package/dist/index.cjs CHANGED
@@ -2894,18 +2894,22 @@ var ReportsModule = class {
2894
2894
  * @example
2895
2895
  * ```typescript
2896
2896
  * const categories = await baasix.reports.distinct('products', 'category');
2897
+ *
2898
+ * // With a filter
2899
+ * const folders = await baasix.reports.distinct('baasix_File', 'folder', {
2900
+ * userId: { eq: '$CURRENT_USER' },
2901
+ * });
2897
2902
  * ```
2898
2903
  */
2899
2904
  async distinct(collection, field, filter) {
2900
- const response = await this.client.get(
2901
- `/items/${collection}`,
2905
+ const response = await this.client.post(
2906
+ `/reports/${collection}`,
2902
2907
  {
2903
- params: {
2904
- filter,
2905
- fields: [field],
2906
- groupBy: [field],
2907
- limit: -1
2908
- }
2908
+ fields: [field],
2909
+ groupBy: [field],
2910
+ aggregate: { _count: { function: "distinct", field } },
2911
+ filter,
2912
+ limit: -1
2909
2913
  }
2910
2914
  );
2911
2915
  return response.data.map((item) => item[field]);
@@ -3791,6 +3795,39 @@ var RealtimeModule = class {
3791
3795
  });
3792
3796
  });
3793
3797
  }
3798
+ /**
3799
+ * List all active custom rooms, optionally filtered by a name prefix.
3800
+ *
3801
+ * Returns every room that currently has at least one member.
3802
+ * You do **not** need to be a member of a room to list it.
3803
+ *
3804
+ * @param prefix - Optional prefix to filter rooms. E.g. `"game:"` returns only
3805
+ * rooms whose name starts with `"game:"`.
3806
+ *
3807
+ * @example
3808
+ * ```typescript
3809
+ * // All active rooms
3810
+ * const rooms = await baasix.realtime.listRooms();
3811
+ * // [{ name: 'game:lobby', memberCount: 4 }, { name: 'chat:general', memberCount: 12 }]
3812
+ *
3813
+ * // Only rooms whose name starts with 'game:'
3814
+ * const gameRooms = await baasix.realtime.listRooms('game:');
3815
+ * ```
3816
+ */
3817
+ async listRooms(prefix) {
3818
+ if (!this.socket?.connected) {
3819
+ throw new Error("Not connected. Call connect() first.");
3820
+ }
3821
+ return new Promise((resolve, reject) => {
3822
+ this.socket.emit("room:list", { prefix: prefix ?? "" }, (response) => {
3823
+ if (response.status === "success") {
3824
+ resolve(response.rooms);
3825
+ } else {
3826
+ reject(new Error(response.message || "Failed to list rooms"));
3827
+ }
3828
+ });
3829
+ });
3830
+ }
3794
3831
  /**
3795
3832
  * Kick a user from a custom room. Only the room creator may call this.
3796
3833
  *