durable-actors-observer 0.1.0 → 0.4.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/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # Durable Actors Observer
2
+
3
+ React 19 components for embedding Durable Actors observability in a hosted app.
4
+
5
+ ```tsx
6
+ import { HttpObserverClient, Overview, WebSocketObserver } from "durable-actors-observer"
7
+ import "durable-actors-observer/styles.css"
8
+ import "durable-actors-observer/theme.css"
9
+
10
+ const projectId = "my-project"
11
+ const client = new HttpObserverClient(`/api/projects/${encodeURIComponent(projectId)}/observe`)
12
+
13
+ export function Observability() {
14
+ return (
15
+ <>
16
+ <Overview client={client} onSelectActor={actorName => console.log(actorName)} />
17
+ <WebSocketObserver client={client} />
18
+ </>
19
+ )
20
+ }
21
+ ```
22
+
23
+ Import `styles.css` once. The optional `theme.css` supplies light and dark theme tokens; omit it when the host supplies those tokens. Apply the `dark` class to an ancestor for dark mode.
24
+
25
+ The package exports `ActorObserver`, `RequestObserver`, `Overview`, `WebSocketObserver`, `ConsoleApp`, `SocketTimeline`, `TimeRangePicker`, and `FilterCombobox`, along with their named props types. It also exports the shared badge, button, calendar, command, input, popover, sheet, and table components from the package root. Use React's `ComponentProps<typeof Button>` (and equivalent) for primitive props.
26
+
27
+ Pass your own `ObserverClient` to connect these views to a hosted backend, or configure `HttpObserverClient` with your API prefix and fetch implementation. React remains a peer dependency. `ConsoleApp` provides the complete navigation shell and requires a `toggleTheme` callback; individual views can be placed inside your own navigation.
28
+
29
+ Control-plane endpoints require a project in the path: `/v1/projects/{project_id}/observe/...`. The hosted backend should authorize access to that project and proxy the routes using its server-side admin credential. The CLI's `/api/observe` proxy uses its configured `DURABLE_ACTORS_PROJECT_ID`. Request traces include a required `projectId`; older stored traces without one are excluded from project results.
30
+
31
+ The observer version follows the SDK and runtime version. Run `pnpm release:prepare <version>` at the repository root before publishing a GitHub release. Release preflight checks all versions, and the workflow publishes the observer before the SDK. The SDK's `workspace:*` dependency becomes the exact observer version when packed.
32
+
33
+ The localhost-only `durable-actors dev` runtime allows observability requests without a secret, even when a secret is configured for application routes. Hosted runtimes retain their configured admin authentication.
@@ -1,5 +1,6 @@
1
1
  import type { ObserverClient } from "./client.js";
2
- export declare function ConsoleApp({ client, toggleTheme }: {
2
+ export interface ConsoleAppProps {
3
3
  client: ObserverClient;
4
4
  toggleTheme: () => void;
5
- }): import("react").JSX.Element;
5
+ }
6
+ export declare function ConsoleApp({ client, toggleTheme }: ConsoleAppProps): import("react").JSX.Element;
@@ -3,7 +3,7 @@ export interface FilterSuggestion {
3
3
  value: string;
4
4
  hint?: string;
5
5
  }
6
- interface FilterComboboxProps {
6
+ export interface FilterComboboxProps {
7
7
  label: string;
8
8
  placeholder: string;
9
9
  value: string;
@@ -13,4 +13,3 @@ interface FilterComboboxProps {
13
13
  }
14
14
  export declare function FilterCombobox({ label, placeholder, value, onChange, suggestions, limit }: FilterComboboxProps): import("react").JSX.Element;
15
15
  export declare function matchSuggestions(suggestions: FilterSuggestion[], value: string, limit: number): FilterSuggestion[];
16
- export {};
@@ -1,10 +1,9 @@
1
1
  import type { ObserverClient } from "./client.js";
2
2
  import type { TimeRange } from "./time-range.js";
3
- interface OverviewProps {
3
+ export interface OverviewProps {
4
4
  client: ObserverClient;
5
5
  onSelectActor: (actorName: string) => void;
6
6
  timeRange?: TimeRange;
7
7
  onTimeRangeChange?: (range: TimeRange) => void;
8
8
  }
9
9
  export declare function Overview({ client, onSelectActor, timeRange, onTimeRangeChange }: OverviewProps): import("react").JSX.Element;
10
- export {};
@@ -1,7 +1,7 @@
1
1
  import type { ObserverClient, RequestTrace } from "./client.js";
2
2
  import type { TimeRange } from "./time-range.js";
3
3
  interface RequestObserverProps {
4
- client: Pick<ObserverClient, "watchRequests" | "query">;
4
+ client: Pick<ObserverClient, "watchRequests" | "listRequests">;
5
5
  actor?: Pick<RequestTrace, "actorName" | "actorId">;
6
6
  timeRange?: TimeRange;
7
7
  onTimeRangeChange?: (range: TimeRange) => void;
@@ -1,5 +1,5 @@
1
1
  import type { SocketSession } from "./socket-sessions.js";
2
- interface SocketTimelineProps {
2
+ export interface SocketTimelineProps {
3
3
  sessions: SocketSession[];
4
4
  start: number;
5
5
  end: number;
@@ -1,5 +1,5 @@
1
1
  import type { TimeRange } from "./time-range.js";
2
- interface TimeRangePickerProps {
2
+ export interface TimeRangePickerProps {
3
3
  value: TimeRange;
4
4
  onChange: (range: TimeRange) => void;
5
5
  allowAll?: boolean;
@@ -7,4 +7,3 @@ interface TimeRangePickerProps {
7
7
  align?: "start" | "end";
8
8
  }
9
9
  export declare function TimeRangePicker({ value, onChange, allowAll, className, align }: TimeRangePickerProps): import("react").JSX.Element;
10
- export {};
@@ -1,10 +1,9 @@
1
1
  import type { ObserverClient } from "./client.js";
2
2
  import type { TimeRange } from "./time-range.js";
3
- interface WebSocketObserverProps {
3
+ export interface WebSocketObserverProps {
4
4
  client: ObserverClient;
5
5
  onSelectActor?: (actorName: string) => void;
6
6
  timeRange?: TimeRange;
7
7
  onTimeRangeChange?: (range: TimeRange) => void;
8
8
  }
9
9
  export declare function WebSocketObserver({ client, onSelectActor, timeRange, onTimeRangeChange }: WebSocketObserverProps): import("react").JSX.Element;
10
- export {};
package/dist/client.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ import { type OverviewMetrics } from "./overview-metrics.js";
2
+ import { type QueueWaitRow } from "./queue-wait.js";
3
+ import { type SocketSessionRow } from "./socket-sessions.js";
4
+ import type { ResolvedRange } from "./time-range.js";
1
5
  type ActorResidency = "live" | "dormant" | "unknown";
2
6
  interface ActorInstance {
3
7
  actorId: string;
@@ -22,7 +26,12 @@ interface ActorInventory {
22
26
  }[];
23
27
  }
24
28
  interface ObserverClient {
25
- query?(query: ObserverQuery, signal?: AbortSignal): Promise<ObserverQueryResult>;
29
+ getMetrics?(range: ResolvedRange, signal?: AbortSignal): Promise<OverviewMetrics>;
30
+ listQueueWaits?(query: ResolvedRange & {
31
+ actorName?: string;
32
+ }, signal?: AbortSignal): Promise<QueueWaitRow[]>;
33
+ listWebSockets?(range: ResolvedRange, signal?: AbortSignal): Promise<SocketSessionRow[]>;
34
+ listRequests?(query: RequestHistoryQuery, signal?: AbortSignal): Promise<RequestTracePage>;
26
35
  watchRequests?(onPage: (page: RequestTracePage) => void, signal: AbortSignal, after?: string): Promise<void>;
27
36
  watchActors?(onInventory: (inventory: ActorInventory) => void, signal: AbortSignal): Promise<void>;
28
37
  listActors(signal?: AbortSignal): Promise<ActorInventory>;
@@ -32,10 +41,15 @@ declare class HttpObserverClient implements ObserverClient {
32
41
  private readonly baseUrl;
33
42
  private readonly request;
34
43
  constructor(baseUrl?: string, request?: typeof fetch);
44
+ getMetrics(range: ResolvedRange, signal?: AbortSignal): Promise<OverviewMetrics>;
45
+ listQueueWaits(query: ResolvedRange & {
46
+ actorName?: string;
47
+ }, signal?: AbortSignal): Promise<QueueWaitRow[]>;
48
+ listWebSockets(range: ResolvedRange, signal?: AbortSignal): Promise<SocketSessionRow[]>;
35
49
  listActors(signal?: AbortSignal): Promise<ActorInventory>;
36
50
  watchActors(onInventory: (inventory: ActorInventory) => void, signal: AbortSignal): Promise<void>;
37
51
  watchRequests(onPage: (page: RequestTracePage) => void, signal: AbortSignal, after?: string): Promise<void>;
38
- query(query: ObserverQuery, signal?: AbortSignal): Promise<ObserverQueryResult>;
52
+ listRequests(query: RequestHistoryQuery, signal?: AbortSignal): Promise<RequestTracePage>;
39
53
  private watch;
40
54
  checkConnection(signal?: AbortSignal): Promise<void>;
41
55
  private get;
@@ -43,6 +57,8 @@ declare class HttpObserverClient implements ObserverClient {
43
57
  export { HttpObserverClient };
44
58
  export type { ActorConnection, ActorInstance, ActorInventory, ActorResidency, ObserverClient };
45
59
  export interface RequestTrace {
60
+ projectId: string;
61
+ metadata?: unknown;
46
62
  eventId?: string;
47
63
  sequence: number;
48
64
  requestId: string;
@@ -58,14 +74,14 @@ export interface RequestTrace {
58
74
  queueWaitMs: number | null;
59
75
  outcome: "completed" | "failed" | "rejected" | "rerouted" | "interrupted";
60
76
  }
61
- export type SqlValue = string | number | boolean | null;
62
- export interface ObserverQuery {
63
- sql: string;
64
- params: SqlValue[];
65
- }
66
- export interface ObserverQueryResult {
67
- rows: Record<string, SqlValue>[];
68
- truncated: boolean;
77
+ export interface RequestHistoryQuery {
78
+ actorName?: string;
79
+ actorId?: string;
80
+ outcome?: RequestTrace["outcome"];
81
+ fromMs?: number;
82
+ toMs?: number;
83
+ limit?: number;
84
+ cursor?: string;
69
85
  }
70
86
  export interface RequestTracePage {
71
87
  nextCursor?: string | null;
package/dist/index.d.ts CHANGED
@@ -1,10 +1,31 @@
1
1
  export { ActorObserver } from "./ActorObserver.js";
2
+ export type { ActorObserverProps } from "./ActorObserver.js";
3
+ export { ConsoleApp } from "./ConsoleApp.js";
4
+ export type { ConsoleAppProps } from "./ConsoleApp.js";
5
+ export { FilterCombobox } from "./FilterCombobox.js";
6
+ export type { FilterComboboxProps, FilterSuggestion } from "./FilterCombobox.js";
7
+ export { Overview } from "./Overview.js";
8
+ export type { OverviewProps } from "./Overview.js";
2
9
  export { RequestObserver } from "./RequestObserver.js";
3
10
  export type { RequestObserverProps } from "./RequestObserver.js";
4
- export type { RequestTrace, RequestTracePage, ObserverQuery, ObserverQueryResult } from "./client.js";
5
- export type { ActorObserverProps } from "./ActorObserver.js";
6
- export { HttpObserverClient } from "./client.js";
7
- export type { ActorInventory, ObserverClient } from "./client.js";
11
+ export { SocketTimeline } from "./SocketTimeline.js";
12
+ export type { SocketTimelineProps } from "./SocketTimeline.js";
8
13
  export { TimeRangePicker } from "./TimeRangePicker.js";
14
+ export type { TimeRangePickerProps } from "./TimeRangePicker.js";
15
+ export { WebSocketObserver } from "./WebSocketObserver.js";
16
+ export type { WebSocketObserverProps } from "./WebSocketObserver.js";
17
+ export { Badge, badgeVariants } from "./components/ui/badge.js";
18
+ export { Button, buttonVariants } from "./components/ui/button.js";
19
+ export { Calendar, CalendarDayButton } from "./components/ui/calendar.js";
20
+ export { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator } from "./components/ui/command.js";
21
+ export { Input } from "./components/ui/input.js";
22
+ export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor, PopoverHeader, PopoverTitle, PopoverDescription } from "./components/ui/popover.js";
23
+ export { Sheet, SheetContent, SheetTitle, SheetDescription } from "./components/ui/sheet.js";
24
+ export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption } from "./components/ui/table.js";
25
+ export { HttpObserverClient } from "./client.js";
26
+ export type { ActorConnection, ActorInstance, ActorInventory, ActorResidency, ObserverClient, RequestTrace, RequestTracePage, RequestHistoryQuery } from "./client.js";
9
27
  export { defaultTimeRange, rangeLabel, resolveRange } from "./time-range.js";
10
28
  export type { TimeRange, ResolvedRange } from "./time-range.js";
29
+ export type { OverviewMetrics, ClassMetrics } from "./overview-metrics.js";
30
+ export type { QueueWaitRow, QueueWaitStats } from "./queue-wait.js";
31
+ export type { SocketSession, SocketSessionRow, SocketSessionStatus } from "./socket-sessions.js";