@oatscenter/trellis 0.100.0-rc.1

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.
Files changed (264) hide show
  1. package/README.md +59 -0
  2. package/auth/authorization/client_context.d.ts +61 -0
  3. package/auth/authorization/client_context.js +266 -0
  4. package/auth/authorization/nats_registry.d.ts +41 -0
  5. package/auth/authorization/nats_registry.js +283 -0
  6. package/auth/authorization/provider_cache.d.ts +90 -0
  7. package/auth/authorization/provider_cache.js +783 -0
  8. package/auth/authorization/refresh.d.ts +46 -0
  9. package/auth/authorization/refresh.js +246 -0
  10. package/auth/authorization/types.d.ts +207 -0
  11. package/auth/authorization/types.js +60 -0
  12. package/auth/authorization_context.d.ts +11 -0
  13. package/auth/authorization_context.js +10 -0
  14. package/auth/browser/flow_types.d.ts +84 -0
  15. package/auth/browser/flow_types.js +70 -0
  16. package/auth/browser/portal.d.ts +21 -0
  17. package/auth/browser/portal.js +307 -0
  18. package/auth/browser/storage.d.ts +26 -0
  19. package/auth/browser/storage.js +224 -0
  20. package/auth/browser.d.ts +11 -0
  21. package/auth/browser.js +10 -0
  22. package/auth/browser_recovery.d.ts +13 -0
  23. package/auth/browser_recovery.js +38 -0
  24. package/auth/device_activation.d.ts +134 -0
  25. package/auth/device_activation.js +376 -0
  26. package/auth/http_error.d.ts +12 -0
  27. package/auth/http_error.js +32 -0
  28. package/auth/keys.d.ts +5 -0
  29. package/auth/keys.js +63 -0
  30. package/auth/mod.d.ts +16 -0
  31. package/auth/mod.js +16 -0
  32. package/auth/proof.d.ts +31 -0
  33. package/auth/proof.js +95 -0
  34. package/auth/protocol_wasm/trellis_protocol_wasm.d.ts +138 -0
  35. package/auth/protocol_wasm/trellis_protocol_wasm.js +605 -0
  36. package/auth/protocol_wasm/trellis_protocol_wasm_bg.wasm +0 -0
  37. package/auth/protocol_wasm/trellis_protocol_wasm_bytes.d.ts +1 -0
  38. package/auth/protocol_wasm/trellis_protocol_wasm_bytes.js +2 -0
  39. package/auth/protocol_wasm.d.ts +179 -0
  40. package/auth/protocol_wasm.js +133 -0
  41. package/auth/session_auth.d.ts +30 -0
  42. package/auth/session_auth.js +77 -0
  43. package/auth/session_proof.d.ts +53 -0
  44. package/auth/session_proof.js +43 -0
  45. package/auth/time.d.ts +6 -0
  46. package/auth/time.js +7 -0
  47. package/auth/trellis_id.d.ts +1 -0
  48. package/auth/trellis_id.js +5 -0
  49. package/auth/utils.d.ts +10 -0
  50. package/auth/utils.js +69 -0
  51. package/auth.d.ts +1 -0
  52. package/auth.js +1 -0
  53. package/caller.d.ts +111 -0
  54. package/caller.js +85 -0
  55. package/client.d.ts +14 -0
  56. package/client.js +1 -0
  57. package/client_connect.d.ts +143 -0
  58. package/client_connect.js +1097 -0
  59. package/codec.d.ts +13 -0
  60. package/codec.js +192 -0
  61. package/connection.d.ts +107 -0
  62. package/connection.js +396 -0
  63. package/device/activation.d.ts +42 -0
  64. package/device/activation.js +319 -0
  65. package/device.d.ts +80 -0
  66. package/device.js +687 -0
  67. package/env.d.ts +2 -0
  68. package/env.js +10 -0
  69. package/errors/AuthError.d.ts +30 -0
  70. package/errors/AuthError.js +34 -0
  71. package/errors/KVError.d.ts +30 -0
  72. package/errors/KVError.js +36 -0
  73. package/errors/OperationLifecycleError.d.ts +110 -0
  74. package/errors/OperationLifecycleError.js +142 -0
  75. package/errors/RemoteError.d.ts +61 -0
  76. package/errors/RemoteError.js +72 -0
  77. package/errors/SchemaValidationError.d.ts +48 -0
  78. package/errors/SchemaValidationError.js +49 -0
  79. package/errors/StoreError.d.ts +21 -0
  80. package/errors/StoreError.js +31 -0
  81. package/errors/TransferError.d.ts +21 -0
  82. package/errors/TransferError.js +31 -0
  83. package/errors/TransportError.d.ts +29 -0
  84. package/errors/TransportError.js +33 -0
  85. package/errors/TrellisError.d.ts +15 -0
  86. package/errors/TrellisError.js +15 -0
  87. package/errors/ValidationError.d.ts +50 -0
  88. package/errors/ValidationError.js +59 -0
  89. package/errors/index.d.ts +254 -0
  90. package/errors/index.js +238 -0
  91. package/generated.d.ts +4 -0
  92. package/generated.js +3 -0
  93. package/generated_support.d.ts +120 -0
  94. package/generated_support.js +359 -0
  95. package/globals.d.ts +9 -0
  96. package/globals.js +16 -0
  97. package/health_transport.d.ts +18 -0
  98. package/health_transport.js +32 -0
  99. package/helpers.d.ts +11 -0
  100. package/helpers.js +53 -0
  101. package/index.d.ts +2 -0
  102. package/index.js +2 -0
  103. package/internal_sdk/generated/apis/auth/mod.d.ts +805 -0
  104. package/internal_sdk/generated/apis/auth/mod.js +958 -0
  105. package/internal_sdk/generated/apis/core/mod.d.ts +79 -0
  106. package/internal_sdk/generated/apis/core/mod.js +93 -0
  107. package/internal_sdk/generated/apis/events/mod.d.ts +224 -0
  108. package/internal_sdk/generated/apis/events/mod.js +313 -0
  109. package/internal_sdk/generated/apis/health/mod.d.ts +106 -0
  110. package/internal_sdk/generated/apis/health/mod.js +132 -0
  111. package/internal_sdk/generated/apis/index.d.ts +7 -0
  112. package/internal_sdk/generated/apis/index.js +8 -0
  113. package/internal_sdk/generated/apis/jobs/mod.d.ts +176 -0
  114. package/internal_sdk/generated/apis/jobs/mod.js +209 -0
  115. package/internal_sdk/generated/apis/state/mod.d.ts +104 -0
  116. package/internal_sdk/generated/apis/state/mod.js +139 -0
  117. package/internal_sdk/generated/index.d.ts +4 -0
  118. package/internal_sdk/generated/index.js +5 -0
  119. package/internal_sdk/generated/package.json +18 -0
  120. package/internal_sdk/generated/participants/cli/mod.d.ts +402 -0
  121. package/internal_sdk/generated/participants/cli/mod.js +460 -0
  122. package/internal_sdk/generated/participants/cli/types.d.ts +2 -0
  123. package/internal_sdk/generated/participants/cli/types.js +3 -0
  124. package/internal_sdk/generated/participants/console/mod.d.ts +489 -0
  125. package/internal_sdk/generated/participants/console/mod.js +579 -0
  126. package/internal_sdk/generated/participants/console/types.d.ts +2 -0
  127. package/internal_sdk/generated/participants/console/types.js +3 -0
  128. package/internal_sdk/generated/participants/eventsRuntime/mod.d.ts +64 -0
  129. package/internal_sdk/generated/participants/eventsRuntime/mod.js +42 -0
  130. package/internal_sdk/generated/participants/eventsRuntime/types.d.ts +2 -0
  131. package/internal_sdk/generated/participants/eventsRuntime/types.js +3 -0
  132. package/internal_sdk/generated/participants/healthRuntime/mod.d.ts +58 -0
  133. package/internal_sdk/generated/participants/healthRuntime/mod.js +36 -0
  134. package/internal_sdk/generated/participants/healthRuntime/types.d.ts +2 -0
  135. package/internal_sdk/generated/participants/healthRuntime/types.js +3 -0
  136. package/internal_sdk/generated/participants/index.d.ts +8 -0
  137. package/internal_sdk/generated/participants/index.js +9 -0
  138. package/internal_sdk/generated/participants/jobsRuntime/mod.d.ts +64 -0
  139. package/internal_sdk/generated/participants/jobsRuntime/mod.js +42 -0
  140. package/internal_sdk/generated/participants/jobsRuntime/types.d.ts +2 -0
  141. package/internal_sdk/generated/participants/jobsRuntime/types.js +3 -0
  142. package/internal_sdk/generated/participants/platform/mod.d.ts +164 -0
  143. package/internal_sdk/generated/participants/platform/mod.js +149 -0
  144. package/internal_sdk/generated/participants/platform/types.d.ts +7 -0
  145. package/internal_sdk/generated/participants/platform/types.js +5 -0
  146. package/internal_sdk/generated/participants/portal/mod.d.ts +131 -0
  147. package/internal_sdk/generated/participants/portal/mod.js +109 -0
  148. package/internal_sdk/generated/participants/portal/types.d.ts +2 -0
  149. package/internal_sdk/generated/participants/portal/types.js +3 -0
  150. package/internal_sdk/generated/types/_internal/p0.d.ts +13511 -0
  151. package/internal_sdk/generated/types/_internal/p0.js +6105 -0
  152. package/internal_sdk/generated/types/index.d.ts +2951 -0
  153. package/internal_sdk/generated/types/index.js +1477 -0
  154. package/jobs.d.ts +309 -0
  155. package/jobs.js +389 -0
  156. package/kv.d.ts +85 -0
  157. package/kv.js +330 -0
  158. package/operations.d.ts +189 -0
  159. package/operations.js +847 -0
  160. package/package.json +73 -0
  161. package/pagination.d.ts +25 -0
  162. package/pagination.js +117 -0
  163. package/participant.d.ts +6 -0
  164. package/participant.js +6 -0
  165. package/participant_runtime/api.d.ts +131 -0
  166. package/participant_runtime/api.js +42 -0
  167. package/participant_runtime/json.d.ts +16 -0
  168. package/participant_runtime/json.js +193 -0
  169. package/participant_runtime/metadata.d.ts +34 -0
  170. package/participant_runtime/metadata.js +4 -0
  171. package/participant_runtime/participant.d.ts +200 -0
  172. package/participant_runtime/participant.js +330 -0
  173. package/participant_runtime/schemas.d.ts +347 -0
  174. package/participant_runtime/schemas.js +211 -0
  175. package/participant_runtime/surface_names.d.ts +16 -0
  176. package/participant_runtime/surface_names.js +34 -0
  177. package/portable.d.ts +30 -0
  178. package/portable.js +14 -0
  179. package/provider.d.ts +69 -0
  180. package/provider.js +68 -0
  181. package/runtime_transport.d.ts +25 -0
  182. package/runtime_transport.js +48 -0
  183. package/service/mod.d.ts +14 -0
  184. package/service/mod.js +13 -0
  185. package/service/outbox_inbox.d.ts +259 -0
  186. package/service/outbox_inbox.js +908 -0
  187. package/service/runtime/bootstrap.d.ts +56 -0
  188. package/service/runtime/bootstrap.js +226 -0
  189. package/service/runtime/core.d.ts +46 -0
  190. package/service/runtime/core.js +1747 -0
  191. package/service/runtime/health.d.ts +97 -0
  192. package/service/runtime/health.js +153 -0
  193. package/service/runtime/health_schemas.d.ts +23 -0
  194. package/service/runtime/health_schemas.js +20 -0
  195. package/service/runtime/internal_jobs/active-job.d.ts +40 -0
  196. package/service/runtime/internal_jobs/active-job.js +91 -0
  197. package/service/runtime/internal_jobs/bindings.d.ts +40 -0
  198. package/service/runtime/internal_jobs/bindings.js +1 -0
  199. package/service/runtime/internal_jobs/cancellation-registry.d.ts +13 -0
  200. package/service/runtime/internal_jobs/cancellation-registry.js +55 -0
  201. package/service/runtime/internal_jobs/heartbeat.d.ts +33 -0
  202. package/service/runtime/internal_jobs/heartbeat.js +65 -0
  203. package/service/runtime/internal_jobs/job-manager.d.ts +126 -0
  204. package/service/runtime/internal_jobs/job-manager.js +821 -0
  205. package/service/runtime/internal_jobs/key-coordinator.d.ts +280 -0
  206. package/service/runtime/internal_jobs/key-coordinator.js +747 -0
  207. package/service/runtime/internal_jobs/projection.d.ts +3 -0
  208. package/service/runtime/internal_jobs/projection.js +42 -0
  209. package/service/runtime/internal_jobs/runtime-worker.d.ts +126 -0
  210. package/service/runtime/internal_jobs/runtime-worker.js +454 -0
  211. package/service/runtime/internal_jobs/types.d.ts +246 -0
  212. package/service/runtime/internal_jobs/types.js +163 -0
  213. package/service/runtime/logger.d.ts +2 -0
  214. package/service/runtime/logger.js +7 -0
  215. package/service/runtime/runtime.d.ts +16 -0
  216. package/service/runtime/runtime.js +1 -0
  217. package/service/runtime/service.d.ts +372 -0
  218. package/service/runtime/service.js +1896 -0
  219. package/service/runtime/transfer/download.d.ts +27 -0
  220. package/service/runtime/transfer/download.js +1 -0
  221. package/service/runtime/transfer/protocol.d.ts +15 -0
  222. package/service/runtime/transfer/protocol.js +46 -0
  223. package/service/runtime/transfer/queue.d.ts +18 -0
  224. package/service/runtime/transfer/queue.js +136 -0
  225. package/service/runtime/transfer/upload.d.ts +40 -0
  226. package/service/runtime/transfer/upload.js +27 -0
  227. package/service/runtime/transfer.d.ts +62 -0
  228. package/service/runtime/transfer.js +763 -0
  229. package/session.d.ts +862 -0
  230. package/session.js +3407 -0
  231. package/store.d.ts +71 -0
  232. package/store.js +412 -0
  233. package/store_entry.d.ts +20 -0
  234. package/store_entry.js +75 -0
  235. package/tasks.d.ts +10 -0
  236. package/tasks.js +28 -0
  237. package/telemetry/carrier.d.ts +8 -0
  238. package/telemetry/carrier.js +20 -0
  239. package/telemetry/core.d.ts +7 -0
  240. package/telemetry/core.js +14 -0
  241. package/telemetry/env.d.ts +2 -0
  242. package/telemetry/env.js +10 -0
  243. package/telemetry/init.d.ts +2 -0
  244. package/telemetry/init.js +7 -0
  245. package/telemetry/metrics.d.ts +81 -0
  246. package/telemetry/metrics.js +267 -0
  247. package/telemetry/mod.d.ts +13 -0
  248. package/telemetry/mod.js +8 -0
  249. package/telemetry/nats.d.ts +6 -0
  250. package/telemetry/nats.js +6 -0
  251. package/telemetry/result.d.ts +1 -0
  252. package/telemetry/result.js +18 -0
  253. package/telemetry/runtime.d.ts +1 -0
  254. package/telemetry/runtime.js +141 -0
  255. package/telemetry/trace.d.ts +4 -0
  256. package/telemetry/trace.js +26 -0
  257. package/telemetry/trellis.d.ts +1 -0
  258. package/telemetry/trellis.js +1 -0
  259. package/telemetry.d.ts +1 -0
  260. package/telemetry.js +1 -0
  261. package/transfer.d.ts +112 -0
  262. package/transfer.js +525 -0
  263. package/transfer_protocol.d.ts +1 -0
  264. package/transfer_protocol.js +13 -0
package/caller.d.ts ADDED
@@ -0,0 +1,111 @@
1
+ import { AsyncResult, type BaseError, type Result } from "@oatscenter/result";
2
+ import type { TrellisConnection } from "./connection.ts";
3
+ import type { TypedKV } from "./kv.ts";
4
+ import type { OperationInvoker } from "./operations.ts";
5
+ import type { TypedStore } from "./store.ts";
6
+ import { type GeneratedParticipant } from "./participant_runtime/participant.ts";
7
+ import type { EventListenerContext, EventOpts, FeedSubscribeOpts, PreparedTrellisEvent, RequestOpts, RuntimeStateStoresForContract, StateFacade, Trellis } from "./session.ts";
8
+ import type { ConnectedActionName, PascalActionName } from "./participant_runtime/surface_names.ts";
9
+ type CodecValue<T> = T extends {
10
+ decode(value: unknown): infer TValue;
11
+ } ? TValue : never;
12
+ type GeneratedCodec = Readonly<{
13
+ decode(value: unknown): unknown;
14
+ }>;
15
+ type SelectedActionShape = {
16
+ kind: "rpc" | "operation" | "event" | "feed";
17
+ descriptorName: string;
18
+ direction: unknown;
19
+ input?: unknown;
20
+ output?: unknown;
21
+ event?: unknown;
22
+ payload?: unknown;
23
+ };
24
+ type SelectedDescriptor<TSelection> = TSelection extends {
25
+ api: {
26
+ actions: Readonly<Record<string, unknown>>;
27
+ };
28
+ actions: readonly {
29
+ descriptorName: string;
30
+ direction: unknown;
31
+ }[];
32
+ } ? TSelection["actions"][number] extends infer TSelected ? TSelected extends {
33
+ descriptorName: infer TName extends string;
34
+ } ? TName extends keyof TSelection["api"]["actions"] ? TSelection["api"]["actions"][TName] & {
35
+ direction: TSelected extends {
36
+ direction: infer TDirection;
37
+ } ? TDirection : never;
38
+ } : never : never : never : never;
39
+ type SelectedAction<TContract extends GeneratedParticipant> = TContract["uses"][number] extends infer TSelection ? TSelection extends {
40
+ api: {
41
+ identity: string;
42
+ actions: Readonly<Record<string, unknown>>;
43
+ };
44
+ actions: readonly {
45
+ descriptorName: string;
46
+ direction: unknown;
47
+ }[];
48
+ } ? SelectedDescriptor<TSelection> extends infer TAction ? TAction extends SelectedActionShape ? TAction & {
49
+ generatedName: TContract["actionNames"][`${TSelection["api"]["identity"]}:${TAction["descriptorName"]}`];
50
+ } : never : never : never : never;
51
+ type ActionMethod<TAction extends SelectedActionShape> = TAction["kind"] extends "rpc" ? TAction["input"] extends GeneratedCodec ? TAction["output"] extends GeneratedCodec ? TAction extends {
52
+ pagination: "cursor";
53
+ } ? CodecValue<TAction["output"]> extends {
54
+ items: readonly (infer TItem)[];
55
+ page: {
56
+ nextCursor?: string;
57
+ };
58
+ } ? ((input: CodecValue<TAction["input"]>, opts?: RequestOpts) => AsyncResult<CodecValue<TAction["output"]>, BaseError>) & {
59
+ pages(input?: Omit<CodecValue<TAction["input"]>, "page">, opts?: RequestOpts): AsyncIterable<Result<CodecValue<TAction["output"]>, BaseError>>;
60
+ items(input?: Omit<CodecValue<TAction["input"]>, "page">, opts?: RequestOpts): AsyncIterable<Result<TItem, BaseError>>;
61
+ } : never : (input: CodecValue<TAction["input"]>, opts?: RequestOpts) => AsyncResult<CodecValue<TAction["output"]>, BaseError> : never : never : TAction["kind"] extends "operation" ? TAction["input"] extends GeneratedCodec ? ((input: CodecValue<TAction["input"]>) => ReturnType<OperationInvoker<never>["input"]>) & {
62
+ resume: OperationInvoker<never>["resume"];
63
+ } : never : TAction["kind"] extends "feed" ? TAction["input"] extends GeneratedCodec ? TAction["event"] extends GeneratedCodec ? (input: CodecValue<TAction["input"]>, opts?: FeedSubscribeOpts) => AsyncResult<AsyncIterable<CodecValue<TAction["event"]>>, BaseError> : never : never : TAction["kind"] extends "event" ? TAction["payload"] extends GeneratedCodec ? TAction["direction"] extends "publish" ? ((event: CodecValue<TAction["payload"]>) => AsyncResult<void, BaseError>) & {
64
+ prepare(event: CodecValue<TAction["payload"]>): ReturnType<Trellis["prepare"]>;
65
+ } : (handler: (event: CodecValue<TAction["payload"]>, context: EventListenerContext) => unknown | Promise<unknown>, opts?: EventOpts) => AsyncResult<void, BaseError> : never : never;
66
+ type ActionRecord<TAction> = TAction extends SelectedActionShape & {
67
+ generatedName: string;
68
+ } ? {
69
+ readonly [K in TAction["kind"] extends "event" ? TAction["direction"] extends "publish" ? `publish${PascalActionName<TAction["generatedName"]>}` : `on${PascalActionName<TAction["generatedName"]>}` : ConnectedActionName<TAction["generatedName"]>]: ActionMethod<TAction>;
70
+ } : never;
71
+ type UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
72
+ type KvFacadeFor<TContract extends GeneratedParticipant> = {
73
+ readonly [Name in keyof TContract["resources"] as TContract["resources"][Name] extends {
74
+ kind: "kv";
75
+ } ? Name : never]: TContract["resources"][Name] extends {
76
+ codec: infer TCodec;
77
+ } ? TypedKV<CodecValue<TCodec>> : never;
78
+ };
79
+ type StoreFacadeFor<TContract extends GeneratedParticipant> = {
80
+ readonly [Name in keyof TContract["resources"] as TContract["resources"][Name] extends {
81
+ kind: "store";
82
+ } ? Name : never]: TypedStore;
83
+ };
84
+ /** Minimum participant contract accepted by the public caller connector. */
85
+ export type CallerParticipant = GeneratedParticipant;
86
+ /** Flat caller surface inferred from a generated participant's selected actions. */
87
+ export type CallerRuntime<TContract extends GeneratedParticipant> = UnionToIntersection<ActionRecord<SelectedAction<TContract>>> & {
88
+ readonly connection: TrellisConnection;
89
+ availability(): ParticipantAvailability<TContract>;
90
+ watchAvailability(): AsyncIterable<ParticipantAvailability<TContract>>;
91
+ readonly state: StateFacade<RuntimeStateStoresForContract<TContract>>;
92
+ readonly kv: KvFacadeFor<TContract>;
93
+ readonly store: StoreFacadeFor<TContract>;
94
+ publishPrepared(event: PreparedTrellisEvent): AsyncResult<void, BaseError>;
95
+ transfer: Trellis["transfer"];
96
+ wait(): AsyncResult<void, BaseError>;
97
+ };
98
+ type OptionalCapability<TContract extends GeneratedParticipant> = TContract["uses"][number]["optionalCapabilities"][number];
99
+ type OptionalResource<TContract extends GeneratedParticipant> = {
100
+ [Name in keyof TContract["resources"]]: TContract["resources"][Name]["availability"] extends "optional" ? Name : never;
101
+ }[keyof TContract["resources"]];
102
+ type ParticipantAvailability<TContract extends GeneratedParticipant> = Readonly<{
103
+ capabilities: Readonly<Record<OptionalCapability<TContract>, boolean>>;
104
+ resources: Readonly<Record<OptionalResource<TContract>, boolean>>;
105
+ }>;
106
+ /** Projects a private Trellis session into the selected flat caller vocabulary. */
107
+ export declare function createCallerRuntime<TContract extends GeneratedParticipant>(session: object, contract: TContract, resources?: {
108
+ kv?: object;
109
+ store?: object;
110
+ }): CallerRuntime<TContract>;
111
+ export {};
package/caller.js ADDED
@@ -0,0 +1,85 @@
1
+ import { AsyncResult, err, ok, } from "@oatscenter/result";
2
+ import { getParticipantRuntime, } from "./participant_runtime/participant.js";
3
+ import { createActionUnavailableError } from "./session.js";
4
+ import { cursorItems, cursorPages } from "./pagination.js";
5
+ /** Projects a private Trellis session into the selected flat caller vocabulary. */
6
+ export function createCallerRuntime(session, contract, resources = {}) {
7
+ const runtime = session;
8
+ const caller = {
9
+ connection: runtime.connection,
10
+ availability: () => runtime.connection.availability(),
11
+ watchAvailability: () => runtime.connection.watchAvailability(),
12
+ state: runtime.state,
13
+ kv: resources.kv ?? {},
14
+ store: resources.store ?? {},
15
+ publishPrepared: runtime.publishPrepared.bind(runtime),
16
+ transfer: runtime.transfer.bind(runtime),
17
+ wait: runtime.wait.bind(runtime),
18
+ };
19
+ for (const action of getParticipantRuntime(contract).actions) {
20
+ const unavailable = () => {
21
+ const current = runtime.connection.availability().capabilities;
22
+ return action.optionalCapabilities.length > 0 &&
23
+ !action.optionalCapabilities.every((capability) => current[capability])
24
+ ? createActionUnavailableError(action.name, action.optionalCapabilities)
25
+ : undefined;
26
+ };
27
+ switch (action.descriptor.kind) {
28
+ case "rpc":
29
+ {
30
+ const request = (input, opts) => {
31
+ const error = unavailable();
32
+ return error
33
+ ? AsyncResult.from(Promise.resolve(err(error)))
34
+ : runtime.request(action.name, input, opts);
35
+ };
36
+ if (action.descriptor.pagination === "cursor") {
37
+ request.pages = (input, opts) => cursorPages(request, input, opts);
38
+ request.items = (input, opts) => cursorItems(request, input, opts);
39
+ }
40
+ caller[action.connectedName] = request;
41
+ }
42
+ break;
43
+ case "operation":
44
+ {
45
+ const operation = runtime.operationHandle(action.name, unavailable);
46
+ const invoke = (input) => operation.input(input);
47
+ invoke.resume = operation.resume.bind(operation);
48
+ caller[action.connectedName] = invoke;
49
+ }
50
+ break;
51
+ case "feed":
52
+ caller[action.connectedName] = (input, opts) => {
53
+ const error = unavailable();
54
+ return error
55
+ ? AsyncResult.from(Promise.resolve(err(error)))
56
+ : runtime.feedHandle(action.name).input(input).subscribe(opts);
57
+ };
58
+ break;
59
+ case "event":
60
+ if (action.direction === "publish") {
61
+ const publish = (event) => {
62
+ const error = unavailable();
63
+ return error
64
+ ? AsyncResult.from(Promise.resolve(err(error)))
65
+ : runtime.publish(action.name, event);
66
+ };
67
+ publish.prepare = (event) => runtime.prepare(action.name, event);
68
+ caller[action.connectedName] = publish;
69
+ }
70
+ else {
71
+ caller[action.connectedName] = (handler, opts) => {
72
+ const error = unavailable();
73
+ return error
74
+ ? AsyncResult.from(Promise.resolve(err(error)))
75
+ : runtime.listenEvent(action.name, {}, async (event, context) => {
76
+ await handler(event, context);
77
+ return ok(undefined);
78
+ }, opts);
79
+ };
80
+ }
81
+ break;
82
+ }
83
+ }
84
+ return caller;
85
+ }
package/client.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { LoggerLike } from "./globals.ts";
2
+ type NoResponderRetryOpts = {
3
+ maxAttempts?: number;
4
+ baseDelayMs?: number;
5
+ };
6
+ /** Transport options shared by caller connections. */
7
+ export type ClientOpts = {
8
+ name?: string;
9
+ log?: LoggerLike;
10
+ timeout?: number;
11
+ stream?: string;
12
+ noResponderRetry?: NoResponderRetryOpts;
13
+ };
14
+ export {};
package/client.js ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,143 @@
1
+ import { AsyncResult, BaseError, UnexpectedError } from "@oatscenter/result";
2
+ import { type StaticDecode, Type } from "typebox";
3
+ import { type CallerRuntime } from "./caller.ts";
4
+ import type { ClientOpts } from "./client.ts";
5
+ import { type GeneratedParticipant } from "./participant_runtime/participant.ts";
6
+ import type { ContractResourceBindings } from "./participant_runtime/schemas.ts";
7
+ import { TransportError } from "./errors/index.ts";
8
+ import { type ResourceMigrations } from "./kv.ts";
9
+ import { type RuntimeTransport } from "./runtime_transport.ts";
10
+ type ClientContract = GeneratedParticipant;
11
+ type ResourceMigrationsFor<TContract extends ClientContract, TKind extends "state" | "kv"> = Readonly<Partial<{
12
+ [Name in keyof TContract["resources"] as TContract["resources"][Name] extends {
13
+ kind: TKind;
14
+ } ? Name : never]: TContract["resources"][Name] extends {
15
+ codec: {
16
+ decode(value: unknown): infer TValue;
17
+ };
18
+ } ? ResourceMigrations<TValue> : never;
19
+ }>> & Readonly<Record<string, ResourceMigrations<unknown> | undefined>>;
20
+ /** Direct State and KV migrations supplied by the application at connection time. */
21
+ export type ClientResourceMigrations<TContract extends ClientContract = ClientContract> = Readonly<{
22
+ state?: ResourceMigrationsFor<TContract, "state">;
23
+ kv?: ResourceMigrationsFor<TContract, "kv">;
24
+ }>;
25
+ /** Browser caller runtime whose lifecycle owner can revoke and end its session. */
26
+ export type ConnectedTrellisClient<TContract extends ClientContract> = CallerRuntime<TContract> & {
27
+ logout(): Promise<void>;
28
+ };
29
+ type BrowserClientAuthOptions = {
30
+ mode?: "browser";
31
+ provider?: string;
32
+ redirectTo?: string | (() => string);
33
+ landingPath?: string;
34
+ context?: unknown;
35
+ currentUrl?: URL | string | (() => URL | string);
36
+ flowId?: string;
37
+ persistence?: "remembered" | "temporary";
38
+ };
39
+ type SessionKeyClientAuthOptionsBase = {
40
+ mode: "session_key";
41
+ sessionKeySeed: string;
42
+ sessionId?: string;
43
+ provider?: string;
44
+ redirectTo: string;
45
+ currentUrl?: URL | string | (() => URL | string);
46
+ context?: unknown;
47
+ flowId?: string;
48
+ };
49
+ type SessionKeyClientAuthOptions = SessionKeyClientAuthOptionsBase;
50
+ export type ClientAuthOptions = BrowserClientAuthOptions | SessionKeyClientAuthOptions;
51
+ export type ClientAuthRequiredContext = {
52
+ loginUrl: string;
53
+ sessionKey: string;
54
+ mode: "browser" | "session_key";
55
+ };
56
+ export type ClientAuthContinuation = {
57
+ status: "bound";
58
+ flowId: string;
59
+ } | {
60
+ status: "handled";
61
+ } | void;
62
+ export type ClientAuthHandledErrorData = {
63
+ id: string;
64
+ type: "ClientAuthHandledError";
65
+ message: string;
66
+ context?: Record<string, unknown>;
67
+ traceId?: string;
68
+ };
69
+ /**
70
+ * Error raised when client authentication was delegated to caller-owned routing.
71
+ */
72
+ export declare class ClientAuthHandledError extends BaseError<ClientAuthHandledErrorData> {
73
+ readonly name: "ClientAuthHandledError";
74
+ constructor();
75
+ toSerializable(): ClientAuthHandledErrorData;
76
+ }
77
+ type ClientConnectArgsFor<TContract extends ClientContract> = ClientOpts & {
78
+ trellisUrl: string;
79
+ participant: TContract;
80
+ auth?: ClientAuthOptions;
81
+ resourceMigrations?: ClientResourceMigrations<TContract>;
82
+ onAuthRequired?: (ctx: ClientAuthRequiredContext) => Promise<ClientAuthContinuation> | ClientAuthContinuation;
83
+ };
84
+ export type TrellisClientConnectArgs<TContract extends ClientContract = ClientContract> = ClientConnectArgsFor<TContract>;
85
+ type ClientConnectDeps = {
86
+ loadTransport(): Promise<RuntimeTransport>;
87
+ now(): number;
88
+ initialBootstrap?: ClientBootstrapReady;
89
+ runtimeSessionKeySeed?: string;
90
+ };
91
+ declare const ClientBootstrapReadySchema: Type.TObject<{
92
+ status: Type.TLiteral<"ready">;
93
+ serverNow: Type.TInteger;
94
+ connectInfo: Type.TObject<{
95
+ connectionId: Type.TOptional<Type.TString>;
96
+ sessionId: Type.TString;
97
+ participantId: Type.TString;
98
+ participantDigest: Type.TString;
99
+ transports: Type.TObject<{
100
+ native: Type.TOptional<Type.TObject<{
101
+ natsServers: Type.TArray<Type.TString>;
102
+ }>>;
103
+ websocket: Type.TOptional<Type.TObject<{
104
+ natsServers: Type.TArray<Type.TString>;
105
+ }>>;
106
+ }>;
107
+ transport: Type.TObject<{
108
+ inboxPrefix: Type.TString;
109
+ jwt: Type.TString;
110
+ jwtExpiresAt: Type.TInteger;
111
+ }>;
112
+ authorizationContext: Type.TObject<{
113
+ context: Type.TUnknown;
114
+ issuer: Type.TObject<{
115
+ keyId: Type.TString;
116
+ publicKey: Type.TString;
117
+ state: Type.TUnion<[Type.TLiteral<"active">, Type.TLiteral<"retired">, Type.TLiteral<"revoked">]>;
118
+ }>;
119
+ authorizationRegistry: Type.TObject<{
120
+ contextBucket: Type.TString;
121
+ }>;
122
+ policy: Type.TObject<{
123
+ allowedClockSkewSeconds: Type.TInteger;
124
+ maximumContextLifetimeSeconds: Type.TInteger;
125
+ maximumContextBytes: Type.TInteger;
126
+ maximumPermissions: Type.TInteger;
127
+ refreshLeadSeconds: Type.TInteger;
128
+ refreshJitterSeconds: Type.TInteger;
129
+ }>;
130
+ }>;
131
+ }>;
132
+ }>;
133
+ type ClientBootstrapReady = StaticDecode<typeof ClientBootstrapReadySchema> & {
134
+ readonly serverClockOffsetMs?: number;
135
+ readonly apiBindings: Readonly<Record<string, unknown>>;
136
+ readonly resourceBindings: ContractResourceBindings;
137
+ };
138
+ export declare function connectClientWithDeps<TContract extends ClientContract>(args: ClientConnectArgsFor<TContract>, deps: ClientConnectDeps): Promise<ConnectedTrellisClient<TContract>>;
139
+ /** Connects user-facing participants to the Trellis caller runtime. */
140
+ export declare class TrellisClient {
141
+ static connect<TContract extends ClientContract>(args: ClientConnectArgsFor<TContract>): AsyncResult<ConnectedTrellisClient<TContract>, TransportError | UnexpectedError | ClientAuthHandledError>;
142
+ }
143
+ export {};