@base44-preview/sdk 0.8.12-pr.70.fb3fcc2 → 0.8.13-pr.58.5899f33

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/client.js CHANGED
@@ -104,7 +104,11 @@ export function createClient(config) {
104
104
  serverUrl,
105
105
  });
106
106
  const userModules = {
107
- entities: createEntitiesModule(axiosClient, appId),
107
+ entities: createEntitiesModule({
108
+ axios: axiosClient,
109
+ appId,
110
+ getSocket,
111
+ }),
108
112
  integrations: createIntegrationsModule(axiosClient, appId),
109
113
  auth: userAuthModule,
110
114
  functions: createFunctionsModule(functionsAxiosClient, appId),
@@ -131,7 +135,11 @@ export function createClient(config) {
131
135
  },
132
136
  };
133
137
  const serviceRoleModules = {
134
- entities: createEntitiesModule(serviceRoleAxiosClient, appId),
138
+ entities: createEntitiesModule({
139
+ axios: serviceRoleAxiosClient,
140
+ appId,
141
+ getSocket,
142
+ }),
135
143
  integrations: createIntegrationsModule(serviceRoleAxiosClient, appId),
136
144
  sso: createSsoModule(serviceRoleAxiosClient, appId, token),
137
145
  connectors: createConnectorsModule(serviceRoleAxiosClient, appId),
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, } from "./modules/entities.types.js";
7
+ export type { EntitiesModule, EntityHandler, RealtimeEventType, RealtimeEvent, RealtimeCallback, 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";
@@ -11,7 +11,9 @@ export interface ConnectorAccessTokenResponse {
11
11
  /**
12
12
  * Connectors module for managing OAuth tokens for external services.
13
13
  *
14
- * This module allows you to retrieve OAuth access tokens for external services that the app has connected to. Connectors are app-scoped. When an app builder connects an integration like Google Calendar or Slack, all users of the app share that same connection.
14
+ * This module allows you to retrieve OAuth access tokens for external services
15
+ * that the app has connected to. Use these tokens to make API
16
+ * calls to external services.
15
17
  *
16
18
  * Unlike the integrations module that provides pre-built functions, connectors give you
17
19
  * raw OAuth tokens so you can call external service APIs directly with full control over
@@ -24,9 +26,9 @@ export interface ConnectorsModule {
24
26
  /**
25
27
  * Retrieves an OAuth access token for a specific external integration type.
26
28
  *
27
- * Returns the OAuth token string for an external service that an app builder
28
- * has connected to. This token represents the connected app builder's account
29
- * and can be used to make authenticated API calls to that external service on behalf of the app.
29
+ * Returns the OAuth token string for an external service that the app
30
+ * has connected to. You can then use this token to make authenticated API calls
31
+ * to that external service.
30
32
  *
31
33
  * @param integrationType - The type of integration, such as `'googlecalendar'`, `'slack'`, or `'github'`.
32
34
  * @returns Promise resolving to the access token string.
@@ -3,23 +3,20 @@
3
3
  */
4
4
  export interface CustomIntegrationCallParams {
5
5
  /**
6
- * Request body to send to the external API. The payload is JSON-serialized before being sent.
6
+ * Request body payload to send to the external API.
7
7
  */
8
8
  payload?: Record<string, any>;
9
9
  /**
10
- * Path parameters to substitute into the URL template.
11
- * For example, if the API endpoint is `/repos/{owner}/{repo}/issues`,
12
- * pass `{ owner: "myorg", repo: "myrepo" }`.
10
+ * Path parameters to substitute in the URL (e.g., `{ owner: "user", repo: "repo" }`).
13
11
  */
14
12
  pathParams?: Record<string, string>;
15
13
  /**
16
14
  * Query string parameters to append to the URL.
17
- * For example, `{ state: "open", per_page: 50 }` becomes `?state=open&per_page=50`.
18
15
  */
19
16
  queryParams?: Record<string, any>;
20
17
  /**
21
- * Additional HTTP headers to include in the request.
22
- * These headers are merged with any headers configured for the integration itself, with headers specified here taking precedence in case of conflicts.
18
+ * Additional headers to send with this specific request.
19
+ * These are merged with the integration's configured headers.
23
20
  */
24
21
  headers?: Record<string, string>;
25
22
  }
@@ -36,25 +33,66 @@ export interface CustomIntegrationCallResponse {
36
33
  */
37
34
  status_code: number;
38
35
  /**
39
- * The parsed JSON response body from the external API.
40
- * The structure depends on the API endpoint being called.
36
+ * The response data from the external API.
37
+ * Can be any JSON-serializable value depending on the external API's response.
41
38
  */
42
39
  data: any;
43
40
  }
44
41
  /**
45
- * Custom integrations module for calling workspace-level API integrations.
42
+ * Module for calling custom workspace-level API integrations.
43
+ *
44
+ * Custom integrations allow workspace administrators to connect any external API
45
+ * by importing an OpenAPI specification. Apps in the workspace can then call
46
+ * these integrations using this module.
47
+ *
48
+ * Unlike the built-in integrations (like `Core`), custom integrations:
49
+ * - Are defined per-workspace by importing OpenAPI specs
50
+ * - Use a slug-based identifier instead of package names
51
+ * - Proxy requests through Base44's backend (credentials never exposed to frontend)
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * // Call a custom GitHub integration
56
+ * const response = await base44.integrations.custom.call(
57
+ * "github", // integration slug (defined by workspace admin)
58
+ * "listIssues", // operation ID from the OpenAPI spec
59
+ * {
60
+ * pathParams: { owner: "myorg", repo: "myrepo" },
61
+ * queryParams: { state: "open", per_page: 100 }
62
+ * }
63
+ * );
64
+ *
65
+ * if (response.success) {
66
+ * console.log("Issues:", response.data);
67
+ * } else {
68
+ * console.error("API returned error:", response.status_code);
69
+ * }
70
+ * ```
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * // Call with request body payload
75
+ * const response = await base44.integrations.custom.call(
76
+ * "github",
77
+ * "createIssue",
78
+ * {
79
+ * pathParams: { owner: "myorg", repo: "myrepo" },
80
+ * payload: {
81
+ * title: "Bug report",
82
+ * body: "Something is broken",
83
+ * labels: ["bug"]
84
+ * }
85
+ * }
86
+ * );
87
+ * ```
46
88
  */
47
89
  export interface CustomIntegrationsModule {
48
90
  /**
49
91
  * Call a custom integration endpoint.
50
92
  *
51
- * Custom integrations are external APIs that have been pre-configured by a workspace administrator who imports an OpenAPI specification. Each integration is identified by a slug and exposes operations defined in the specification.
52
- *
53
- * Requests are proxied through Base44's backend, so API credentials aren't exposed. That means you can safely use this method to call external APIs from frontend code.
54
- *
55
- * @param slug - The integration's unique identifier, as defined by the workspace admin.
56
- * @param operationId - The operation ID from the OpenAPI specification, such as `"listIssues"` or `"getUser"`.
57
- * @param params - Optional parameters to send to the external API.
93
+ * @param slug - The integration's unique identifier (slug), as defined by the workspace admin.
94
+ * @param operationId - The operation ID from the OpenAPI spec (e.g., "listIssues", "getUser").
95
+ * @param params - Optional parameters including payload, pathParams, queryParams, and headers.
58
96
  * @returns Promise resolving to the integration call response.
59
97
  *
60
98
  * @throws {Error} If slug is not provided.
@@ -62,38 +100,6 @@ export interface CustomIntegrationsModule {
62
100
  * @throws {Base44Error} If the integration or operation is not found (404).
63
101
  * @throws {Base44Error} If the external API call fails (502).
64
102
  * @throws {Base44Error} If the request times out (504).
65
- *
66
- * @example
67
- * ```typescript
68
- * // GET request with path and query parameters
69
- * const response = await base44.integrations.custom.call(
70
- * "github",
71
- * "listRepoIssues",
72
- * {
73
- * pathParams: { owner: "myorg", repo: "myrepo" },
74
- * queryParams: { state: "open", per_page: 50 }
75
- * }
76
- * );
77
- *
78
- * if (response.success) {
79
- * console.log("Found issues:", response.data.length);
80
- * }
81
- * ```
82
- *
83
- * @example
84
- * ```typescript
85
- * // POST request with a JSON body
86
- * const response = await base44.integrations.custom.call(
87
- * "slack",
88
- * "postMessage",
89
- * {
90
- * payload: {
91
- * channel: "#general",
92
- * text: "Hello from Base44!"
93
- * }
94
- * }
95
- * );
96
- * ```
97
103
  */
98
104
  call(slug: string, operationId: string, params?: CustomIntegrationCallParams): Promise<CustomIntegrationCallResponse>;
99
105
  }
@@ -1,5 +1,23 @@
1
1
  import { AxiosInstance } from "axios";
2
2
  import { EntitiesModule } from "./entities.types";
3
+ import { RoomsSocket } from "../utils/socket-utils";
4
+ /**
5
+ * Configuration for the entities module.
6
+ * @internal
7
+ */
8
+ export interface EntitiesModuleConfig {
9
+ axios: AxiosInstance;
10
+ appId: string;
11
+ getSocket: () => ReturnType<typeof RoomsSocket>;
12
+ }
13
+ /**
14
+ * Creates the entities module for the Base44 SDK.
15
+ *
16
+ * @param config - Configuration object containing axios, appId, and getSocket
17
+ * @returns Entities module with dynamic entity access
18
+ * @internal
19
+ */
20
+ export declare function createEntitiesModule(config: EntitiesModuleConfig): EntitiesModule;
3
21
  /**
4
22
  * Creates the entities module for the Base44 SDK.
5
23
  *
@@ -7,5 +25,6 @@ import { EntitiesModule } from "./entities.types";
7
25
  * @param appId - Application ID
8
26
  * @returns Entities module with dynamic entity access
9
27
  * @internal
28
+ * @deprecated Use the config object overload instead
10
29
  */
11
30
  export declare function createEntitiesModule(axios: AxiosInstance, appId: string): EntitiesModule;
@@ -1,12 +1,15 @@
1
- /**
2
- * Creates the entities module for the Base44 SDK.
3
- *
4
- * @param axios - Axios instance
5
- * @param appId - Application ID
6
- * @returns Entities module with dynamic entity access
7
- * @internal
8
- */
9
- export function createEntitiesModule(axios, appId) {
1
+ export function createEntitiesModule(configOrAxios, appIdArg) {
2
+ // Handle both old and new signatures for backwards compatibility
3
+ const config = "axios" in configOrAxios
4
+ ? configOrAxios
5
+ : {
6
+ axios: configOrAxios,
7
+ appId: appIdArg,
8
+ getSocket: () => {
9
+ throw new Error("Realtime subscriptions are not available. Please update your client configuration.");
10
+ },
11
+ };
12
+ const { axios, appId, getSocket } = config;
10
13
  // Using Proxy to dynamically handle entity names
11
14
  return new Proxy({}, {
12
15
  get(target, entityName) {
@@ -17,20 +20,41 @@ export function createEntitiesModule(axios, appId) {
17
20
  return undefined;
18
21
  }
19
22
  // Create entity handler
20
- return createEntityHandler(axios, appId, entityName);
23
+ return createEntityHandler(axios, appId, entityName, getSocket);
21
24
  },
22
25
  });
23
26
  }
27
+ /**
28
+ * Parses the realtime message data and extracts event information.
29
+ * @internal
30
+ */
31
+ function parseRealtimeMessage(dataStr) {
32
+ var _a;
33
+ try {
34
+ const parsed = JSON.parse(dataStr);
35
+ return {
36
+ type: parsed.type,
37
+ data: parsed.data,
38
+ id: parsed.id || ((_a = parsed.data) === null || _a === void 0 ? void 0 : _a.id),
39
+ timestamp: parsed.timestamp || new Date().toISOString(),
40
+ };
41
+ }
42
+ catch (error) {
43
+ console.warn("[Base44 SDK] Failed to parse realtime message:", error);
44
+ return null;
45
+ }
46
+ }
24
47
  /**
25
48
  * Creates a handler for a specific entity.
26
49
  *
27
50
  * @param axios - Axios instance
28
51
  * @param appId - Application ID
29
52
  * @param entityName - Entity name
53
+ * @param getSocket - Function to get the socket instance
30
54
  * @returns Entity handler with CRUD methods
31
55
  * @internal
32
56
  */
33
- function createEntityHandler(axios, appId, entityName) {
57
+ function createEntityHandler(axios, appId, entityName, getSocket) {
34
58
  const baseURL = `/apps/${appId}/entities/${entityName}`;
35
59
  return {
36
60
  // List entities with optional pagination and sorting
@@ -95,5 +119,21 @@ function createEntityHandler(axios, appId, entityName) {
95
119
  },
96
120
  });
97
121
  },
122
+ // Subscribe to realtime updates
123
+ subscribe(callback) {
124
+ const room = `entities:${appId}:${entityName}`;
125
+ // Get the socket and subscribe to the room
126
+ const socket = getSocket();
127
+ const unsubscribe = socket.subscribeToRoom(room, {
128
+ update_model: (msg) => {
129
+ const event = parseRealtimeMessage(msg.data);
130
+ if (!event) {
131
+ return;
132
+ }
133
+ callback(event);
134
+ },
135
+ });
136
+ return unsubscribe;
137
+ },
98
138
  };
99
139
  }
@@ -1,3 +1,28 @@
1
+ /**
2
+ * Event types for realtime entity updates.
3
+ */
4
+ export type RealtimeEventType = "create" | "update" | "delete";
5
+ /**
6
+ * Payload received when a realtime event occurs.
7
+ */
8
+ export interface RealtimeEvent {
9
+ /** The type of change that occurred */
10
+ type: RealtimeEventType;
11
+ /** The entity data */
12
+ data: any;
13
+ /** The unique identifier of the affected entity */
14
+ id: string;
15
+ /** ISO 8601 timestamp of when the event occurred */
16
+ timestamp: string;
17
+ }
18
+ /**
19
+ * Callback function invoked when a realtime event occurs.
20
+ */
21
+ export type RealtimeCallback = (event: RealtimeEvent) => void;
22
+ /**
23
+ * Function returned from subscribe, call it to unsubscribe.
24
+ */
25
+ export type Subscription = () => void;
1
26
  /**
2
27
  * Entity handler providing CRUD operations for a specific entity type.
3
28
  *
@@ -242,6 +267,26 @@ export interface EntityHandler {
242
267
  * ```
243
268
  */
244
269
  importEntities(file: File): Promise<any>;
270
+ /**
271
+ * Subscribes to realtime updates for all records of this entity type.
272
+ *
273
+ * Receives notifications whenever any record is created, updated, or deleted.
274
+ *
275
+ * @param callback - Function called when an entity changes.
276
+ * @returns Unsubscribe function to stop listening.
277
+ *
278
+ * @example
279
+ * ```typescript
280
+ * // Subscribe to all Task changes
281
+ * const unsubscribe = base44.entities.Task.subscribe((event) => {
282
+ * console.log(`Task ${event.id} was ${event.type}d:`, event.data);
283
+ * });
284
+ *
285
+ * // Later, unsubscribe
286
+ * unsubscribe();
287
+ * ```
288
+ */
289
+ subscribe(callback: RealtimeCallback): Subscription;
245
290
  }
246
291
  /**
247
292
  * Entities module for managing app data.
@@ -320,28 +320,22 @@ export interface CoreIntegrations {
320
320
  CreateFileSignedUrl(params: CreateFileSignedUrlParams): Promise<CreateFileSignedUrlResult>;
321
321
  }
322
322
  /**
323
- * Integrations module for calling integration methods.
323
+ * Integrations module for calling integration endpoints.
324
324
  *
325
- * This module provides access to integration methods for interacting with external services. Unlike the connectors module that gives you raw OAuth tokens, integrations provide pre-built functions that Base44 executes on your behalf.
325
+ * This module provides access to integration endpoints for interacting with external
326
+ * services. Integrations are organized into packages. Base44 provides built-in integrations
327
+ * in the `Core` package.
326
328
  *
327
- * There are two types of integrations:
329
+ * Unlike the connectors module that gives you raw OAuth tokens, integrations provide
330
+ * pre-built functions that Base44 executes on your behalf.
328
331
  *
329
- * - **Built-in integrations** (`Core`): Pre-built functions provided by Base44 for common tasks such as AI-powered text generation, image creation, file uploads, and email. Access core integration methods using:
330
- * ```
331
- * base44.integrations.Core.FunctionName(params)
332
- * ```
333
- *
334
- * - **Custom integrations** (`custom`): Pre-configured external APIs. Custom integration calls are proxied through Base44's backend, so credentials are never exposed to the frontend. Access custom integration methods using:
335
- * ```
336
- * base44.integrations.custom.call(slug, operationId, params)
337
- * ```
338
- *
339
- * <Info>To call a custom integration, it must be pre-configured by a workspace administrator who imports an OpenAPI specification.</Info>
332
+ * Integration endpoints are accessed dynamically using the pattern:
333
+ * `base44.integrations.PackageName.EndpointName(params)`
340
334
  *
341
335
  * This module is available to use with a client in all authentication modes:
342
336
  *
343
- * - **Anonymous or User authentication** (`base44.integrations`): Integration methods are invoked with the current user's permissions. Anonymous users invoke methods without authentication, while authenticated users invoke methods with their authentication context.
344
- * - **Service role authentication** (`base44.asServiceRole.integrations`): Integration methods are invoked with elevated admin-level permissions. The methods execute with admin authentication context.
337
+ * - **Anonymous or User authentication** (`base44.integrations`): Integration endpoints are invoked with the current user's permissions. Anonymous users invoke endpoints without authentication, while authenticated users invoke endpoints with their authentication context.
338
+ * - **Service role authentication** (`base44.asServiceRole.integrations`): Integration endpoints are invoked with elevated admin-level permissions. The endpoints execute with admin authentication context.
345
339
  */
346
340
  export type IntegrationsModule = {
347
341
  /**
@@ -349,7 +343,22 @@ export type IntegrationsModule = {
349
343
  */
350
344
  Core: CoreIntegrations;
351
345
  /**
352
- * Custom integrations module for calling pre-configured external APIs.
346
+ * Custom integrations module for calling workspace-level API integrations.
347
+ *
348
+ * Allows calling external APIs that workspace admins have configured
349
+ * by importing OpenAPI specifications.
350
+ *
351
+ * @example
352
+ * ```typescript
353
+ * const response = await base44.integrations.custom.call(
354
+ * "github", // integration slug
355
+ * "listIssues", // operation ID
356
+ * {
357
+ * pathParams: { owner: "myorg", repo: "myrepo" },
358
+ * queryParams: { state: "open" }
359
+ * }
360
+ * );
361
+ * ```
353
362
  */
354
363
  custom: CustomIntegrationsModule;
355
364
  } & {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@base44-preview/sdk",
3
- "version": "0.8.12-pr.70.fb3fcc2",
3
+ "version": "0.8.13-pr.58.5899f33",
4
4
  "description": "JavaScript SDK for Base44 API",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",