@objectstack/client 4.0.2 → 4.0.4

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @objectstack/client@4.0.2 build /home/runner/work/framework/framework/packages/client
2
+ > @objectstack/client@4.0.4 build /home/runner/work/framework/framework/packages/client
3
3
  > tsup --config ../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- ESM dist/index.mjs 54.51 KB
14
- ESM dist/index.mjs.map 110.18 KB
15
- ESM ⚡️ Build success in 31ms
16
- CJS dist/index.js 55.68 KB
17
- CJS dist/index.js.map 110.24 KB
18
- CJS ⚡️ Build success in 31ms
13
+ ESM dist/index.mjs 58.57 KB
14
+ ESM dist/index.mjs.map 119.43 KB
15
+ ESM ⚡️ Build success in 33ms
16
+ CJS dist/index.js 59.78 KB
17
+ CJS dist/index.js.map 119.48 KB
18
+ CJS ⚡️ Build success in 33ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 3191ms
21
- DTS dist/index.d.mts 33.94 KB
22
- DTS dist/index.d.ts 33.94 KB
20
+ DTS ⚡️ Build success in 3330ms
21
+ DTS dist/index.d.mts 36.51 KB
22
+ DTS dist/index.d.ts 36.51 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @objectstack/client
2
2
 
3
+ ## 4.0.4
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [326b66b]
8
+ - @objectstack/spec@4.0.4
9
+ - @objectstack/core@4.0.4
10
+
11
+ ## 4.0.3
12
+
13
+ ### Patch Changes
14
+
15
+ - @objectstack/spec@4.0.3
16
+ - @objectstack/core@4.0.3
17
+
3
18
  ## 4.0.2
4
19
 
5
20
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -1,7 +1,77 @@
1
1
  import { FilterCondition, QueryAST, SortNode, AggregationNode } from '@objectstack/spec/data';
2
- import { ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
- export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
2
+ import { MetadataEvent, DataEvent, ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
+ export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AuthFeaturesConfig, AuthProviderInfo, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, EmailPasswordConfigPublic, ErrorCategory, GetAuthConfigResponse, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
4
4
  import { Logger } from '@objectstack/core';
5
+ import { RealtimeEventPayload } from '@objectstack/spec/contracts';
6
+
7
+ /**
8
+ * Realtime API Module for ObjectStackClient
9
+ *
10
+ * Provides real-time event subscription capabilities using long-polling.
11
+ * For production WebSocket/SSE support, extend with transport adapters.
12
+ */
13
+
14
+ interface RealtimeSubscriptionFilter {
15
+ /** Metadata/object type filter */
16
+ type?: string;
17
+ /** Package ID filter */
18
+ packageId?: string;
19
+ /** Event types to listen for */
20
+ eventTypes?: string[];
21
+ /** Record ID filter (for data events) */
22
+ recordId?: string;
23
+ }
24
+ type RealtimeEventHandler = (event: RealtimeEventPayload) => void;
25
+ /**
26
+ * Realtime API for subscribing to server events
27
+ *
28
+ * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.
29
+ */
30
+ declare class RealtimeAPI {
31
+ private _baseUrl;
32
+ private _token?;
33
+ private subscriptions;
34
+ private pollInterval?;
35
+ private eventBuffer;
36
+ constructor(baseUrl: string, token?: string);
37
+ /**
38
+ * Subscribe to metadata events
39
+ * Returns an unsubscribe function
40
+ */
41
+ subscribeMetadata(type: string, callback: (event: MetadataEvent) => void, options?: {
42
+ packageId?: string;
43
+ }): () => void;
44
+ /**
45
+ * Subscribe to data record events
46
+ * Returns an unsubscribe function
47
+ */
48
+ subscribeData(object: string, callback: (event: DataEvent) => void, options?: {
49
+ recordId?: string;
50
+ }): () => void;
51
+ /**
52
+ * Emit an event to all matching subscriptions (client-side only)
53
+ * This is used for in-process event delivery
54
+ */
55
+ private emitEvent;
56
+ /**
57
+ * Start polling for events (fallback mechanism)
58
+ * In production, this would be replaced with WebSocket/SSE
59
+ */
60
+ private startPolling;
61
+ /**
62
+ * Stop polling for events
63
+ */
64
+ private stopPolling;
65
+ /**
66
+ * Internal method to buffer events from server
67
+ * This would be called by WebSocket/SSE handlers in production
68
+ */
69
+ _bufferEvent(event: RealtimeEventPayload): void;
70
+ /**
71
+ * Disconnect and clean up all subscriptions
72
+ */
73
+ disconnect(): void;
74
+ }
5
75
 
6
76
  /**
7
77
  * Type-Safe Query Builder
@@ -299,6 +369,7 @@ declare class ObjectStackClient {
299
369
  private fetchImpl;
300
370
  private discoveryInfo?;
301
371
  private logger;
372
+ private realtimeAPI;
302
373
  constructor(config: ClientConfig);
303
374
  /**
304
375
  * Initialize the client by discovering server capabilities.
@@ -497,6 +568,11 @@ declare class ObjectStackClient {
497
568
  * Authentication Services
498
569
  */
499
570
  auth: {
571
+ /**
572
+ * Get authentication configuration
573
+ * Returns available auth providers and features
574
+ */
575
+ getConfig: () => Promise<unknown>;
500
576
  /**
501
577
  * Login with email and password
502
578
  * Uses better-auth endpoint: POST /sign-in/email
@@ -614,6 +690,11 @@ declare class ObjectStackClient {
614
690
  get: (flowName: string, runId: string) => Promise<any>;
615
691
  };
616
692
  };
693
+ /**
694
+ * Event Subscription API
695
+ * Provides real-time event subscriptions for metadata and data changes
696
+ */
697
+ get events(): RealtimeAPI;
617
698
  /**
618
699
  * Permissions Services
619
700
  */
@@ -938,4 +1019,4 @@ declare class ObjectStackClient {
938
1019
  private getRoute;
939
1020
  }
940
1021
 
941
- export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, type StandardError, type UpdateDataResult, createFilter, createQuery };
1022
+ export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, RealtimeAPI, type RealtimeEventHandler, type RealtimeSubscriptionFilter, type StandardError, type UpdateDataResult, createFilter, createQuery };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,77 @@
1
1
  import { FilterCondition, QueryAST, SortNode, AggregationNode } from '@objectstack/spec/data';
2
- import { ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
- export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, ErrorCategory, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
2
+ import { MetadataEvent, DataEvent, ApiRoutes, GetDiscoveryResponse, WellKnownCapabilities, GetMetaTypesResponse, GetMetaItemsResponse, MetadataCacheRequest, MetadataCacheResponse, LoginRequest, SessionResponse, RegisterRequest, FileUploadResponse, GetPresignedUrlRequest, PresignedUrlResponse, InitiateChunkedUploadRequest, InitiateChunkedUploadResponse, UploadChunkResponse, CompleteChunkedUploadRequest, CompleteChunkedUploadResponse, CheckPermissionRequest, CheckPermissionResponse, GetObjectPermissionsResponse, GetEffectivePermissionsResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, SetPresenceRequest, GetPresenceResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, WorkflowTransitionRequest, WorkflowTransitionResponse, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, ListViewsResponse, GetViewResponse, CreateViewRequest, CreateViewResponse, UpdateViewRequest, UpdateViewResponse, DeleteViewResponse, RegisterDeviceRequest, RegisterDeviceResponse, UnregisterDeviceResponse, GetNotificationPreferencesResponse, UpdateNotificationPreferencesRequest, UpdateNotificationPreferencesResponse, ListNotificationsResponse, MarkNotificationsReadResponse, MarkAllNotificationsReadResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AiInsightsRequest, AiInsightsResponse, GetLocalesResponse, GetTranslationsResponse, GetFieldLabelsResponse, GetFeedResponse, CreateFeedItemResponse, UpdateFeedItemResponse, DeleteFeedItemResponse, AddReactionResponse, RemoveReactionResponse, PinFeedItemResponse, UnpinFeedItemResponse, StarFeedItemResponse, UnstarFeedItemResponse, SearchFeedResponse, GetChangelogResponse, SubscribeResponse, UnsubscribeResponse, BatchUpdateRequest, BatchUpdateResponse, BatchOptions, StandardErrorCode, ErrorCategory } from '@objectstack/spec/api';
3
+ export { AddReactionResponse, AiInsightsRequest, AiInsightsResponse, AiNlqRequest, AiNlqResponse, AiSuggestRequest, AiSuggestResponse, AuthFeaturesConfig, AuthProviderInfo, BatchOperationResult, BatchOptions, BatchRecord, BatchUpdateRequest, BatchUpdateResponse, CheckPermissionRequest, CheckPermissionResponse, CreateFeedItemResponse, CreateViewResponse, DeleteFeedItemResponse, DeleteManyRequest, DeleteViewResponse, EmailPasswordConfigPublic, ErrorCategory, GetAuthConfigResponse, GetChangelogResponse, GetDiscoveryResponse, GetEffectivePermissionsResponse, GetFeedResponse, GetFieldLabelsResponse, GetLocalesResponse, GetMetaItemsResponse, GetMetaTypesResponse, GetObjectPermissionsResponse, GetPresenceResponse, GetTranslationsResponse, GetViewResponse, GetWorkflowConfigResponse, GetWorkflowStateResponse, ListNotificationsResponse, ListViewsResponse, MetadataCacheRequest, MetadataCacheResponse, PinFeedItemResponse, RealtimeConnectRequest, RealtimeConnectResponse, RealtimeSubscribeRequest, RealtimeSubscribeResponse, RefreshTokenRequest, RegisterDeviceRequest, RegisterDeviceResponse, RegisterRequest, RemoveReactionResponse, SearchFeedResponse, StandardErrorCode, StarFeedItemResponse, SubscribeResponse, UnpinFeedItemResponse, UnstarFeedItemResponse, UnsubscribeResponse, UpdateFeedItemResponse, UpdateManyRequest, UpdateViewResponse, WellKnownCapabilities, WorkflowApproveRequest, WorkflowApproveResponse, WorkflowRejectRequest, WorkflowRejectResponse, WorkflowTransitionRequest, WorkflowTransitionResponse } from '@objectstack/spec/api';
4
4
  import { Logger } from '@objectstack/core';
5
+ import { RealtimeEventPayload } from '@objectstack/spec/contracts';
6
+
7
+ /**
8
+ * Realtime API Module for ObjectStackClient
9
+ *
10
+ * Provides real-time event subscription capabilities using long-polling.
11
+ * For production WebSocket/SSE support, extend with transport adapters.
12
+ */
13
+
14
+ interface RealtimeSubscriptionFilter {
15
+ /** Metadata/object type filter */
16
+ type?: string;
17
+ /** Package ID filter */
18
+ packageId?: string;
19
+ /** Event types to listen for */
20
+ eventTypes?: string[];
21
+ /** Record ID filter (for data events) */
22
+ recordId?: string;
23
+ }
24
+ type RealtimeEventHandler = (event: RealtimeEventPayload) => void;
25
+ /**
26
+ * Realtime API for subscribing to server events
27
+ *
28
+ * Note: Currently uses in-memory adapter. WebSocket/SSE transport planned for future.
29
+ */
30
+ declare class RealtimeAPI {
31
+ private _baseUrl;
32
+ private _token?;
33
+ private subscriptions;
34
+ private pollInterval?;
35
+ private eventBuffer;
36
+ constructor(baseUrl: string, token?: string);
37
+ /**
38
+ * Subscribe to metadata events
39
+ * Returns an unsubscribe function
40
+ */
41
+ subscribeMetadata(type: string, callback: (event: MetadataEvent) => void, options?: {
42
+ packageId?: string;
43
+ }): () => void;
44
+ /**
45
+ * Subscribe to data record events
46
+ * Returns an unsubscribe function
47
+ */
48
+ subscribeData(object: string, callback: (event: DataEvent) => void, options?: {
49
+ recordId?: string;
50
+ }): () => void;
51
+ /**
52
+ * Emit an event to all matching subscriptions (client-side only)
53
+ * This is used for in-process event delivery
54
+ */
55
+ private emitEvent;
56
+ /**
57
+ * Start polling for events (fallback mechanism)
58
+ * In production, this would be replaced with WebSocket/SSE
59
+ */
60
+ private startPolling;
61
+ /**
62
+ * Stop polling for events
63
+ */
64
+ private stopPolling;
65
+ /**
66
+ * Internal method to buffer events from server
67
+ * This would be called by WebSocket/SSE handlers in production
68
+ */
69
+ _bufferEvent(event: RealtimeEventPayload): void;
70
+ /**
71
+ * Disconnect and clean up all subscriptions
72
+ */
73
+ disconnect(): void;
74
+ }
5
75
 
6
76
  /**
7
77
  * Type-Safe Query Builder
@@ -299,6 +369,7 @@ declare class ObjectStackClient {
299
369
  private fetchImpl;
300
370
  private discoveryInfo?;
301
371
  private logger;
372
+ private realtimeAPI;
302
373
  constructor(config: ClientConfig);
303
374
  /**
304
375
  * Initialize the client by discovering server capabilities.
@@ -497,6 +568,11 @@ declare class ObjectStackClient {
497
568
  * Authentication Services
498
569
  */
499
570
  auth: {
571
+ /**
572
+ * Get authentication configuration
573
+ * Returns available auth providers and features
574
+ */
575
+ getConfig: () => Promise<unknown>;
500
576
  /**
501
577
  * Login with email and password
502
578
  * Uses better-auth endpoint: POST /sign-in/email
@@ -614,6 +690,11 @@ declare class ObjectStackClient {
614
690
  get: (flowName: string, runId: string) => Promise<any>;
615
691
  };
616
692
  };
693
+ /**
694
+ * Event Subscription API
695
+ * Provides real-time event subscriptions for metadata and data changes
696
+ */
697
+ get events(): RealtimeAPI;
617
698
  /**
618
699
  * Permissions Services
619
700
  */
@@ -938,4 +1019,4 @@ declare class ObjectStackClient {
938
1019
  private getRoute;
939
1020
  }
940
1021
 
941
- export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, type StandardError, type UpdateDataResult, createFilter, createQuery };
1022
+ export { type ApiRouteType, type ClientConfig, type CreateDataResult, type DeleteDataResult, type DiscoveryResult, FilterBuilder, type GetDataResult, ObjectStackClient, type PaginatedResult, QueryBuilder, type QueryOptions, type QueryOptionsV2, RealtimeAPI, type RealtimeEventHandler, type RealtimeSubscriptionFilter, type StandardError, type UpdateDataResult, createFilter, createQuery };
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ __export(index_exports, {
23
23
  FilterBuilder: () => FilterBuilder,
24
24
  ObjectStackClient: () => ObjectStackClient,
25
25
  QueryBuilder: () => QueryBuilder,
26
+ RealtimeAPI: () => RealtimeAPI,
26
27
  createFilter: () => createFilter,
27
28
  createQuery: () => createQuery
28
29
  });
@@ -30,6 +31,135 @@ module.exports = __toCommonJS(index_exports);
30
31
  var import_data = require("@objectstack/spec/data");
31
32
  var import_core = require("@objectstack/core");
32
33
 
34
+ // src/realtime-api.ts
35
+ var RealtimeAPI = class {
36
+ constructor(baseUrl, token) {
37
+ this.subscriptions = /* @__PURE__ */ new Map();
38
+ this.eventBuffer = [];
39
+ this._baseUrl = baseUrl;
40
+ this._token = token;
41
+ }
42
+ /**
43
+ * Subscribe to metadata events
44
+ * Returns an unsubscribe function
45
+ */
46
+ subscribeMetadata(type, callback, options) {
47
+ const subscriptionId = `metadata-${type}-${Date.now()}`;
48
+ this.subscriptions.set(subscriptionId, {
49
+ filter: {
50
+ type,
51
+ packageId: options?.packageId,
52
+ eventTypes: [
53
+ `metadata.${type}.created`,
54
+ `metadata.${type}.updated`,
55
+ `metadata.${type}.deleted`
56
+ ]
57
+ },
58
+ handler: (event) => {
59
+ if (event.type.startsWith("metadata.")) {
60
+ callback(event);
61
+ }
62
+ }
63
+ });
64
+ this.startPolling();
65
+ return () => {
66
+ this.subscriptions.delete(subscriptionId);
67
+ if (this.subscriptions.size === 0) {
68
+ this.stopPolling();
69
+ }
70
+ };
71
+ }
72
+ /**
73
+ * Subscribe to data record events
74
+ * Returns an unsubscribe function
75
+ */
76
+ subscribeData(object, callback, options) {
77
+ const subscriptionId = `data-${object}-${Date.now()}`;
78
+ this.subscriptions.set(subscriptionId, {
79
+ filter: {
80
+ type: object,
81
+ recordId: options?.recordId,
82
+ eventTypes: [
83
+ "data.record.created",
84
+ "data.record.updated",
85
+ "data.record.deleted"
86
+ ]
87
+ },
88
+ handler: (event) => {
89
+ if (event.type.startsWith("data.") && event.object === object) {
90
+ if (!options?.recordId || event.payload?.recordId === options.recordId) {
91
+ callback(event);
92
+ }
93
+ }
94
+ }
95
+ });
96
+ this.startPolling();
97
+ return () => {
98
+ this.subscriptions.delete(subscriptionId);
99
+ if (this.subscriptions.size === 0) {
100
+ this.stopPolling();
101
+ }
102
+ };
103
+ }
104
+ /**
105
+ * Emit an event to all matching subscriptions (client-side only)
106
+ * This is used for in-process event delivery
107
+ */
108
+ emitEvent(event) {
109
+ for (const sub of this.subscriptions.values()) {
110
+ const matchesType = !sub.filter.type || event.type.includes(sub.filter.type) || event.object === sub.filter.type;
111
+ const matchesEventType = !sub.filter.eventTypes?.length || sub.filter.eventTypes.includes(event.type);
112
+ const matchesPackage = !sub.filter.packageId || event.payload?.packageId === sub.filter.packageId;
113
+ if (matchesType && matchesEventType && matchesPackage) {
114
+ try {
115
+ sub.handler(event);
116
+ } catch (error) {
117
+ console.error("Error in realtime event handler:", error);
118
+ }
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * Start polling for events (fallback mechanism)
124
+ * In production, this would be replaced with WebSocket/SSE
125
+ */
126
+ startPolling() {
127
+ if (this.pollInterval) return;
128
+ this.pollInterval = setInterval(() => {
129
+ while (this.eventBuffer.length > 0) {
130
+ const event = this.eventBuffer.shift();
131
+ if (event) {
132
+ this.emitEvent(event);
133
+ }
134
+ }
135
+ }, 2e3);
136
+ }
137
+ /**
138
+ * Stop polling for events
139
+ */
140
+ stopPolling() {
141
+ if (this.pollInterval) {
142
+ clearInterval(this.pollInterval);
143
+ this.pollInterval = void 0;
144
+ }
145
+ }
146
+ /**
147
+ * Internal method to buffer events from server
148
+ * This would be called by WebSocket/SSE handlers in production
149
+ */
150
+ _bufferEvent(event) {
151
+ this.eventBuffer.push(event);
152
+ }
153
+ /**
154
+ * Disconnect and clean up all subscriptions
155
+ */
156
+ disconnect() {
157
+ this.stopPolling();
158
+ this.subscriptions.clear();
159
+ this.eventBuffer = [];
160
+ }
161
+ };
162
+
33
163
  // src/query-builder.ts
34
164
  var FilterBuilder = class {
35
165
  constructor() {
@@ -534,6 +664,15 @@ var ObjectStackClient = class {
534
664
  * Authentication Services
535
665
  */
536
666
  this.auth = {
667
+ /**
668
+ * Get authentication configuration
669
+ * Returns available auth providers and features
670
+ */
671
+ getConfig: async () => {
672
+ const route = this.getRoute("auth");
673
+ const res = await this.fetch(`${this.baseUrl}${route}/config`);
674
+ return this.unwrapResponse(res);
675
+ },
537
676
  /**
538
677
  * Login with email and password
539
678
  * Uses better-auth endpoint: POST /sign-in/email
@@ -1500,6 +1639,7 @@ var ObjectStackClient = class {
1500
1639
  level: config.debug ? "debug" : "info",
1501
1640
  format: "pretty"
1502
1641
  });
1642
+ this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);
1503
1643
  this.logger.debug("ObjectStack client created", { baseUrl: this.baseUrl });
1504
1644
  }
1505
1645
  /**
@@ -1510,6 +1650,18 @@ var ObjectStackClient = class {
1510
1650
  try {
1511
1651
  let data;
1512
1652
  try {
1653
+ const discoveryUrl = `${this.baseUrl}/api/v1/discovery`;
1654
+ this.logger.debug("Probing protocol-standard discovery endpoint", { url: discoveryUrl });
1655
+ const res = await this.fetchImpl(discoveryUrl);
1656
+ if (res.ok) {
1657
+ const body = await res.json();
1658
+ data = body.data || body;
1659
+ this.logger.debug("Discovered via /api/v1/discovery");
1660
+ }
1661
+ } catch (e) {
1662
+ this.logger.debug("Protocol-standard discovery probe failed", { error: e.message });
1663
+ }
1664
+ if (!data) {
1513
1665
  let wellKnownUrl;
1514
1666
  try {
1515
1667
  const url = new URL(this.baseUrl);
@@ -1517,22 +1669,10 @@ var ObjectStackClient = class {
1517
1669
  } catch {
1518
1670
  wellKnownUrl = "/.well-known/objectstack";
1519
1671
  }
1520
- this.logger.debug("Probing .well-known discovery", { url: wellKnownUrl });
1672
+ this.logger.debug("Falling back to .well-known discovery", { url: wellKnownUrl });
1521
1673
  const res = await this.fetchImpl(wellKnownUrl);
1522
- if (res.ok) {
1523
- const body = await res.json();
1524
- data = body.data || body;
1525
- this.logger.debug("Discovered via .well-known");
1526
- }
1527
- } catch (e) {
1528
- this.logger.debug("Standard discovery probe failed", { error: e.message });
1529
- }
1530
- if (!data) {
1531
- const fallbackUrl = `${this.baseUrl}/api/v1/discovery`;
1532
- this.logger.debug("Falling back to standard discovery endpoint", { url: fallbackUrl });
1533
- const res = await this.fetchImpl(fallbackUrl);
1534
1674
  if (!res.ok) {
1535
- throw new Error(`Failed to connect to ${fallbackUrl}: ${res.statusText}`);
1675
+ throw new Error(`Failed to connect to ${wellKnownUrl}: ${res.statusText}`);
1536
1676
  }
1537
1677
  const body = await res.json();
1538
1678
  data = body.data || body;
@@ -1570,6 +1710,13 @@ var ObjectStackClient = class {
1570
1710
  }
1571
1711
  return result;
1572
1712
  }
1713
+ /**
1714
+ * Event Subscription API
1715
+ * Provides real-time event subscriptions for metadata and data changes
1716
+ */
1717
+ get events() {
1718
+ return this.realtimeAPI;
1719
+ }
1573
1720
  /**
1574
1721
  * Private Helpers
1575
1722
  */
@@ -1674,6 +1821,7 @@ var ObjectStackClient = class {
1674
1821
  FilterBuilder,
1675
1822
  ObjectStackClient,
1676
1823
  QueryBuilder,
1824
+ RealtimeAPI,
1677
1825
  createFilter,
1678
1826
  createQuery
1679
1827
  });