@baasix/sdk 0.1.7 → 0.1.8

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
@@ -1078,6 +1078,22 @@ interface RoomUserEvent {
1078
1078
  socketId: string;
1079
1079
  timestamp: string;
1080
1080
  }
1081
+ interface RoomKickEvent {
1082
+ room: string;
1083
+ kickedBy: string | number;
1084
+ timestamp: string;
1085
+ }
1086
+ interface RoomCreatorChangedEvent {
1087
+ room: string;
1088
+ newCreatorSocketId: string;
1089
+ newCreatorUserId: string | number;
1090
+ timestamp: string;
1091
+ }
1092
+ interface RoomMember {
1093
+ socketId: string;
1094
+ userId: string | number;
1095
+ isCreator: boolean;
1096
+ }
1081
1097
  interface SubscriptionCallback<T = any> {
1082
1098
  (payload: SubscriptionPayload<T>): void;
1083
1099
  }
@@ -1119,6 +1135,8 @@ declare class RealtimeModule {
1119
1135
  private workflowCallbacks;
1120
1136
  private roomCallbacks;
1121
1137
  private roomUserCallbacks;
1138
+ private kickCallbacks;
1139
+ private creatorChangedCallbacks;
1122
1140
  private connectionCallbacks;
1123
1141
  private reconnecting;
1124
1142
  private connectionPromise;
@@ -1272,6 +1290,52 @@ declare class RealtimeModule {
1272
1290
  * ```
1273
1291
  */
1274
1292
  leaveRoom(roomName: string): Promise<void>;
1293
+ /**
1294
+ * Get the list of users currently in a room.
1295
+ * You must already be a member of the room to call this.
1296
+ *
1297
+ * @example
1298
+ * ```typescript
1299
+ * const members = await baasix.realtime.getRoomMembers('game:lobby');
1300
+ * members.forEach(m => {
1301
+ * console.log(m.userId, m.isCreator ? '(owner)' : '');
1302
+ * });
1303
+ * ```
1304
+ */
1305
+ getRoomMembers(roomName: string): Promise<RoomMember[]>;
1306
+ /**
1307
+ * Kick a user from a custom room. Only the room creator may call this.
1308
+ *
1309
+ * @example
1310
+ * ```typescript
1311
+ * await baasix.realtime.kickFromRoom('game:lobby', 'user-id-123');
1312
+ * ```
1313
+ */
1314
+ kickFromRoom(roomName: string, targetUserId: string | number): Promise<void>;
1315
+ /**
1316
+ * Listen for being kicked from a room.
1317
+ * The callback fires when the current user is removed by the room creator.
1318
+ * Room listeners are automatically cleaned up after the kick.
1319
+ *
1320
+ * @example
1321
+ * ```typescript
1322
+ * baasix.realtime.onKicked('game:lobby', ({ kickedBy }) => {
1323
+ * console.log(`You were kicked by user ${kickedBy}`);
1324
+ * });
1325
+ * ```
1326
+ */
1327
+ onKicked(roomName: string, callback: (data: RoomKickEvent) => void): () => void;
1328
+ /**
1329
+ * Listen for room ownership changes (e.g. when the creator leaves).
1330
+ *
1331
+ * @example
1332
+ * ```typescript
1333
+ * baasix.realtime.onRoomCreatorChanged('game:lobby', ({ newCreatorUserId }) => {
1334
+ * console.log(`New room owner: ${newCreatorUserId}`);
1335
+ * });
1336
+ * ```
1337
+ */
1338
+ onRoomCreatorChanged(roomName: string, callback: (data: RoomCreatorChangedEvent) => void): () => void;
1275
1339
  /**
1276
1340
  * Send a message to a room
1277
1341
  *
package/dist/index.d.ts CHANGED
@@ -1078,6 +1078,22 @@ interface RoomUserEvent {
1078
1078
  socketId: string;
1079
1079
  timestamp: string;
1080
1080
  }
1081
+ interface RoomKickEvent {
1082
+ room: string;
1083
+ kickedBy: string | number;
1084
+ timestamp: string;
1085
+ }
1086
+ interface RoomCreatorChangedEvent {
1087
+ room: string;
1088
+ newCreatorSocketId: string;
1089
+ newCreatorUserId: string | number;
1090
+ timestamp: string;
1091
+ }
1092
+ interface RoomMember {
1093
+ socketId: string;
1094
+ userId: string | number;
1095
+ isCreator: boolean;
1096
+ }
1081
1097
  interface SubscriptionCallback<T = any> {
1082
1098
  (payload: SubscriptionPayload<T>): void;
1083
1099
  }
@@ -1119,6 +1135,8 @@ declare class RealtimeModule {
1119
1135
  private workflowCallbacks;
1120
1136
  private roomCallbacks;
1121
1137
  private roomUserCallbacks;
1138
+ private kickCallbacks;
1139
+ private creatorChangedCallbacks;
1122
1140
  private connectionCallbacks;
1123
1141
  private reconnecting;
1124
1142
  private connectionPromise;
@@ -1272,6 +1290,52 @@ declare class RealtimeModule {
1272
1290
  * ```
1273
1291
  */
1274
1292
  leaveRoom(roomName: string): Promise<void>;
1293
+ /**
1294
+ * Get the list of users currently in a room.
1295
+ * You must already be a member of the room to call this.
1296
+ *
1297
+ * @example
1298
+ * ```typescript
1299
+ * const members = await baasix.realtime.getRoomMembers('game:lobby');
1300
+ * members.forEach(m => {
1301
+ * console.log(m.userId, m.isCreator ? '(owner)' : '');
1302
+ * });
1303
+ * ```
1304
+ */
1305
+ getRoomMembers(roomName: string): Promise<RoomMember[]>;
1306
+ /**
1307
+ * Kick a user from a custom room. Only the room creator may call this.
1308
+ *
1309
+ * @example
1310
+ * ```typescript
1311
+ * await baasix.realtime.kickFromRoom('game:lobby', 'user-id-123');
1312
+ * ```
1313
+ */
1314
+ kickFromRoom(roomName: string, targetUserId: string | number): Promise<void>;
1315
+ /**
1316
+ * Listen for being kicked from a room.
1317
+ * The callback fires when the current user is removed by the room creator.
1318
+ * Room listeners are automatically cleaned up after the kick.
1319
+ *
1320
+ * @example
1321
+ * ```typescript
1322
+ * baasix.realtime.onKicked('game:lobby', ({ kickedBy }) => {
1323
+ * console.log(`You were kicked by user ${kickedBy}`);
1324
+ * });
1325
+ * ```
1326
+ */
1327
+ onKicked(roomName: string, callback: (data: RoomKickEvent) => void): () => void;
1328
+ /**
1329
+ * Listen for room ownership changes (e.g. when the creator leaves).
1330
+ *
1331
+ * @example
1332
+ * ```typescript
1333
+ * baasix.realtime.onRoomCreatorChanged('game:lobby', ({ newCreatorUserId }) => {
1334
+ * console.log(`New room owner: ${newCreatorUserId}`);
1335
+ * });
1336
+ * ```
1337
+ */
1338
+ onRoomCreatorChanged(roomName: string, callback: (data: RoomCreatorChangedEvent) => void): () => void;
1275
1339
  /**
1276
1340
  * Send a message to a room
1277
1341
  *
package/dist/index.js CHANGED
@@ -3291,6 +3291,8 @@ var RealtimeModule = class {
3291
3291
  roomCallbacks = /* @__PURE__ */ new Map();
3292
3292
  // room -> event -> callbacks
3293
3293
  roomUserCallbacks = /* @__PURE__ */ new Map();
3294
+ kickCallbacks = /* @__PURE__ */ new Map();
3295
+ creatorChangedCallbacks = /* @__PURE__ */ new Map();
3294
3296
  connectionCallbacks = /* @__PURE__ */ new Set();
3295
3297
  reconnecting = false;
3296
3298
  connectionPromise = null;
@@ -3420,6 +3422,27 @@ var RealtimeModule = class {
3420
3422
  }
3421
3423
  });
3422
3424
  });
3425
+ this.socket.on("room:kicked", (data) => {
3426
+ const callbacks = this.kickCallbacks.get(data.room);
3427
+ callbacks?.forEach((cb) => {
3428
+ try {
3429
+ cb(data);
3430
+ } catch (e) {
3431
+ console.error("[Baasix Realtime] Error in room kicked callback:", e);
3432
+ }
3433
+ });
3434
+ this.cleanupRoomListeners(data.room);
3435
+ });
3436
+ this.socket.on("room:creator:changed", (data) => {
3437
+ const callbacks = this.creatorChangedCallbacks.get(data.room);
3438
+ callbacks?.forEach((cb) => {
3439
+ try {
3440
+ cb(data);
3441
+ } catch (e) {
3442
+ console.error("[Baasix Realtime] Error in room creator changed callback:", e);
3443
+ }
3444
+ });
3445
+ });
3423
3446
  this.socket.connect();
3424
3447
  } catch (error) {
3425
3448
  this.connectionPromise = null;
@@ -3449,6 +3472,8 @@ var RealtimeModule = class {
3449
3472
  this.workflowCallbacks.clear();
3450
3473
  this.roomCallbacks.clear();
3451
3474
  this.roomUserCallbacks.clear();
3475
+ this.kickCallbacks.clear();
3476
+ this.creatorChangedCallbacks.clear();
3452
3477
  }
3453
3478
  /**
3454
3479
  * Check if connected to the realtime server
@@ -3719,6 +3744,110 @@ var RealtimeModule = class {
3719
3744
  });
3720
3745
  });
3721
3746
  }
3747
+ /**
3748
+ * Get the list of users currently in a room.
3749
+ * You must already be a member of the room to call this.
3750
+ *
3751
+ * @example
3752
+ * ```typescript
3753
+ * const members = await baasix.realtime.getRoomMembers('game:lobby');
3754
+ * members.forEach(m => {
3755
+ * console.log(m.userId, m.isCreator ? '(owner)' : '');
3756
+ * });
3757
+ * ```
3758
+ */
3759
+ async getRoomMembers(roomName) {
3760
+ if (!this.socket?.connected) {
3761
+ throw new Error("Not connected. Call connect() first.");
3762
+ }
3763
+ return new Promise((resolve, reject) => {
3764
+ this.socket.emit("room:members", { room: roomName }, (response) => {
3765
+ if (response.status === "success") {
3766
+ resolve(response.members);
3767
+ } else {
3768
+ reject(new Error(response.message || "Failed to get room members"));
3769
+ }
3770
+ });
3771
+ });
3772
+ }
3773
+ /**
3774
+ * Kick a user from a custom room. Only the room creator may call this.
3775
+ *
3776
+ * @example
3777
+ * ```typescript
3778
+ * await baasix.realtime.kickFromRoom('game:lobby', 'user-id-123');
3779
+ * ```
3780
+ */
3781
+ async kickFromRoom(roomName, targetUserId) {
3782
+ if (!this.socket?.connected) {
3783
+ throw new Error("Not connected. Call connect() first.");
3784
+ }
3785
+ return new Promise((resolve, reject) => {
3786
+ this.socket.emit(
3787
+ "room:kick",
3788
+ { room: roomName, userId: targetUserId },
3789
+ (response) => {
3790
+ if (response.status === "success") {
3791
+ resolve();
3792
+ } else {
3793
+ reject(new Error(response.message || "Failed to kick user"));
3794
+ }
3795
+ }
3796
+ );
3797
+ });
3798
+ }
3799
+ /**
3800
+ * Listen for being kicked from a room.
3801
+ * The callback fires when the current user is removed by the room creator.
3802
+ * Room listeners are automatically cleaned up after the kick.
3803
+ *
3804
+ * @example
3805
+ * ```typescript
3806
+ * baasix.realtime.onKicked('game:lobby', ({ kickedBy }) => {
3807
+ * console.log(`You were kicked by user ${kickedBy}`);
3808
+ * });
3809
+ * ```
3810
+ */
3811
+ onKicked(roomName, callback) {
3812
+ if (!this.kickCallbacks.has(roomName)) {
3813
+ this.kickCallbacks.set(roomName, /* @__PURE__ */ new Set());
3814
+ }
3815
+ this.kickCallbacks.get(roomName).add(callback);
3816
+ return () => {
3817
+ const callbacks = this.kickCallbacks.get(roomName);
3818
+ if (callbacks) {
3819
+ callbacks.delete(callback);
3820
+ if (callbacks.size === 0) {
3821
+ this.kickCallbacks.delete(roomName);
3822
+ }
3823
+ }
3824
+ };
3825
+ }
3826
+ /**
3827
+ * Listen for room ownership changes (e.g. when the creator leaves).
3828
+ *
3829
+ * @example
3830
+ * ```typescript
3831
+ * baasix.realtime.onRoomCreatorChanged('game:lobby', ({ newCreatorUserId }) => {
3832
+ * console.log(`New room owner: ${newCreatorUserId}`);
3833
+ * });
3834
+ * ```
3835
+ */
3836
+ onRoomCreatorChanged(roomName, callback) {
3837
+ if (!this.creatorChangedCallbacks.has(roomName)) {
3838
+ this.creatorChangedCallbacks.set(roomName, /* @__PURE__ */ new Set());
3839
+ }
3840
+ this.creatorChangedCallbacks.get(roomName).add(callback);
3841
+ return () => {
3842
+ const callbacks = this.creatorChangedCallbacks.get(roomName);
3843
+ if (callbacks) {
3844
+ callbacks.delete(callback);
3845
+ if (callbacks.size === 0) {
3846
+ this.creatorChangedCallbacks.delete(roomName);
3847
+ }
3848
+ }
3849
+ };
3850
+ }
3722
3851
  /**
3723
3852
  * Send a message to a room
3724
3853
  *
@@ -3871,6 +4000,8 @@ var RealtimeModule = class {
3871
4000
  cleanupRoomListeners(roomName) {
3872
4001
  this.roomCallbacks.delete(roomName);
3873
4002
  this.roomUserCallbacks.delete(roomName);
4003
+ this.kickCallbacks.delete(roomName);
4004
+ this.creatorChangedCallbacks.delete(roomName);
3874
4005
  }
3875
4006
  // ===================
3876
4007
  // Channel (Room) API - Supabase-style