ankka 0.9.1 → 0.11.0
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/dist/_proto/ankka/protocol/v1/agent_pb.d.ts +35 -0
- package/dist/_proto/ankka/protocol/v1/agent_pb.js +8 -1
- package/dist/_proto/ankka/protocol/v1/client_pb.d.ts +542 -2
- package/dist/_proto/ankka/protocol/v1/client_pb.js +107 -6
- package/dist/_proto/ankka/protocol/v1/consumer_pb.d.ts +52 -1
- package/dist/_proto/ankka/protocol/v1/consumer_pb.js +11 -1
- package/dist/_proto/ankka/protocol/v1/discovery_pb.d.ts +330 -0
- package/dist/_proto/ankka/protocol/v1/discovery_pb.js +81 -16
- package/dist/_proto/ankka/protocol/v1/endpoint_pb.d.ts +184 -0
- package/dist/_proto/ankka/protocol/v1/endpoint_pb.js +26 -1
- package/dist/_proto/ankka/protocol/v1/view_pb.d.ts +63 -0
- package/dist/_proto/ankka/protocol/v1/view_pb.js +11 -1
- package/dist/_proto/ankka/protocol/v1/workflow_pb.d.ts +7 -0
- package/dist/_proto/ankka/protocol/v1/workflow_pb.js +1 -1
- package/dist/agent.d.ts +15 -1
- package/dist/agent.js +20 -0
- package/dist/approvals.d.ts +47 -0
- package/dist/approvals.js +57 -0
- package/dist/autonomous.d.ts +23 -1
- package/dist/autonomous.js +30 -1
- package/dist/client.d.ts +92 -4
- package/dist/client.js +262 -15
- package/dist/consumer.d.ts +40 -2
- package/dist/consumer.js +50 -0
- package/dist/context.d.ts +4 -0
- package/dist/contract.d.ts +36 -0
- package/dist/contract.js +58 -0
- package/dist/effects/keyed.d.ts +33 -0
- package/dist/effects/keyed.js +41 -0
- package/dist/effects/stateless.d.ts +21 -0
- package/dist/effects/stateless.js +19 -0
- package/dist/endpoint.d.ts +10 -1
- package/dist/endpoint.js +20 -0
- package/dist/graph.d.ts +171 -0
- package/dist/graph.js +446 -0
- package/dist/handlers.d.ts +10 -2
- package/dist/handlers.js +6 -2
- package/dist/index.d.ts +15 -6
- package/dist/index.js +13 -4
- package/dist/keyedView.d.ts +56 -0
- package/dist/keyedView.js +67 -0
- package/dist/mcp.d.ts +57 -0
- package/dist/mcp.js +64 -0
- package/dist/routes.d.ts +23 -3
- package/dist/routes.js +16 -3
- package/dist/server/agent.js +12 -4
- package/dist/server/discovery.d.ts +12 -1
- package/dist/server/discovery.js +95 -1
- package/dist/server/http.d.ts +2 -1
- package/dist/server/http.js +78 -4
- package/dist/server/stateless.js +104 -16
- package/dist/server/workflow.js +5 -1
- package/dist/service.d.ts +45 -3
- package/dist/service.js +234 -12
- package/dist/services.d.ts +137 -0
- package/dist/services.js +259 -0
- package/dist/socket.d.ts +15 -0
- package/dist/socket.js +25 -0
- package/dist/spec.d.ts +1 -1
- package/dist/spec.js +87 -14
- package/dist/startFrom.d.ts +32 -0
- package/dist/startFrom.js +44 -0
- package/dist/testkit/index.d.ts +2 -2
- package/dist/testkit/index.js +1 -1
- package/dist/testkit/integration.js +5 -0
- package/dist/testkit/kinds.d.ts +75 -5
- package/dist/testkit/kinds.js +264 -34
- package/dist/testkit/unit.d.ts +14 -1
- package/dist/testkit/unit.js +40 -3
- package/dist/timedAction.d.ts +17 -2
- package/dist/timedAction.js +33 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/view.d.ts +32 -0
- package/dist/view.js +8 -0
- package/dist/workflow.d.ts +18 -1
- package/dist/workflow.js +39 -0
- package/package.json +3 -2
package/dist/testkit/unit.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// reduction is the server's (`materialise.ts`), so a test cannot pass on something the sidecar would
|
|
5
5
|
// not do.
|
|
6
6
|
import { create } from "@bufbuild/protobuf";
|
|
7
|
-
import { HttpRequestSchema } from "../_proto/ankka/protocol/v1/endpoint_pb.js";
|
|
7
|
+
import { HttpRequestSchema, SocketInSchema } from "../_proto/ankka/protocol/v1/endpoint_pb.js";
|
|
8
8
|
import { ComponentClient, noClient } from "../client.js";
|
|
9
9
|
import { binaryCodecs, codecFor } from "../codec.js";
|
|
10
10
|
import { commandContext } from "../context.js";
|
|
@@ -119,7 +119,8 @@ export class EndpointTestKit {
|
|
|
119
119
|
const rest = withoutQuery.startsWith(prefix) ? withoutQuery.slice(prefix.length) || "/" : withoutQuery;
|
|
120
120
|
const candidates = [];
|
|
121
121
|
for (const [id, route] of Object.entries(this.#cls.routes)) {
|
|
122
|
-
|
|
122
|
+
// A socket route is opened through `socket`, never answered as a GET.
|
|
123
|
+
if ((route.socket ? "SOCKET" : route.method) !== method.toUpperCase())
|
|
123
124
|
continue;
|
|
124
125
|
const pattern = new RegExp("^" + route.template.replace(/[.*+?^$()|[\]\\]/g, "\\$&").replace(PLACEHOLDER, "([^/]+)") + "$");
|
|
125
126
|
const m = pattern.exec(rest);
|
|
@@ -156,7 +157,15 @@ export class EndpointTestKit {
|
|
|
156
157
|
}
|
|
157
158
|
const headers = Object.entries(options.headers ?? {}).map(([name, value]) => ({ name, value }));
|
|
158
159
|
const principal = options.principal
|
|
159
|
-
? {
|
|
160
|
+
? {
|
|
161
|
+
subject: options.principal.subject,
|
|
162
|
+
name: options.principal.name ?? undefined,
|
|
163
|
+
email: options.principal.email ?? undefined,
|
|
164
|
+
emailVerified: options.principal.emailVerified,
|
|
165
|
+
roles: [...options.principal.roles],
|
|
166
|
+
claims: { ...(options.principal.claims ?? {}) },
|
|
167
|
+
issuer: options.principal.issuer ?? undefined,
|
|
168
|
+
}
|
|
160
169
|
: undefined;
|
|
161
170
|
const req = create(HttpRequestSchema, {
|
|
162
171
|
endpointId: this.#cls.name,
|
|
@@ -192,6 +201,34 @@ export class EndpointTestKit {
|
|
|
192
201
|
}
|
|
193
202
|
return new Response(500, "text/plain", new TextEncoder().encode(reply.message.case === "failure" ? reply.message.value.error?.message ?? "failure" : "no reply"));
|
|
194
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* Opens a socket route with no runtime: the handler is given `frames` one at a time and then told the
|
|
206
|
+
* socket is closed, as when the client closes it after sending them. Answers what the handler sent, in
|
|
207
|
+
* order, and how it ended: `finished` when it returned, `failed` (with `error`) when it threw.
|
|
208
|
+
*/
|
|
209
|
+
async socket(path, frames = [], options = {}) {
|
|
210
|
+
const prepared = this.#request("SOCKET", path, undefined, options);
|
|
211
|
+
if (!prepared)
|
|
212
|
+
throw new Error(`no socket route at ${path}`);
|
|
213
|
+
const requests = [
|
|
214
|
+
create(SocketInSchema, { message: { case: "open", value: prepared.req } }),
|
|
215
|
+
...frames.map((text) => create(SocketInSchema, { message: { case: "frame", value: { kind: { case: "text", value: text } } } })),
|
|
216
|
+
create(SocketInSchema, { message: { case: "closed", value: { reason: "client" } } }),
|
|
217
|
+
];
|
|
218
|
+
async function* script() {
|
|
219
|
+
yield* requests;
|
|
220
|
+
}
|
|
221
|
+
const sent = [];
|
|
222
|
+
for await (const out of this.#dispatcher.handleSocket(script())) {
|
|
223
|
+
if (out.message.case === "frame" && out.message.value.kind.case === "text")
|
|
224
|
+
sent.push(out.message.value.kind.value);
|
|
225
|
+
if (out.message.case === "completed")
|
|
226
|
+
return { sent, ended: "finished" };
|
|
227
|
+
if (out.message.case === "failed")
|
|
228
|
+
return { sent, ended: "failed", error: out.message.value.message };
|
|
229
|
+
}
|
|
230
|
+
return { sent, ended: "finished" };
|
|
231
|
+
}
|
|
195
232
|
/** The frames of an SSE route, each string one frame. */
|
|
196
233
|
async sse(path, options = {}) {
|
|
197
234
|
const prepared = this.#request("GET", path, undefined, options);
|
package/dist/timedAction.d.ts
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
import type { Metadata } from "./effects/common.ts";
|
|
2
|
-
import type
|
|
2
|
+
import { type ComponentClient, type Secrets } from "./client.ts";
|
|
3
3
|
import type { HandlerTable } from "./handlers.ts";
|
|
4
4
|
import { TimedActionEffects } from "./effects/stateless.ts";
|
|
5
|
+
import { type Services } from "./services.ts";
|
|
5
6
|
export declare abstract class TimedAction {
|
|
6
7
|
#private;
|
|
7
8
|
readonly effects: TimedActionEffects;
|
|
8
|
-
/** `ankka.timer` is the timer's id, `ankka.attempts` how many times it has fired. */
|
|
9
|
+
/** `ankka.timer` is the timer's id, `ankka.attempts` how many times it has fired, `ankka.due` the due time in epoch milliseconds. */
|
|
9
10
|
get metadata(): Metadata;
|
|
11
|
+
/**
|
|
12
|
+
* The due time this run is for, from `ankka.due`: the same on every retry of one due time, and for a
|
|
13
|
+
* recurring timer a whole number of periods after the one before. `undefined` on a runtime older
|
|
14
|
+
* than protocol 1.12, which does not send it.
|
|
15
|
+
*/
|
|
16
|
+
get dueTime(): Date | undefined;
|
|
10
17
|
get client(): ComponentClient;
|
|
18
|
+
/** The service's secret store: values kept encrypted in the service's own database, never in a journal or a view. */
|
|
19
|
+
get secrets(): Secrets;
|
|
20
|
+
/** A unit test's store in place of the runtime's: `component.secrets = new InMemorySecrets()`. */
|
|
21
|
+
set secrets(store: Secrets);
|
|
22
|
+
/** Other services, called as this one, through the runtime: `this.services.service("orders")`. */
|
|
23
|
+
get services(): Services;
|
|
24
|
+
/** A unit test's in place of the runtime's: `component.services = new ScriptedServices()`. */
|
|
25
|
+
set services(services: Services);
|
|
11
26
|
/** @internal */
|
|
12
27
|
get _kind(): "timed-action";
|
|
13
28
|
/** @internal */
|
package/dist/timedAction.js
CHANGED
|
@@ -2,20 +2,52 @@
|
|
|
2
2
|
// sweeper delivers it here, retrying a failure with backoff.
|
|
3
3
|
//
|
|
4
4
|
// static readonly actions = { remind: action("remind", s.string, (t: Reminder, id) => t.remind(id)) }
|
|
5
|
+
import { secretsFor } from "./client.js";
|
|
5
6
|
import { TimedActionEffects } from "./effects/stateless.js";
|
|
7
|
+
import { servicesFor } from "./services.js";
|
|
6
8
|
export class TimedAction {
|
|
7
9
|
effects = new TimedActionEffects();
|
|
8
10
|
#metadata = {};
|
|
9
11
|
#client;
|
|
10
|
-
/** `ankka.timer` is the timer's id, `ankka.attempts` how many times it has fired. */
|
|
12
|
+
/** `ankka.timer` is the timer's id, `ankka.attempts` how many times it has fired, `ankka.due` the due time in epoch milliseconds. */
|
|
11
13
|
get metadata() {
|
|
12
14
|
return this.#metadata;
|
|
13
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* The due time this run is for, from `ankka.due`: the same on every retry of one due time, and for a
|
|
18
|
+
* recurring timer a whole number of periods after the one before. `undefined` on a runtime older
|
|
19
|
+
* than protocol 1.12, which does not send it.
|
|
20
|
+
*/
|
|
21
|
+
get dueTime() {
|
|
22
|
+
const raw = this.#metadata["ankka.due"];
|
|
23
|
+
if (raw === undefined || !/^-?\d+$/.test(raw.trim()))
|
|
24
|
+
return undefined;
|
|
25
|
+
const date = new Date(Number(raw.trim()));
|
|
26
|
+
return Number.isNaN(date.getTime()) ? undefined : date;
|
|
27
|
+
}
|
|
14
28
|
get client() {
|
|
15
29
|
if (!this.#client)
|
|
16
30
|
throw new Error("client is only available inside an action");
|
|
17
31
|
return this.#client;
|
|
18
32
|
}
|
|
33
|
+
#secrets;
|
|
34
|
+
/** The service's secret store: values kept encrypted in the service's own database, never in a journal or a view. */
|
|
35
|
+
get secrets() {
|
|
36
|
+
return this.#secrets ?? secretsFor(this.client);
|
|
37
|
+
}
|
|
38
|
+
/** A unit test's store in place of the runtime's: `component.secrets = new InMemorySecrets()`. */
|
|
39
|
+
set secrets(store) {
|
|
40
|
+
this.#secrets = store;
|
|
41
|
+
}
|
|
42
|
+
#services;
|
|
43
|
+
/** Other services, called as this one, through the runtime: `this.services.service("orders")`. */
|
|
44
|
+
get services() {
|
|
45
|
+
return this.#services ?? servicesFor(this.client);
|
|
46
|
+
}
|
|
47
|
+
/** A unit test's in place of the runtime's: `component.services = new ScriptedServices()`. */
|
|
48
|
+
set services(services) {
|
|
49
|
+
this.#services = services;
|
|
50
|
+
}
|
|
19
51
|
/** @internal */
|
|
20
52
|
get _kind() {
|
|
21
53
|
return "timed-action";
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
1
|
+
export declare const VERSION = "0.11.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Written by scripts/proto.ts from package.json; do not edit. 0.0.0 in the tree, the tag's version in a release.
|
|
2
|
-
export const VERSION = "0.
|
|
2
|
+
export const VERSION = "0.11.0";
|
package/dist/view.d.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
|
+
import type { StartFrom } from "./startFrom.ts";
|
|
2
|
+
import type { Contract } from "./contract.ts";
|
|
1
3
|
import type { Shape } from "./codec.ts";
|
|
2
4
|
import type { Metadata } from "./effects/common.ts";
|
|
3
5
|
import type { ComponentClient } from "./client.ts";
|
|
4
6
|
import type { ComponentRef } from "./client.ts";
|
|
5
7
|
import { ViewEffects, type ViewEffect } from "./effects/stateless.ts";
|
|
6
8
|
type MaybePromise<T> = T | Promise<T>;
|
|
9
|
+
/**
|
|
10
|
+
* A question a view can be asked by name: one SQL statement over the view's own table, whose values
|
|
11
|
+
* are the `:name`s it holds. The platform checks the statement when the service starts — one that is
|
|
12
|
+
* not a single read of the view's own table stops the service, naming the view and the query — and
|
|
13
|
+
* binds each value as a parameter, never as part of the text. The answer is rows of the view's row
|
|
14
|
+
* shape, read from the statement's `payload` column.
|
|
15
|
+
*/
|
|
16
|
+
export interface DeclaredQuery {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly statement: string;
|
|
19
|
+
}
|
|
20
|
+
/** Declares a query for a view's `static declared`. The SDK sends the statement as written. */
|
|
21
|
+
export declare function declaredQuery(name: string, statement: string): DeclaredQuery;
|
|
22
|
+
/** The table a view's rows are kept in, for a declared query's statement to name. */
|
|
23
|
+
export declare function tableOf(componentId: string): string;
|
|
7
24
|
export declare abstract class View<E, Row> {
|
|
8
25
|
#private;
|
|
9
26
|
readonly effects: ViewEffects<Row>;
|
|
@@ -29,9 +46,24 @@ export interface ViewClass<E = unknown, Row = unknown, C extends View<E, Row> =
|
|
|
29
46
|
/** The component whose changes feed the view, or `topic`. */
|
|
30
47
|
readonly source?: ComponentRef;
|
|
31
48
|
readonly topic?: string;
|
|
49
|
+
/** Where a topic source starts the first time its group reads the topic. */
|
|
50
|
+
readonly startFrom?: StartFrom;
|
|
51
|
+
/**
|
|
52
|
+
* Raised to have the view emptied and read again: a topic from its start position, under a group of
|
|
53
|
+
* its own, as far back as the broker retains; an entity from its first event or state. Absent is 1.
|
|
54
|
+
*/
|
|
55
|
+
readonly version?: number;
|
|
56
|
+
/** The contract the topic read is expected to carry, checked at start against the project's declaration. */
|
|
57
|
+
readonly contract?: Contract;
|
|
58
|
+
/** The declared broker the topic read is on; absent is the installation's. */
|
|
59
|
+
readonly broker?: string;
|
|
60
|
+
/** Whether the partitions an instance holds are handled at once, each in order. */
|
|
61
|
+
readonly parallel?: boolean;
|
|
32
62
|
readonly events: Shape<E>;
|
|
33
63
|
readonly row: Shape<Row>;
|
|
34
64
|
/** The query names the view answers; `get` and `all` by default. */
|
|
35
65
|
readonly queries?: readonly string[];
|
|
66
|
+
/** The queries the view can be asked by name, each a statement over its own table (protocol 1.13). */
|
|
67
|
+
readonly declared?: readonly DeclaredQuery[];
|
|
36
68
|
}
|
|
37
69
|
export {};
|
package/dist/view.js
CHANGED
|
@@ -9,6 +9,14 @@
|
|
|
9
9
|
// onChange(event) { ... return this.effects.updateRow(...) }
|
|
10
10
|
// }
|
|
11
11
|
import { ViewEffects } from "./effects/stateless.js";
|
|
12
|
+
/** Declares a query for a view's `static declared`. The SDK sends the statement as written. */
|
|
13
|
+
export function declaredQuery(name, statement) {
|
|
14
|
+
return Object.freeze({ name, statement });
|
|
15
|
+
}
|
|
16
|
+
/** The table a view's rows are kept in, for a declared query's statement to name. */
|
|
17
|
+
export function tableOf(componentId) {
|
|
18
|
+
return "ankka_view_" + componentId.replace(/[^A-Za-z0-9]/g, "_");
|
|
19
|
+
}
|
|
12
20
|
export class View {
|
|
13
21
|
effects = new ViewEffects();
|
|
14
22
|
#row = null;
|
package/dist/workflow.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Shape } from "./codec.ts";
|
|
2
2
|
import type { CommandContext } from "./context.ts";
|
|
3
3
|
import type { HandlerTable } from "./handlers.ts";
|
|
4
|
-
import type
|
|
4
|
+
import { type ComponentClient, type Secrets } from "./client.ts";
|
|
5
5
|
import { StepEffects, WorkflowEffects, type WorkflowSettings } from "./effects/workflow.ts";
|
|
6
|
+
import { type Services } from "./services.ts";
|
|
6
7
|
export declare abstract class Workflow<S> {
|
|
7
8
|
#private;
|
|
8
9
|
/** Inside a command handler. */
|
|
@@ -13,6 +14,22 @@ export declare abstract class Workflow<S> {
|
|
|
13
14
|
get entityId(): string;
|
|
14
15
|
get context(): CommandContext;
|
|
15
16
|
get client(): ComponentClient;
|
|
17
|
+
/**
|
|
18
|
+
* The service's secret store, in a step. A command handler is refused: it would put a database read
|
|
19
|
+
* on the workflow's single-writer path, as an entity's would.
|
|
20
|
+
*/
|
|
21
|
+
get secrets(): Secrets;
|
|
22
|
+
/** A unit test's store in place of the runtime's. */
|
|
23
|
+
set secrets(store: Secrets);
|
|
24
|
+
/**
|
|
25
|
+
* Other services, called as this one, in a step. A command handler is refused, as for the secret
|
|
26
|
+
* store: it would block the workflow's other commands behind another service.
|
|
27
|
+
*/
|
|
28
|
+
get services(): Services;
|
|
29
|
+
/** A unit test's in place of the runtime's. */
|
|
30
|
+
set services(services: Services);
|
|
31
|
+
/** @internal The server marks a step's binding, which is how a step is told from a command. */
|
|
32
|
+
_enterStep(): void;
|
|
16
33
|
/** @internal */
|
|
17
34
|
get _kind(): "workflow";
|
|
18
35
|
abstract emptyState(): S;
|
package/dist/workflow.js
CHANGED
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
//
|
|
6
6
|
// static readonly steps = { reserve: step("reserve", (w: CheckoutWorkflow) => w.reserve()), charge: step("charge", s.int, (w, q) => w.charge(q)) }
|
|
7
7
|
// static readonly settings = workflowSettings({ steps: { charge: { recovery: { maxRetries: 1, failoverTo: "compensate" } } } })
|
|
8
|
+
import { secretsFor } from "./client.js";
|
|
9
|
+
import { CommandError } from "./effects/common.js";
|
|
8
10
|
import { StepEffects, WorkflowEffects } from "./effects/workflow.js";
|
|
11
|
+
import { servicesFor } from "./services.js";
|
|
9
12
|
export class Workflow {
|
|
10
13
|
/** Inside a command handler. */
|
|
11
14
|
effects = new WorkflowEffects();
|
|
@@ -36,6 +39,41 @@ export class Workflow {
|
|
|
36
39
|
throw new Error("client is only available inside a handler or a step");
|
|
37
40
|
return this.#client;
|
|
38
41
|
}
|
|
42
|
+
#inStep = false;
|
|
43
|
+
#secrets;
|
|
44
|
+
/**
|
|
45
|
+
* The service's secret store, in a step. A command handler is refused: it would put a database read
|
|
46
|
+
* on the workflow's single-writer path, as an entity's would.
|
|
47
|
+
*/
|
|
48
|
+
get secrets() {
|
|
49
|
+
if (!this.#inStep) {
|
|
50
|
+
throw new CommandError({ message: "a workflow reads and keeps a service secret in a step, not in a command handler", code: "BAD_REQUEST" });
|
|
51
|
+
}
|
|
52
|
+
return this.#secrets ?? secretsFor(this.client);
|
|
53
|
+
}
|
|
54
|
+
/** A unit test's store in place of the runtime's. */
|
|
55
|
+
set secrets(store) {
|
|
56
|
+
this.#secrets = store;
|
|
57
|
+
}
|
|
58
|
+
#services;
|
|
59
|
+
/**
|
|
60
|
+
* Other services, called as this one, in a step. A command handler is refused, as for the secret
|
|
61
|
+
* store: it would block the workflow's other commands behind another service.
|
|
62
|
+
*/
|
|
63
|
+
get services() {
|
|
64
|
+
if (!this.#inStep) {
|
|
65
|
+
throw new CommandError({ message: "a workflow calls another service in a step, not in a command handler", code: "BAD_REQUEST" });
|
|
66
|
+
}
|
|
67
|
+
return this.#services ?? servicesFor(this.client);
|
|
68
|
+
}
|
|
69
|
+
/** A unit test's in place of the runtime's. */
|
|
70
|
+
set services(services) {
|
|
71
|
+
this.#services = services;
|
|
72
|
+
}
|
|
73
|
+
/** @internal The server marks a step's binding, which is how a step is told from a command. */
|
|
74
|
+
_enterStep() {
|
|
75
|
+
this.#inStep = true;
|
|
76
|
+
}
|
|
39
77
|
/** @internal */
|
|
40
78
|
get _kind() {
|
|
41
79
|
return "workflow";
|
|
@@ -57,5 +95,6 @@ export class Workflow {
|
|
|
57
95
|
this.#context = undefined;
|
|
58
96
|
this.#client = undefined;
|
|
59
97
|
this.#bound = false;
|
|
98
|
+
this.#inStep = false;
|
|
60
99
|
}
|
|
61
100
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ankka",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Build services on ankka in TypeScript: entities, views, workflows, agents and endpoints hosted by the ankka sidecar.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -50,7 +50,8 @@
|
|
|
50
50
|
"dependencies": {
|
|
51
51
|
"@bufbuild/protobuf": "^2.15.0",
|
|
52
52
|
"@connectrpc/connect": "^2.2.0",
|
|
53
|
-
"@connectrpc/connect-node": "^2.2.0"
|
|
53
|
+
"@connectrpc/connect-node": "^2.2.0",
|
|
54
|
+
"canonicalize": "^2.1.0"
|
|
54
55
|
},
|
|
55
56
|
"peerDependencies": {
|
|
56
57
|
"@testcontainers/postgresql": "^12.1.0",
|