@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.
- package/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +7 -0
- package/dist/index.d.mts +78 -2
- package/dist/index.d.ts +78 -2
- package/dist/index.js +139 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +138 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -12
- package/src/index.ts +22 -6
- package/src/realtime-api.ts +208 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/client@4.0.
|
|
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
|
[34mCLI[39m Building entry: src/index.ts
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[32mESM[39m [1mdist/index.mjs [22m[
|
|
14
|
-
[32mESM[39m [1mdist/index.mjs.map [22m[
|
|
15
|
-
[32mESM[39m ⚡️ Build success in
|
|
16
|
-
[32mCJS[39m [1mdist/index.js [22m[
|
|
17
|
-
[32mCJS[39m [1mdist/index.js.map [22m[
|
|
18
|
-
[32mCJS[39m ⚡️ Build success in
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m58.24 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m118.84 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 28ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m59.44 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m118.90 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 28ms
|
|
19
19
|
[34mDTS[39m Build start
|
|
20
|
-
[32mDTS[39m ⚡️ Build success in
|
|
21
|
-
[32mDTS[39m [1mdist/index.d.mts [22m[
|
|
22
|
-
[32mDTS[39m [1mdist/index.d.ts [22m[
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 2598ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m36.26 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m36.26 KB[39m
|
package/CHANGELOG.md
CHANGED
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
|
});
|