@base44-preview/sdk 0.8.11-pr.58.0494dbf → 0.8.11-pr.58.a137910

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.ts CHANGED
@@ -4,7 +4,7 @@ import { getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl } from
4
4
  export { createClient, createClientFromRequest, Base44Error, getAccessToken, saveAccessToken, removeAccessToken, getLoginUrl, };
5
5
  export type { Base44Client, CreateClientConfig, CreateClientOptions, Base44ErrorJSON, };
6
6
  export * from "./types.js";
7
- export type { EntitiesModule, EntityHandler, RealtimeEventType, RealtimeEvent, RealtimeCallback, Subscription, } from "./modules/entities.types.js";
7
+ export type { EntitiesModule, EntityHandler, RealtimeEventType, RealtimeEvent, RealtimeCallback, SubscribeOptions, Subscription, } from "./modules/entities.types.js";
8
8
  export type { AuthModule, LoginResponse, RegisterParams, VerifyOtpParams, ChangePasswordParams, ResetPasswordParams, User, } from "./modules/auth.types.js";
9
9
  export type { IntegrationsModule, IntegrationPackage, IntegrationEndpointFunction, CoreIntegrations, InvokeLLMParams, GenerateImageParams, GenerateImageResult, UploadFileParams, UploadFileResult, SendEmailParams, SendEmailResult, ExtractDataFromUploadedFileParams, ExtractDataFromUploadedFileResult, UploadPrivateFileParams, UploadPrivateFileResult, CreateFileSignedUrlParams, CreateFileSignedUrlResult, } from "./modules/integrations.types.js";
10
10
  export type { FunctionsModule } from "./modules/functions.types.js";
@@ -24,6 +24,24 @@ export function createEntitiesModule(configOrAxios, appIdArg) {
24
24
  },
25
25
  });
26
26
  }
27
+ /**
28
+ * Creates a stable hash from a query object for room naming.
29
+ * @internal
30
+ */
31
+ function hashQuery(query) {
32
+ const sortedKeys = Object.keys(query).sort();
33
+ const normalized = sortedKeys
34
+ .map((k) => `${k}:${JSON.stringify(query[k])}`)
35
+ .join("|");
36
+ // Simple hash function
37
+ let hash = 0;
38
+ for (let i = 0; i < normalized.length; i++) {
39
+ const char = normalized.charCodeAt(i);
40
+ hash = (hash << 5) - hash + char;
41
+ hash = hash & hash; // Convert to 32bit integer
42
+ }
43
+ return Math.abs(hash).toString(36);
44
+ }
27
45
  /**
28
46
  * Parses the realtime message data and extracts event information.
29
47
  * @internal
@@ -37,6 +55,7 @@ function parseRealtimeMessage(dataStr) {
37
55
  data: parsed.data,
38
56
  id: parsed.id || ((_a = parsed.data) === null || _a === void 0 ? void 0 : _a.id),
39
57
  timestamp: parsed.timestamp || new Date().toISOString(),
58
+ previousData: parsed.previousData,
40
59
  };
41
60
  }
42
61
  catch (_b) {
@@ -119,24 +138,51 @@ function createEntityHandler(axios, appId, entityName, getSocket) {
119
138
  });
120
139
  },
121
140
  // Subscribe to realtime updates
122
- subscribe(callback) {
123
- const room = `entities:${appId}:${entityName}`;
141
+ subscribe(callbackOrIdOrQuery, callbackOrOptions, optionsArg) {
142
+ let room;
143
+ let callback;
144
+ let options;
145
+ // Parse overloaded arguments
146
+ if (typeof callbackOrIdOrQuery === "function") {
147
+ // subscribe(callback, options?)
148
+ room = `entities:${appId}:${entityName}`;
149
+ callback = callbackOrIdOrQuery;
150
+ options = callbackOrOptions;
151
+ }
152
+ else if (typeof callbackOrIdOrQuery === "string") {
153
+ // subscribe(id, callback, options?)
154
+ room = `entities:${appId}:${entityName}:${callbackOrIdOrQuery}`;
155
+ callback = callbackOrOptions;
156
+ options = optionsArg;
157
+ }
158
+ else {
159
+ // subscribe(query, callback, options?)
160
+ const queryHash = hashQuery(callbackOrIdOrQuery);
161
+ room = `entities:${appId}:${entityName}:query:${queryHash}`;
162
+ callback = callbackOrOptions;
163
+ options = optionsArg;
164
+ }
165
+ const eventFilter = options === null || options === void 0 ? void 0 : options.events;
124
166
  // Get the socket and subscribe to the room
125
167
  const socket = getSocket();
126
168
  const unsubscribe = socket.subscribeToRoom(room, {
127
169
  update_model: (msg) => {
128
170
  // Only process messages for our room
129
- if (msg.room !== room) {
171
+ if (msg.room !== room)
130
172
  return;
131
- }
132
173
  const event = parseRealtimeMessage(msg.data);
133
- if (!event) {
174
+ if (!event)
175
+ return;
176
+ // Apply event type filter if specified
177
+ if (eventFilter && !eventFilter.includes(event.type)) {
134
178
  return;
135
179
  }
136
180
  callback(event);
137
181
  },
138
182
  });
139
- return unsubscribe;
183
+ return {
184
+ unsubscribe,
185
+ };
140
186
  },
141
187
  };
142
188
  }
@@ -14,15 +14,27 @@ export interface RealtimeEvent<T = Record<string, any>> {
14
14
  id: string;
15
15
  /** ISO 8601 timestamp of when the event occurred */
16
16
  timestamp: string;
17
+ /** For update events, contains the previous data before the change */
18
+ previousData?: T;
17
19
  }
18
20
  /**
19
21
  * Callback function invoked when a realtime event occurs.
20
22
  */
21
23
  export type RealtimeCallback<T = Record<string, any>> = (event: RealtimeEvent<T>) => void;
22
24
  /**
23
- * Function returned from subscribe, call it to unsubscribe.
25
+ * Options for subscribing to realtime updates.
24
26
  */
25
- export type Subscription = () => void;
27
+ export interface SubscribeOptions {
28
+ /** Filter events by type. Defaults to all types. */
29
+ events?: RealtimeEventType[];
30
+ }
31
+ /**
32
+ * Handle returned from subscribe, used to unsubscribe.
33
+ */
34
+ export interface Subscription {
35
+ /** Stops listening to updates and cleans up the subscription. */
36
+ unsubscribe: () => void;
37
+ }
26
38
  /**
27
39
  * Entity handler providing CRUD operations for a specific entity type.
28
40
  *
@@ -273,20 +285,87 @@ export interface EntityHandler {
273
285
  * Receives notifications whenever any record is created, updated, or deleted.
274
286
  *
275
287
  * @param callback - Function called when an entity changes.
276
- * @returns Unsubscribe function to stop listening.
288
+ * @param options - Optional configuration for filtering events.
289
+ * @returns Subscription handle with an unsubscribe method.
277
290
  *
278
291
  * @example
279
292
  * ```typescript
280
293
  * // Subscribe to all Task changes
281
- * const unsubscribe = base44.entities.Task.subscribe((event) => {
294
+ * const subscription = base44.entities.Task.subscribe((event) => {
282
295
  * console.log(`Task ${event.id} was ${event.type}d:`, event.data);
283
296
  * });
284
297
  *
285
298
  * // Later, unsubscribe
286
- * unsubscribe();
299
+ * subscription.unsubscribe();
300
+ * ```
301
+ *
302
+ * @example
303
+ * ```typescript
304
+ * // Subscribe only to create events
305
+ * const subscription = base44.entities.Task.subscribe(
306
+ * (event) => console.log("New task:", event.data),
307
+ * { events: ["create"] }
308
+ * );
309
+ * ```
310
+ */
311
+ subscribe(callback: RealtimeCallback, options?: SubscribeOptions): Subscription;
312
+ /**
313
+ * Subscribes to realtime updates for a specific entity record.
314
+ *
315
+ * Receives notifications when the specified record is updated or deleted.
316
+ *
317
+ * @param id - The unique identifier of the record to watch.
318
+ * @param callback - Function called when the entity changes.
319
+ * @param options - Optional configuration for filtering events.
320
+ * @returns Subscription handle with an unsubscribe method.
321
+ *
322
+ * @example
323
+ * ```typescript
324
+ * // Subscribe to a specific task
325
+ * const subscription = base44.entities.Task.subscribe("task-123", (event) => {
326
+ * if (event.type === "update") {
327
+ * console.log("Task updated:", event.data);
328
+ * } else if (event.type === "delete") {
329
+ * console.log("Task was deleted");
330
+ * }
331
+ * });
332
+ * ```
333
+ */
334
+ subscribe(id: string, callback: RealtimeCallback, options?: SubscribeOptions): Subscription;
335
+ /**
336
+ * Subscribes to realtime updates for records matching a query.
337
+ *
338
+ * Receives notifications for records that match the specified criteria.
339
+ * Includes create events when new records match the query, update events
340
+ * when matching records change, and delete events when matching records
341
+ * are removed.
342
+ *
343
+ * @param query - Query object with field-value pairs to filter records.
344
+ * @param callback - Function called when a matching entity changes.
345
+ * @param options - Optional configuration for filtering events.
346
+ * @returns Subscription handle with an unsubscribe method.
347
+ *
348
+ * @example
349
+ * ```typescript
350
+ * // Subscribe to all completed tasks
351
+ * const subscription = base44.entities.Task.subscribe(
352
+ * { isCompleted: true },
353
+ * (event) => {
354
+ * console.log(`Completed task ${event.type}:`, event.data);
355
+ * }
356
+ * );
357
+ * ```
358
+ *
359
+ * @example
360
+ * ```typescript
361
+ * // Subscribe to high-priority active tasks
362
+ * const subscription = base44.entities.Task.subscribe(
363
+ * { priority: "high", status: "active" },
364
+ * (event) => console.log("High priority task changed:", event.data)
365
+ * );
287
366
  * ```
288
367
  */
289
- subscribe(callback: RealtimeCallback): Subscription;
368
+ subscribe(query: Record<string, any>, callback: RealtimeCallback, options?: SubscribeOptions): Subscription;
290
369
  }
291
370
  /**
292
371
  * Entities module for managing app data.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/sdk",
3
- "version": "0.8.11-pr.58.0494dbf",
3
+ "version": "0.8.11-pr.58.a137910",
4
4
  "description": "JavaScript SDK for Base44 API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",