@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.
- package/.turbo/turbo-build.log +10 -10
- package/CHANGELOG.md +15 -0
- package/dist/index.d.mts +84 -3
- package/dist/index.d.ts +84 -3
- package/dist/index.js +162 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +161 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -12
- package/src/client.hono.test.ts +11 -3
- package/src/index.ts +58 -28
- package/src/realtime-api.ts +208 -0
- package/tests/integration/01-discovery.test.ts +5 -5
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @objectstack/client@4.0.
|
|
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
|
[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.57 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m119.43 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 33ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m59.78 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m119.48 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 33ms
|
|
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 3330ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m36.51 KB[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m36.51 KB[39m
|
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("
|
|
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 ${
|
|
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
|
});
|