@objectstack/client 4.0.2 → 4.0.3

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.3 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.24 KB
14
+ ESM dist/index.mjs.map 118.84 KB
15
+ ESM ⚡️ Build success in 28ms
16
+ CJS dist/index.js 59.44 KB
17
+ CJS dist/index.js.map 118.90 KB
18
+ CJS ⚡️ Build success in 28ms
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 2598ms
21
+ DTS dist/index.d.mts 36.26 KB
22
+ DTS dist/index.d.ts 36.26 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @objectstack/client
2
2
 
3
+ ## 4.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - @objectstack/spec@4.0.3
8
+ - @objectstack/core@4.0.3
9
+
3
10
  ## 4.0.2
4
11
 
5
12
  ### 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';
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
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';
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.
@@ -614,6 +685,11 @@ declare class ObjectStackClient {
614
685
  get: (flowName: string, runId: string) => Promise<any>;
615
686
  };
616
687
  };
688
+ /**
689
+ * Event Subscription API
690
+ * Provides real-time event subscriptions for metadata and data changes
691
+ */
692
+ get events(): RealtimeAPI;
617
693
  /**
618
694
  * Permissions Services
619
695
  */
@@ -938,4 +1014,4 @@ declare class ObjectStackClient {
938
1014
  private getRoute;
939
1015
  }
940
1016
 
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 };
1017
+ 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';
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
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';
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.
@@ -614,6 +685,11 @@ declare class ObjectStackClient {
614
685
  get: (flowName: string, runId: string) => Promise<any>;
615
686
  };
616
687
  };
688
+ /**
689
+ * Event Subscription API
690
+ * Provides real-time event subscriptions for metadata and data changes
691
+ */
692
+ get events(): RealtimeAPI;
617
693
  /**
618
694
  * Permissions Services
619
695
  */
@@ -938,4 +1014,4 @@ declare class ObjectStackClient {
938
1014
  private getRoute;
939
1015
  }
940
1016
 
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 };
1017
+ 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() {
@@ -1500,6 +1630,7 @@ var ObjectStackClient = class {
1500
1630
  level: config.debug ? "debug" : "info",
1501
1631
  format: "pretty"
1502
1632
  });
1633
+ this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);
1503
1634
  this.logger.debug("ObjectStack client created", { baseUrl: this.baseUrl });
1504
1635
  }
1505
1636
  /**
@@ -1570,6 +1701,13 @@ var ObjectStackClient = class {
1570
1701
  }
1571
1702
  return result;
1572
1703
  }
1704
+ /**
1705
+ * Event Subscription API
1706
+ * Provides real-time event subscriptions for metadata and data changes
1707
+ */
1708
+ get events() {
1709
+ return this.realtimeAPI;
1710
+ }
1573
1711
  /**
1574
1712
  * Private Helpers
1575
1713
  */
@@ -1674,6 +1812,7 @@ var ObjectStackClient = class {
1674
1812
  FilterBuilder,
1675
1813
  ObjectStackClient,
1676
1814
  QueryBuilder,
1815
+ RealtimeAPI,
1677
1816
  createFilter,
1678
1817
  createQuery
1679
1818
  });