@objectstack/client 4.0.1 → 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 +11 -11
- package/CHANGELOG.md +16 -0
- package/dist/index.d.mts +95 -9
- package/dist/index.d.ts +95 -9
- package/dist/index.js +159 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +158 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -12
- package/src/client.test.ts +4 -12
- package/src/index.ts +43 -23
- package/src/realtime-api.ts +208 -0
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
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
|
|
6
6
|
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
7
|
[34mCLI[39m tsup v8.5.1
|
|
8
|
-
[34mCLI[39m Using tsup config: /home/runner/work/
|
|
8
|
+
[34mCLI[39m Using tsup config: /home/runner/work/framework/framework/tsup.config.ts
|
|
9
9
|
[34mCLI[39m Target: es2020
|
|
10
10
|
[34mCLI[39m Cleaning output folder
|
|
11
11
|
[34mESM[39m Build start
|
|
12
12
|
[34mCJS[39m Build start
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
18
|
-
[
|
|
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
|
@@ -1,5 +1,21 @@
|
|
|
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
|
+
|
|
10
|
+
## 4.0.2
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 5f659e9: fix ai
|
|
15
|
+
- Updated dependencies [5f659e9]
|
|
16
|
+
- @objectstack/spec@4.0.2
|
|
17
|
+
- @objectstack/core@4.0.2
|
|
18
|
+
|
|
3
19
|
## 4.0.0
|
|
4
20
|
|
|
5
21
|
### Minor 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,
|
|
3
|
-
export { AddReactionResponse,
|
|
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, 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.
|
|
@@ -332,7 +403,8 @@ declare class ObjectStackClient {
|
|
|
332
403
|
} | undefined;
|
|
333
404
|
services?: Record<string, {
|
|
334
405
|
enabled: boolean;
|
|
335
|
-
status: "degraded" | "stub" | "available" | "unavailable";
|
|
406
|
+
status: "degraded" | "stub" | "available" | "registered" | "unavailable";
|
|
407
|
+
handlerReady?: boolean | undefined;
|
|
336
408
|
route?: string | undefined;
|
|
337
409
|
provider?: string | undefined;
|
|
338
410
|
version?: string | undefined;
|
|
@@ -388,8 +460,11 @@ declare class ObjectStackClient {
|
|
|
388
460
|
* Get a specific metadata item by type and name
|
|
389
461
|
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
390
462
|
* @param name - Item name (snake_case identifier)
|
|
463
|
+
* @param options - Optional filters (e.g., packageId to scope by package)
|
|
391
464
|
*/
|
|
392
|
-
getItem: (type: string, name: string
|
|
465
|
+
getItem: (type: string, name: string, options?: {
|
|
466
|
+
packageId?: string;
|
|
467
|
+
}) => Promise<unknown>;
|
|
393
468
|
/**
|
|
394
469
|
* Save a metadata item
|
|
395
470
|
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
@@ -397,6 +472,16 @@ declare class ObjectStackClient {
|
|
|
397
472
|
* @param item - The metadata content to save
|
|
398
473
|
*/
|
|
399
474
|
saveItem: (type: string, name: string, item: any) => Promise<unknown>;
|
|
475
|
+
/**
|
|
476
|
+
* Delete a metadata item
|
|
477
|
+
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
478
|
+
* @param name - Item name (snake_case identifier)
|
|
479
|
+
*/
|
|
480
|
+
deleteItem: (type: string, name: string) => Promise<{
|
|
481
|
+
type: string;
|
|
482
|
+
name: string;
|
|
483
|
+
deleted: boolean;
|
|
484
|
+
}>;
|
|
400
485
|
/**
|
|
401
486
|
* Get object metadata with cache support
|
|
402
487
|
* Supports ETag-based conditional requests for efficient caching
|
|
@@ -600,6 +685,11 @@ declare class ObjectStackClient {
|
|
|
600
685
|
get: (flowName: string, runId: string) => Promise<any>;
|
|
601
686
|
};
|
|
602
687
|
};
|
|
688
|
+
/**
|
|
689
|
+
* Event Subscription API
|
|
690
|
+
* Provides real-time event subscriptions for metadata and data changes
|
|
691
|
+
*/
|
|
692
|
+
get events(): RealtimeAPI;
|
|
603
693
|
/**
|
|
604
694
|
* Permissions Services
|
|
605
695
|
*/
|
|
@@ -742,10 +832,6 @@ declare class ObjectStackClient {
|
|
|
742
832
|
* Natural language query — converts natural language to structured query
|
|
743
833
|
*/
|
|
744
834
|
nlq: (request: AiNlqRequest) => Promise<AiNlqResponse>;
|
|
745
|
-
/**
|
|
746
|
-
* Multi-turn AI chat
|
|
747
|
-
*/
|
|
748
|
-
chat: (request: AiChatRequest) => Promise<AiChatResponse>;
|
|
749
835
|
/**
|
|
750
836
|
* AI-powered field value suggestions
|
|
751
837
|
*/
|
|
@@ -928,4 +1014,4 @@ declare class ObjectStackClient {
|
|
|
928
1014
|
private getRoute;
|
|
929
1015
|
}
|
|
930
1016
|
|
|
931
|
-
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,
|
|
3
|
-
export { AddReactionResponse,
|
|
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, 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.
|
|
@@ -332,7 +403,8 @@ declare class ObjectStackClient {
|
|
|
332
403
|
} | undefined;
|
|
333
404
|
services?: Record<string, {
|
|
334
405
|
enabled: boolean;
|
|
335
|
-
status: "degraded" | "stub" | "available" | "unavailable";
|
|
406
|
+
status: "degraded" | "stub" | "available" | "registered" | "unavailable";
|
|
407
|
+
handlerReady?: boolean | undefined;
|
|
336
408
|
route?: string | undefined;
|
|
337
409
|
provider?: string | undefined;
|
|
338
410
|
version?: string | undefined;
|
|
@@ -388,8 +460,11 @@ declare class ObjectStackClient {
|
|
|
388
460
|
* Get a specific metadata item by type and name
|
|
389
461
|
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
390
462
|
* @param name - Item name (snake_case identifier)
|
|
463
|
+
* @param options - Optional filters (e.g., packageId to scope by package)
|
|
391
464
|
*/
|
|
392
|
-
getItem: (type: string, name: string
|
|
465
|
+
getItem: (type: string, name: string, options?: {
|
|
466
|
+
packageId?: string;
|
|
467
|
+
}) => Promise<unknown>;
|
|
393
468
|
/**
|
|
394
469
|
* Save a metadata item
|
|
395
470
|
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
@@ -397,6 +472,16 @@ declare class ObjectStackClient {
|
|
|
397
472
|
* @param item - The metadata content to save
|
|
398
473
|
*/
|
|
399
474
|
saveItem: (type: string, name: string, item: any) => Promise<unknown>;
|
|
475
|
+
/**
|
|
476
|
+
* Delete a metadata item
|
|
477
|
+
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
478
|
+
* @param name - Item name (snake_case identifier)
|
|
479
|
+
*/
|
|
480
|
+
deleteItem: (type: string, name: string) => Promise<{
|
|
481
|
+
type: string;
|
|
482
|
+
name: string;
|
|
483
|
+
deleted: boolean;
|
|
484
|
+
}>;
|
|
400
485
|
/**
|
|
401
486
|
* Get object metadata with cache support
|
|
402
487
|
* Supports ETag-based conditional requests for efficient caching
|
|
@@ -600,6 +685,11 @@ declare class ObjectStackClient {
|
|
|
600
685
|
get: (flowName: string, runId: string) => Promise<any>;
|
|
601
686
|
};
|
|
602
687
|
};
|
|
688
|
+
/**
|
|
689
|
+
* Event Subscription API
|
|
690
|
+
* Provides real-time event subscriptions for metadata and data changes
|
|
691
|
+
*/
|
|
692
|
+
get events(): RealtimeAPI;
|
|
603
693
|
/**
|
|
604
694
|
* Permissions Services
|
|
605
695
|
*/
|
|
@@ -742,10 +832,6 @@ declare class ObjectStackClient {
|
|
|
742
832
|
* Natural language query — converts natural language to structured query
|
|
743
833
|
*/
|
|
744
834
|
nlq: (request: AiNlqRequest) => Promise<AiNlqResponse>;
|
|
745
|
-
/**
|
|
746
|
-
* Multi-turn AI chat
|
|
747
|
-
*/
|
|
748
|
-
chat: (request: AiChatRequest) => Promise<AiChatResponse>;
|
|
749
835
|
/**
|
|
750
836
|
* AI-powered field value suggestions
|
|
751
837
|
*/
|
|
@@ -928,4 +1014,4 @@ declare class ObjectStackClient {
|
|
|
928
1014
|
private getRoute;
|
|
929
1015
|
}
|
|
930
1016
|
|
|
931
|
-
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() {
|
|
@@ -338,10 +468,15 @@ var ObjectStackClient = class {
|
|
|
338
468
|
* Get a specific metadata item by type and name
|
|
339
469
|
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
340
470
|
* @param name - Item name (snake_case identifier)
|
|
471
|
+
* @param options - Optional filters (e.g., packageId to scope by package)
|
|
341
472
|
*/
|
|
342
|
-
getItem: async (type, name) => {
|
|
473
|
+
getItem: async (type, name, options) => {
|
|
343
474
|
const route = this.getRoute("metadata");
|
|
344
|
-
const
|
|
475
|
+
const params = new URLSearchParams();
|
|
476
|
+
if (options?.packageId) params.set("package", options.packageId);
|
|
477
|
+
const qs = params.toString();
|
|
478
|
+
const url = `${this.baseUrl}${route}/${type}/${name}${qs ? `?${qs}` : ""}`;
|
|
479
|
+
const res = await this.fetch(url);
|
|
345
480
|
return this.unwrapResponse(res);
|
|
346
481
|
},
|
|
347
482
|
/**
|
|
@@ -358,6 +493,18 @@ var ObjectStackClient = class {
|
|
|
358
493
|
});
|
|
359
494
|
return this.unwrapResponse(res);
|
|
360
495
|
},
|
|
496
|
+
/**
|
|
497
|
+
* Delete a metadata item
|
|
498
|
+
* @param type - Metadata type (e.g., 'object', 'plugin')
|
|
499
|
+
* @param name - Item name (snake_case identifier)
|
|
500
|
+
*/
|
|
501
|
+
deleteItem: async (type, name) => {
|
|
502
|
+
const route = this.getRoute("metadata");
|
|
503
|
+
const res = await this.fetch(`${this.baseUrl}${route}/${encodeURIComponent(type)}/${encodeURIComponent(name)}`, {
|
|
504
|
+
method: "DELETE"
|
|
505
|
+
});
|
|
506
|
+
return this.unwrapResponse(res);
|
|
507
|
+
},
|
|
361
508
|
/**
|
|
362
509
|
* Get object metadata with cache support
|
|
363
510
|
* Supports ETag-based conditional requests for efficient caching
|
|
@@ -1101,17 +1248,7 @@ var ObjectStackClient = class {
|
|
|
1101
1248
|
});
|
|
1102
1249
|
return this.unwrapResponse(res);
|
|
1103
1250
|
},
|
|
1104
|
-
|
|
1105
|
-
* Multi-turn AI chat
|
|
1106
|
-
*/
|
|
1107
|
-
chat: async (request) => {
|
|
1108
|
-
const route = this.getRoute("ai");
|
|
1109
|
-
const res = await this.fetch(`${this.baseUrl}${route}/chat`, {
|
|
1110
|
-
method: "POST",
|
|
1111
|
-
body: JSON.stringify(request)
|
|
1112
|
-
});
|
|
1113
|
-
return this.unwrapResponse(res);
|
|
1114
|
-
},
|
|
1251
|
+
// AI chat method removed — use Vercel AI SDK `useChat()` / `@ai-sdk/react` directly.
|
|
1115
1252
|
/**
|
|
1116
1253
|
* AI-powered field value suggestions
|
|
1117
1254
|
*/
|
|
@@ -1493,6 +1630,7 @@ var ObjectStackClient = class {
|
|
|
1493
1630
|
level: config.debug ? "debug" : "info",
|
|
1494
1631
|
format: "pretty"
|
|
1495
1632
|
});
|
|
1633
|
+
this.realtimeAPI = new RealtimeAPI(this.baseUrl, this.token);
|
|
1496
1634
|
this.logger.debug("ObjectStack client created", { baseUrl: this.baseUrl });
|
|
1497
1635
|
}
|
|
1498
1636
|
/**
|
|
@@ -1563,6 +1701,13 @@ var ObjectStackClient = class {
|
|
|
1563
1701
|
}
|
|
1564
1702
|
return result;
|
|
1565
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
|
+
}
|
|
1566
1711
|
/**
|
|
1567
1712
|
* Private Helpers
|
|
1568
1713
|
*/
|
|
@@ -1667,6 +1812,7 @@ var ObjectStackClient = class {
|
|
|
1667
1812
|
FilterBuilder,
|
|
1668
1813
|
ObjectStackClient,
|
|
1669
1814
|
QueryBuilder,
|
|
1815
|
+
RealtimeAPI,
|
|
1670
1816
|
createFilter,
|
|
1671
1817
|
createQuery
|
|
1672
1818
|
});
|