@hatchet-dev/typescript-sdk 0.2.0 → 0.3.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.
@@ -2,6 +2,10 @@ import { DispatcherClient as PbDispatcherClient, AssignedAction } from '../../pr
2
2
  import { ClientConfig } from '../hatchet-client/client-config';
3
3
  import { Logger } from '../../util/logger';
4
4
  import { DispatcherClient } from './dispatcher-client';
5
+ declare enum ListenStrategy {
6
+ LISTEN_STRATEGY_V1 = 1,
7
+ LISTEN_STRATEGY_V2 = 2
8
+ }
5
9
  export interface Action {
6
10
  tenantId: string;
7
11
  jobId: string;
@@ -26,9 +30,16 @@ export declare class ActionListener {
26
30
  retryInterval: number;
27
31
  retryCount: number;
28
32
  done: boolean;
33
+ listenStrategy: ListenStrategy;
34
+ heartbeatInterval: any;
29
35
  constructor(client: DispatcherClient, workerId: string, retryInterval?: number, retryCount?: number);
30
36
  actions: () => AsyncGenerator<Action, void, unknown>;
37
+ setListenStrategy(strategy: ListenStrategy): Promise<void>;
38
+ getListenStrategy(): Promise<ListenStrategy>;
31
39
  incrementRetries(): Promise<void>;
40
+ heartbeat(): Promise<void>;
41
+ closeHeartbeat(): void;
32
42
  getListenClient(): Promise<AsyncIterable<AssignedAction>>;
33
43
  unregister(): Promise<import("../../protoc/dispatcher").WorkerUnsubscribeResponse>;
34
44
  }
45
+ export {};
@@ -39,6 +39,12 @@ const hatchet_error_1 = __importDefault(require("../../util/errors/hatchet-error
39
39
  const logger_1 = require("../../util/logger");
40
40
  const DEFAULT_ACTION_LISTENER_RETRY_INTERVAL = 5000; // milliseconds
41
41
  const DEFAULT_ACTION_LISTENER_RETRY_COUNT = 5;
42
+ // eslint-disable-next-line no-shadow
43
+ var ListenStrategy;
44
+ (function (ListenStrategy) {
45
+ ListenStrategy[ListenStrategy["LISTEN_STRATEGY_V1"] = 1] = "LISTEN_STRATEGY_V1";
46
+ ListenStrategy[ListenStrategy["LISTEN_STRATEGY_V2"] = 2] = "LISTEN_STRATEGY_V2";
47
+ })(ListenStrategy || (ListenStrategy = {}));
42
48
  class ActionListener {
43
49
  constructor(client, workerId, retryInterval = DEFAULT_ACTION_LISTENER_RETRY_INTERVAL, retryCount = DEFAULT_ACTION_LISTENER_RETRY_COUNT) {
44
50
  this.lastConnectionAttempt = 0;
@@ -46,6 +52,7 @@ class ActionListener {
46
52
  this.retryInterval = DEFAULT_ACTION_LISTENER_RETRY_INTERVAL;
47
53
  this.retryCount = DEFAULT_ACTION_LISTENER_RETRY_COUNT;
48
54
  this.done = false;
55
+ this.listenStrategy = ListenStrategy.LISTEN_STRATEGY_V2;
49
56
  this.actions = () => (function gen(client) {
50
57
  return __asyncGenerator(this, arguments, function* gen_1() {
51
58
  var _a, e_1, _b, _c;
@@ -79,6 +86,10 @@ class ActionListener {
79
86
  if (e.code === nice_grpc_1.Status.CANCELLED) {
80
87
  break;
81
88
  }
89
+ if ((yield __await(client.getListenStrategy())) === ListenStrategy.LISTEN_STRATEGY_V2 &&
90
+ e.code === nice_grpc_1.Status.UNIMPLEMENTED) {
91
+ client.setListenStrategy(ListenStrategy.LISTEN_STRATEGY_V1);
92
+ }
82
93
  client.incrementRetries();
83
94
  }
84
95
  }
@@ -91,11 +102,62 @@ class ActionListener {
91
102
  this.retryInterval = retryInterval;
92
103
  this.retryCount = retryCount;
93
104
  }
105
+ setListenStrategy(strategy) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ this.listenStrategy = strategy;
108
+ });
109
+ }
110
+ getListenStrategy() {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ return this.listenStrategy;
113
+ });
114
+ }
94
115
  incrementRetries() {
95
116
  return __awaiter(this, void 0, void 0, function* () {
96
117
  this.retries += 1;
97
118
  });
98
119
  }
120
+ heartbeat() {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ if (this.heartbeatInterval) {
123
+ return;
124
+ }
125
+ // start with a heartbeat
126
+ try {
127
+ yield this.client.heartbeat({
128
+ workerId: this.workerId,
129
+ heartbeatAt: new Date(),
130
+ });
131
+ }
132
+ catch (e) {
133
+ this.logger.error(`Failed to send heartbeat: ${e.message}`);
134
+ if (e.code === nice_grpc_1.Status.UNIMPLEMENTED) {
135
+ return;
136
+ }
137
+ }
138
+ this.heartbeatInterval = setInterval(() => __awaiter(this, void 0, void 0, function* () {
139
+ try {
140
+ yield this.client.heartbeat({
141
+ workerId: this.workerId,
142
+ heartbeatAt: new Date(),
143
+ });
144
+ }
145
+ catch (e) {
146
+ if (e.code === nice_grpc_1.Status.UNIMPLEMENTED) {
147
+ // break out of interval
148
+ this.closeHeartbeat();
149
+ return;
150
+ }
151
+ this.logger.error(`Failed to send heartbeat: ${e.message}`);
152
+ }
153
+ }), 4000);
154
+ });
155
+ }
156
+ closeHeartbeat() {
157
+ if (this.heartbeatInterval) {
158
+ clearInterval(this.heartbeatInterval);
159
+ }
160
+ }
99
161
  getListenClient() {
100
162
  return __awaiter(this, void 0, void 0, function* () {
101
163
  const currentTime = Math.floor(Date.now());
@@ -112,9 +174,16 @@ class ActionListener {
112
174
  yield (0, sleep_1.default)(DEFAULT_ACTION_LISTENER_RETRY_INTERVAL);
113
175
  }
114
176
  try {
115
- return this.client.listen({
177
+ if (this.listenStrategy === ListenStrategy.LISTEN_STRATEGY_V1) {
178
+ return this.client.listen({
179
+ workerId: this.workerId,
180
+ });
181
+ }
182
+ const res = this.client.listenV2({
116
183
  workerId: this.workerId,
117
184
  });
185
+ this.heartbeat();
186
+ return res;
118
187
  }
119
188
  catch (e) {
120
189
  this.retries += 1;
@@ -126,6 +195,7 @@ class ActionListener {
126
195
  unregister() {
127
196
  return __awaiter(this, void 0, void 0, function* () {
128
197
  this.done = true;
198
+ this.closeHeartbeat();
129
199
  try {
130
200
  return this.client.unsubscribe({
131
201
  workerId: this.workerId,
@@ -15,4 +15,5 @@ export declare class EventClient {
15
15
  constructor(config: ClientConfig, channel: Channel, factory: ClientFactory);
16
16
  push<T>(type: string, input: T): Promise<import("../../protoc/events/events").Event>;
17
17
  putLog(stepRunId: string, log: string, level?: LogLevel): void;
18
+ putStream(stepRunId: string, data: string | Uint8Array): void;
18
19
  }
@@ -65,5 +65,31 @@ class EventClient {
65
65
  this.logger.warn(`Could not put log: ${e.message}`);
66
66
  }
67
67
  }
68
+ putStream(stepRunId, data) {
69
+ const createdAt = new Date();
70
+ let dataBytes;
71
+ if (typeof data === 'string') {
72
+ dataBytes = new TextEncoder().encode(data);
73
+ }
74
+ else if (data instanceof Uint8Array) {
75
+ dataBytes = data;
76
+ }
77
+ else {
78
+ throw new Error('Invalid data type. Expected string or Uint8Array.');
79
+ }
80
+ try {
81
+ (0, retrier_1.retrier)(() => __awaiter(this, void 0, void 0, function* () {
82
+ return this.client.putStreamEvent({
83
+ stepRunId,
84
+ createdAt,
85
+ message: dataBytes,
86
+ });
87
+ }), this.logger);
88
+ }
89
+ catch (e) {
90
+ // log a warning, but this is not a fatal error
91
+ this.logger.warn(`Could not put log: ${e.message}`);
92
+ }
93
+ }
68
94
  }
69
95
  exports.EventClient = EventClient;
@@ -11,6 +11,7 @@ export declare enum RunEventType {
11
11
  STEP_RUN_EVENT_TYPE_FAILED = "STEP_RUN_EVENT_TYPE_FAILED",
12
12
  STEP_RUN_EVENT_TYPE_CANCELLED = "STEP_RUN_EVENT_TYPE_CANCELLED",
13
13
  STEP_RUN_EVENT_TYPE_TIMED_OUT = "STEP_RUN_EVENT_TYPE_TIMED_OUT",
14
+ STEP_RUN_EVENT_TYPE_STREAM = "STEP_RUN_EVENT_TYPE_STREAM",
14
15
  WORKFLOW_RUN_EVENT_TYPE_STARTED = "WORKFLOW_RUN_EVENT_TYPE_STARTED",
15
16
  WORKFLOW_RUN_EVENT_TYPE_COMPLETED = "WORKFLOW_RUN_EVENT_TYPE_COMPLETED",
16
17
  WORKFLOW_RUN_EVENT_TYPE_FAILED = "WORKFLOW_RUN_EVENT_TYPE_FAILED",
@@ -52,6 +52,7 @@ var RunEventType;
52
52
  RunEventType["STEP_RUN_EVENT_TYPE_FAILED"] = "STEP_RUN_EVENT_TYPE_FAILED";
53
53
  RunEventType["STEP_RUN_EVENT_TYPE_CANCELLED"] = "STEP_RUN_EVENT_TYPE_CANCELLED";
54
54
  RunEventType["STEP_RUN_EVENT_TYPE_TIMED_OUT"] = "STEP_RUN_EVENT_TYPE_TIMED_OUT";
55
+ RunEventType["STEP_RUN_EVENT_TYPE_STREAM"] = "STEP_RUN_EVENT_TYPE_STREAM";
55
56
  RunEventType["WORKFLOW_RUN_EVENT_TYPE_STARTED"] = "WORKFLOW_RUN_EVENT_TYPE_STARTED";
56
57
  RunEventType["WORKFLOW_RUN_EVENT_TYPE_COMPLETED"] = "WORKFLOW_RUN_EVENT_TYPE_COMPLETED";
57
58
  RunEventType["WORKFLOW_RUN_EVENT_TYPE_FAILED"] = "WORKFLOW_RUN_EVENT_TYPE_FAILED";
@@ -64,6 +65,7 @@ const stepEventTypeMap = {
64
65
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_FAILED]: RunEventType.STEP_RUN_EVENT_TYPE_FAILED,
65
66
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_CANCELLED]: RunEventType.STEP_RUN_EVENT_TYPE_CANCELLED,
66
67
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_TIMED_OUT]: RunEventType.STEP_RUN_EVENT_TYPE_TIMED_OUT,
68
+ [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_STREAM]: RunEventType.STEP_RUN_EVENT_TYPE_STREAM,
67
69
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_UNKNOWN]: undefined,
68
70
  [dispatcher_1.ResourceEventType.UNRECOGNIZED]: undefined,
69
71
  };
@@ -74,6 +76,7 @@ const workflowEventTypeMap = {
74
76
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_CANCELLED]: RunEventType.WORKFLOW_RUN_EVENT_TYPE_CANCELLED,
75
77
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_TIMED_OUT]: RunEventType.WORKFLOW_RUN_EVENT_TYPE_TIMED_OUT,
76
78
  [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_UNKNOWN]: undefined,
79
+ [dispatcher_1.ResourceEventType.RESOURCE_EVENT_TYPE_STREAM]: undefined,
77
80
  [dispatcher_1.ResourceEventType.UNRECOGNIZED]: undefined,
78
81
  };
79
82
  const resourceTypeMap = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hatchet-dev/typescript-sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Background task orchestration & visibility for developers",
5
5
  "types": "dist/index.d.ts",
6
6
  "files": [
@@ -42,6 +42,7 @@ export declare enum ResourceEventType {
42
42
  RESOURCE_EVENT_TYPE_FAILED = 3,
43
43
  RESOURCE_EVENT_TYPE_CANCELLED = 4,
44
44
  RESOURCE_EVENT_TYPE_TIMED_OUT = 5,
45
+ RESOURCE_EVENT_TYPE_STREAM = 6,
45
46
  UNRECOGNIZED = -1
46
47
  }
47
48
  export declare function resourceEventTypeFromJSON(object: any): ResourceEventType;
@@ -178,6 +179,14 @@ export interface OverridesData {
178
179
  }
179
180
  export interface OverridesDataResponse {
180
181
  }
182
+ export interface HeartbeatRequest {
183
+ /** the id of the worker */
184
+ workerId: string;
185
+ /** heartbeatAt is the time the worker sent the heartbeat */
186
+ heartbeatAt: Date | undefined;
187
+ }
188
+ export interface HeartbeatResponse {
189
+ }
181
190
  export declare const WorkerRegisterRequest: {
182
191
  encode(message: WorkerRegisterRequest, writer?: _m0.Writer): _m0.Writer;
183
192
  decode(input: _m0.Reader | Uint8Array, length?: number): WorkerRegisterRequest;
@@ -282,6 +291,22 @@ export declare const OverridesDataResponse: {
282
291
  create(base?: DeepPartial<OverridesDataResponse>): OverridesDataResponse;
283
292
  fromPartial(_: DeepPartial<OverridesDataResponse>): OverridesDataResponse;
284
293
  };
294
+ export declare const HeartbeatRequest: {
295
+ encode(message: HeartbeatRequest, writer?: _m0.Writer): _m0.Writer;
296
+ decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatRequest;
297
+ fromJSON(object: any): HeartbeatRequest;
298
+ toJSON(message: HeartbeatRequest): unknown;
299
+ create(base?: DeepPartial<HeartbeatRequest>): HeartbeatRequest;
300
+ fromPartial(object: DeepPartial<HeartbeatRequest>): HeartbeatRequest;
301
+ };
302
+ export declare const HeartbeatResponse: {
303
+ encode(_: HeartbeatResponse, writer?: _m0.Writer): _m0.Writer;
304
+ decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatResponse;
305
+ fromJSON(_: any): HeartbeatResponse;
306
+ toJSON(_: HeartbeatResponse): unknown;
307
+ create(base?: DeepPartial<HeartbeatResponse>): HeartbeatResponse;
308
+ fromPartial(_: DeepPartial<HeartbeatResponse>): HeartbeatResponse;
309
+ };
285
310
  export type DispatcherDefinition = typeof DispatcherDefinition;
286
311
  export declare const DispatcherDefinition: {
287
312
  readonly name: "Dispatcher";
@@ -331,6 +356,55 @@ export declare const DispatcherDefinition: {
331
356
  readonly responseStream: true;
332
357
  readonly options: {};
333
358
  };
359
+ /**
360
+ * ListenV2 is like listen, but implementation does not include heartbeats. This should only used by SDKs
361
+ * against engine version v0.18.1+
362
+ */
363
+ readonly listenV2: {
364
+ readonly name: "ListenV2";
365
+ readonly requestType: {
366
+ encode(message: WorkerListenRequest, writer?: _m0.Writer): _m0.Writer;
367
+ decode(input: _m0.Reader | Uint8Array, length?: number): WorkerListenRequest;
368
+ fromJSON(object: any): WorkerListenRequest;
369
+ toJSON(message: WorkerListenRequest): unknown;
370
+ create(base?: DeepPartial<WorkerListenRequest>): WorkerListenRequest;
371
+ fromPartial(object: DeepPartial<WorkerListenRequest>): WorkerListenRequest;
372
+ };
373
+ readonly requestStream: false;
374
+ readonly responseType: {
375
+ encode(message: AssignedAction, writer?: _m0.Writer): _m0.Writer;
376
+ decode(input: _m0.Reader | Uint8Array, length?: number): AssignedAction;
377
+ fromJSON(object: any): AssignedAction;
378
+ toJSON(message: AssignedAction): unknown;
379
+ create(base?: DeepPartial<AssignedAction>): AssignedAction;
380
+ fromPartial(object: DeepPartial<AssignedAction>): AssignedAction;
381
+ };
382
+ readonly responseStream: true;
383
+ readonly options: {};
384
+ };
385
+ /** Heartbeat is a method for workers to send heartbeats to the dispatcher */
386
+ readonly heartbeat: {
387
+ readonly name: "Heartbeat";
388
+ readonly requestType: {
389
+ encode(message: HeartbeatRequest, writer?: _m0.Writer): _m0.Writer;
390
+ decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatRequest;
391
+ fromJSON(object: any): HeartbeatRequest;
392
+ toJSON(message: HeartbeatRequest): unknown;
393
+ create(base?: DeepPartial<HeartbeatRequest>): HeartbeatRequest;
394
+ fromPartial(object: DeepPartial<HeartbeatRequest>): HeartbeatRequest;
395
+ };
396
+ readonly requestStream: false;
397
+ readonly responseType: {
398
+ encode(_: HeartbeatResponse, writer?: _m0.Writer): _m0.Writer;
399
+ decode(input: _m0.Reader | Uint8Array, length?: number): HeartbeatResponse;
400
+ fromJSON(_: any): HeartbeatResponse;
401
+ toJSON(_: HeartbeatResponse): unknown;
402
+ create(base?: DeepPartial<HeartbeatResponse>): HeartbeatResponse;
403
+ fromPartial(_: DeepPartial<HeartbeatResponse>): HeartbeatResponse;
404
+ };
405
+ readonly responseStream: false;
406
+ readonly options: {};
407
+ };
334
408
  readonly subscribeToWorkflowEvents: {
335
409
  readonly name: "SubscribeToWorkflowEvents";
336
410
  readonly requestType: {
@@ -446,6 +520,13 @@ export declare const DispatcherDefinition: {
446
520
  export interface DispatcherServiceImplementation<CallContextExt = {}> {
447
521
  register(request: WorkerRegisterRequest, context: CallContext & CallContextExt): Promise<DeepPartial<WorkerRegisterResponse>>;
448
522
  listen(request: WorkerListenRequest, context: CallContext & CallContextExt): ServerStreamingMethodResult<DeepPartial<AssignedAction>>;
523
+ /**
524
+ * ListenV2 is like listen, but implementation does not include heartbeats. This should only used by SDKs
525
+ * against engine version v0.18.1+
526
+ */
527
+ listenV2(request: WorkerListenRequest, context: CallContext & CallContextExt): ServerStreamingMethodResult<DeepPartial<AssignedAction>>;
528
+ /** Heartbeat is a method for workers to send heartbeats to the dispatcher */
529
+ heartbeat(request: HeartbeatRequest, context: CallContext & CallContextExt): Promise<DeepPartial<HeartbeatResponse>>;
449
530
  subscribeToWorkflowEvents(request: SubscribeToWorkflowEventsRequest, context: CallContext & CallContextExt): ServerStreamingMethodResult<DeepPartial<WorkflowEvent>>;
450
531
  sendStepActionEvent(request: StepActionEvent, context: CallContext & CallContextExt): Promise<DeepPartial<ActionEventResponse>>;
451
532
  sendGroupKeyActionEvent(request: GroupKeyActionEvent, context: CallContext & CallContextExt): Promise<DeepPartial<ActionEventResponse>>;
@@ -455,6 +536,13 @@ export interface DispatcherServiceImplementation<CallContextExt = {}> {
455
536
  export interface DispatcherClient<CallOptionsExt = {}> {
456
537
  register(request: DeepPartial<WorkerRegisterRequest>, options?: CallOptions & CallOptionsExt): Promise<WorkerRegisterResponse>;
457
538
  listen(request: DeepPartial<WorkerListenRequest>, options?: CallOptions & CallOptionsExt): AsyncIterable<AssignedAction>;
539
+ /**
540
+ * ListenV2 is like listen, but implementation does not include heartbeats. This should only used by SDKs
541
+ * against engine version v0.18.1+
542
+ */
543
+ listenV2(request: DeepPartial<WorkerListenRequest>, options?: CallOptions & CallOptionsExt): AsyncIterable<AssignedAction>;
544
+ /** Heartbeat is a method for workers to send heartbeats to the dispatcher */
545
+ heartbeat(request: DeepPartial<HeartbeatRequest>, options?: CallOptions & CallOptionsExt): Promise<HeartbeatResponse>;
458
546
  subscribeToWorkflowEvents(request: DeepPartial<SubscribeToWorkflowEventsRequest>, options?: CallOptions & CallOptionsExt): AsyncIterable<WorkflowEvent>;
459
547
  sendStepActionEvent(request: DeepPartial<StepActionEvent>, options?: CallOptions & CallOptionsExt): Promise<ActionEventResponse>;
460
548
  sendGroupKeyActionEvent(request: DeepPartial<GroupKeyActionEvent>, options?: CallOptions & CallOptionsExt): Promise<ActionEventResponse>;
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.DispatcherDefinition = exports.OverridesDataResponse = exports.OverridesData = exports.WorkflowEvent = exports.SubscribeToWorkflowEventsRequest = exports.ActionEventResponse = exports.StepActionEvent = exports.GroupKeyActionEvent = exports.WorkerUnsubscribeResponse = exports.WorkerUnsubscribeRequest = exports.WorkerListenRequest = exports.AssignedAction = exports.WorkerRegisterResponse = exports.WorkerRegisterRequest = exports.resourceEventTypeToJSON = exports.resourceEventTypeFromJSON = exports.ResourceEventType = exports.resourceTypeToJSON = exports.resourceTypeFromJSON = exports.ResourceType = exports.stepActionEventTypeToJSON = exports.stepActionEventTypeFromJSON = exports.StepActionEventType = exports.groupKeyActionEventTypeToJSON = exports.groupKeyActionEventTypeFromJSON = exports.GroupKeyActionEventType = exports.actionTypeToJSON = exports.actionTypeFromJSON = exports.ActionType = exports.protobufPackage = void 0;
26
+ exports.DispatcherDefinition = exports.HeartbeatResponse = exports.HeartbeatRequest = exports.OverridesDataResponse = exports.OverridesData = exports.WorkflowEvent = exports.SubscribeToWorkflowEventsRequest = exports.ActionEventResponse = exports.StepActionEvent = exports.GroupKeyActionEvent = exports.WorkerUnsubscribeResponse = exports.WorkerUnsubscribeRequest = exports.WorkerListenRequest = exports.AssignedAction = exports.WorkerRegisterResponse = exports.WorkerRegisterRequest = exports.resourceEventTypeToJSON = exports.resourceEventTypeFromJSON = exports.ResourceEventType = exports.resourceTypeToJSON = exports.resourceTypeFromJSON = exports.ResourceType = exports.stepActionEventTypeToJSON = exports.stepActionEventTypeFromJSON = exports.StepActionEventType = exports.groupKeyActionEventTypeToJSON = exports.groupKeyActionEventTypeFromJSON = exports.GroupKeyActionEventType = exports.actionTypeToJSON = exports.actionTypeFromJSON = exports.ActionType = exports.protobufPackage = void 0;
27
27
  const _m0 = __importStar(require("protobufjs/minimal"));
28
28
  const timestamp_1 = require("../google/protobuf/timestamp");
29
29
  exports.protobufPackage = '';
@@ -203,6 +203,7 @@ var ResourceEventType;
203
203
  ResourceEventType[ResourceEventType["RESOURCE_EVENT_TYPE_FAILED"] = 3] = "RESOURCE_EVENT_TYPE_FAILED";
204
204
  ResourceEventType[ResourceEventType["RESOURCE_EVENT_TYPE_CANCELLED"] = 4] = "RESOURCE_EVENT_TYPE_CANCELLED";
205
205
  ResourceEventType[ResourceEventType["RESOURCE_EVENT_TYPE_TIMED_OUT"] = 5] = "RESOURCE_EVENT_TYPE_TIMED_OUT";
206
+ ResourceEventType[ResourceEventType["RESOURCE_EVENT_TYPE_STREAM"] = 6] = "RESOURCE_EVENT_TYPE_STREAM";
206
207
  ResourceEventType[ResourceEventType["UNRECOGNIZED"] = -1] = "UNRECOGNIZED";
207
208
  })(ResourceEventType || (exports.ResourceEventType = ResourceEventType = {}));
208
209
  function resourceEventTypeFromJSON(object) {
@@ -225,6 +226,9 @@ function resourceEventTypeFromJSON(object) {
225
226
  case 5:
226
227
  case 'RESOURCE_EVENT_TYPE_TIMED_OUT':
227
228
  return ResourceEventType.RESOURCE_EVENT_TYPE_TIMED_OUT;
229
+ case 6:
230
+ case 'RESOURCE_EVENT_TYPE_STREAM':
231
+ return ResourceEventType.RESOURCE_EVENT_TYPE_STREAM;
228
232
  case -1:
229
233
  case 'UNRECOGNIZED':
230
234
  default:
@@ -246,6 +250,8 @@ function resourceEventTypeToJSON(object) {
246
250
  return 'RESOURCE_EVENT_TYPE_CANCELLED';
247
251
  case ResourceEventType.RESOURCE_EVENT_TYPE_TIMED_OUT:
248
252
  return 'RESOURCE_EVENT_TYPE_TIMED_OUT';
253
+ case ResourceEventType.RESOURCE_EVENT_TYPE_STREAM:
254
+ return 'RESOURCE_EVENT_TYPE_STREAM';
249
255
  case ResourceEventType.UNRECOGNIZED:
250
256
  default:
251
257
  return 'UNRECOGNIZED';
@@ -1579,6 +1585,110 @@ exports.OverridesDataResponse = {
1579
1585
  return message;
1580
1586
  },
1581
1587
  };
1588
+ function createBaseHeartbeatRequest() {
1589
+ return { workerId: '', heartbeatAt: undefined };
1590
+ }
1591
+ exports.HeartbeatRequest = {
1592
+ encode(message, writer = _m0.Writer.create()) {
1593
+ if (message.workerId !== '') {
1594
+ writer.uint32(10).string(message.workerId);
1595
+ }
1596
+ if (message.heartbeatAt !== undefined) {
1597
+ timestamp_1.Timestamp.encode(toTimestamp(message.heartbeatAt), writer.uint32(18).fork()).ldelim();
1598
+ }
1599
+ return writer;
1600
+ },
1601
+ decode(input, length) {
1602
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
1603
+ let end = length === undefined ? reader.len : reader.pos + length;
1604
+ const message = createBaseHeartbeatRequest();
1605
+ while (reader.pos < end) {
1606
+ const tag = reader.uint32();
1607
+ switch (tag >>> 3) {
1608
+ case 1:
1609
+ if (tag !== 10) {
1610
+ break;
1611
+ }
1612
+ message.workerId = reader.string();
1613
+ continue;
1614
+ case 2:
1615
+ if (tag !== 18) {
1616
+ break;
1617
+ }
1618
+ message.heartbeatAt = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
1619
+ continue;
1620
+ }
1621
+ if ((tag & 7) === 4 || tag === 0) {
1622
+ break;
1623
+ }
1624
+ reader.skipType(tag & 7);
1625
+ }
1626
+ return message;
1627
+ },
1628
+ fromJSON(object) {
1629
+ return {
1630
+ workerId: isSet(object.workerId) ? globalThis.String(object.workerId) : '',
1631
+ heartbeatAt: isSet(object.heartbeatAt) ? fromJsonTimestamp(object.heartbeatAt) : undefined,
1632
+ };
1633
+ },
1634
+ toJSON(message) {
1635
+ const obj = {};
1636
+ if (message.workerId !== '') {
1637
+ obj.workerId = message.workerId;
1638
+ }
1639
+ if (message.heartbeatAt !== undefined) {
1640
+ obj.heartbeatAt = message.heartbeatAt.toISOString();
1641
+ }
1642
+ return obj;
1643
+ },
1644
+ create(base) {
1645
+ return exports.HeartbeatRequest.fromPartial(base !== null && base !== void 0 ? base : {});
1646
+ },
1647
+ fromPartial(object) {
1648
+ var _a, _b;
1649
+ const message = createBaseHeartbeatRequest();
1650
+ message.workerId = (_a = object.workerId) !== null && _a !== void 0 ? _a : '';
1651
+ message.heartbeatAt = (_b = object.heartbeatAt) !== null && _b !== void 0 ? _b : undefined;
1652
+ return message;
1653
+ },
1654
+ };
1655
+ function createBaseHeartbeatResponse() {
1656
+ return {};
1657
+ }
1658
+ exports.HeartbeatResponse = {
1659
+ encode(_, writer = _m0.Writer.create()) {
1660
+ return writer;
1661
+ },
1662
+ decode(input, length) {
1663
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
1664
+ let end = length === undefined ? reader.len : reader.pos + length;
1665
+ const message = createBaseHeartbeatResponse();
1666
+ while (reader.pos < end) {
1667
+ const tag = reader.uint32();
1668
+ switch (tag >>> 3) {
1669
+ }
1670
+ if ((tag & 7) === 4 || tag === 0) {
1671
+ break;
1672
+ }
1673
+ reader.skipType(tag & 7);
1674
+ }
1675
+ return message;
1676
+ },
1677
+ fromJSON(_) {
1678
+ return {};
1679
+ },
1680
+ toJSON(_) {
1681
+ const obj = {};
1682
+ return obj;
1683
+ },
1684
+ create(base) {
1685
+ return exports.HeartbeatResponse.fromPartial(base !== null && base !== void 0 ? base : {});
1686
+ },
1687
+ fromPartial(_) {
1688
+ const message = createBaseHeartbeatResponse();
1689
+ return message;
1690
+ },
1691
+ };
1582
1692
  exports.DispatcherDefinition = {
1583
1693
  name: 'Dispatcher',
1584
1694
  fullName: 'Dispatcher',
@@ -1599,6 +1709,27 @@ exports.DispatcherDefinition = {
1599
1709
  responseStream: true,
1600
1710
  options: {},
1601
1711
  },
1712
+ /**
1713
+ * ListenV2 is like listen, but implementation does not include heartbeats. This should only used by SDKs
1714
+ * against engine version v0.18.1+
1715
+ */
1716
+ listenV2: {
1717
+ name: 'ListenV2',
1718
+ requestType: exports.WorkerListenRequest,
1719
+ requestStream: false,
1720
+ responseType: exports.AssignedAction,
1721
+ responseStream: true,
1722
+ options: {},
1723
+ },
1724
+ /** Heartbeat is a method for workers to send heartbeats to the dispatcher */
1725
+ heartbeat: {
1726
+ name: 'Heartbeat',
1727
+ requestType: exports.HeartbeatRequest,
1728
+ requestStream: false,
1729
+ responseType: exports.HeartbeatResponse,
1730
+ responseStream: false,
1731
+ options: {},
1732
+ },
1602
1733
  subscribeToWorkflowEvents: {
1603
1734
  name: 'SubscribeToWorkflowEvents',
1604
1735
  requestType: exports.SubscribeToWorkflowEventsRequest,
@@ -27,6 +27,18 @@ export interface PutLogRequest {
27
27
  }
28
28
  export interface PutLogResponse {
29
29
  }
30
+ export interface PutStreamEventRequest {
31
+ /** the step run id for the request */
32
+ stepRunId: string;
33
+ /** when the stream event was created */
34
+ createdAt: Date | undefined;
35
+ /** the stream event message */
36
+ message: Uint8Array;
37
+ /** associated stream event metadata */
38
+ metadata: string;
39
+ }
40
+ export interface PutStreamEventResponse {
41
+ }
30
42
  export interface PushEventRequest {
31
43
  /** the key for the event */
32
44
  key: string;
@@ -63,6 +75,22 @@ export declare const PutLogResponse: {
63
75
  create(base?: DeepPartial<PutLogResponse>): PutLogResponse;
64
76
  fromPartial(_: DeepPartial<PutLogResponse>): PutLogResponse;
65
77
  };
78
+ export declare const PutStreamEventRequest: {
79
+ encode(message: PutStreamEventRequest, writer?: _m0.Writer): _m0.Writer;
80
+ decode(input: _m0.Reader | Uint8Array, length?: number): PutStreamEventRequest;
81
+ fromJSON(object: any): PutStreamEventRequest;
82
+ toJSON(message: PutStreamEventRequest): unknown;
83
+ create(base?: DeepPartial<PutStreamEventRequest>): PutStreamEventRequest;
84
+ fromPartial(object: DeepPartial<PutStreamEventRequest>): PutStreamEventRequest;
85
+ };
86
+ export declare const PutStreamEventResponse: {
87
+ encode(_: PutStreamEventResponse, writer?: _m0.Writer): _m0.Writer;
88
+ decode(input: _m0.Reader | Uint8Array, length?: number): PutStreamEventResponse;
89
+ fromJSON(_: any): PutStreamEventResponse;
90
+ toJSON(_: PutStreamEventResponse): unknown;
91
+ create(base?: DeepPartial<PutStreamEventResponse>): PutStreamEventResponse;
92
+ fromPartial(_: DeepPartial<PutStreamEventResponse>): PutStreamEventResponse;
93
+ };
66
94
  export declare const PushEventRequest: {
67
95
  encode(message: PushEventRequest, writer?: _m0.Writer): _m0.Writer;
68
96
  decode(input: _m0.Reader | Uint8Array, length?: number): PushEventRequest;
@@ -150,17 +178,41 @@ export declare const EventsServiceDefinition: {
150
178
  readonly responseStream: false;
151
179
  readonly options: {};
152
180
  };
181
+ readonly putStreamEvent: {
182
+ readonly name: "PutStreamEvent";
183
+ readonly requestType: {
184
+ encode(message: PutStreamEventRequest, writer?: _m0.Writer): _m0.Writer;
185
+ decode(input: _m0.Reader | Uint8Array, length?: number): PutStreamEventRequest;
186
+ fromJSON(object: any): PutStreamEventRequest;
187
+ toJSON(message: PutStreamEventRequest): unknown;
188
+ create(base?: DeepPartial<PutStreamEventRequest>): PutStreamEventRequest;
189
+ fromPartial(object: DeepPartial<PutStreamEventRequest>): PutStreamEventRequest;
190
+ };
191
+ readonly requestStream: false;
192
+ readonly responseType: {
193
+ encode(_: PutStreamEventResponse, writer?: _m0.Writer): _m0.Writer;
194
+ decode(input: _m0.Reader | Uint8Array, length?: number): PutStreamEventResponse;
195
+ fromJSON(_: any): PutStreamEventResponse;
196
+ toJSON(_: PutStreamEventResponse): unknown;
197
+ create(base?: DeepPartial<PutStreamEventResponse>): PutStreamEventResponse;
198
+ fromPartial(_: DeepPartial<PutStreamEventResponse>): PutStreamEventResponse;
199
+ };
200
+ readonly responseStream: false;
201
+ readonly options: {};
202
+ };
153
203
  };
154
204
  };
155
205
  export interface EventsServiceImplementation<CallContextExt = {}> {
156
206
  push(request: PushEventRequest, context: CallContext & CallContextExt): Promise<DeepPartial<Event>>;
157
207
  replaySingleEvent(request: ReplayEventRequest, context: CallContext & CallContextExt): Promise<DeepPartial<Event>>;
158
208
  putLog(request: PutLogRequest, context: CallContext & CallContextExt): Promise<DeepPartial<PutLogResponse>>;
209
+ putStreamEvent(request: PutStreamEventRequest, context: CallContext & CallContextExt): Promise<DeepPartial<PutStreamEventResponse>>;
159
210
  }
160
211
  export interface EventsServiceClient<CallOptionsExt = {}> {
161
212
  push(request: DeepPartial<PushEventRequest>, options?: CallOptions & CallOptionsExt): Promise<Event>;
162
213
  replaySingleEvent(request: DeepPartial<ReplayEventRequest>, options?: CallOptions & CallOptionsExt): Promise<Event>;
163
214
  putLog(request: DeepPartial<PutLogRequest>, options?: CallOptions & CallOptionsExt): Promise<PutLogResponse>;
215
+ putStreamEvent(request: DeepPartial<PutStreamEventRequest>, options?: CallOptions & CallOptionsExt): Promise<PutStreamEventResponse>;
164
216
  }
165
217
  type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
166
218
  export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.EventsServiceDefinition = exports.ReplayEventRequest = exports.PushEventRequest = exports.PutLogResponse = exports.PutLogRequest = exports.Event = exports.protobufPackage = void 0;
26
+ exports.EventsServiceDefinition = exports.ReplayEventRequest = exports.PushEventRequest = exports.PutStreamEventResponse = exports.PutStreamEventRequest = exports.PutLogResponse = exports.PutLogRequest = exports.Event = exports.protobufPackage = void 0;
27
27
  const _m0 = __importStar(require("protobufjs/minimal"));
28
28
  const timestamp_1 = require("../google/protobuf/timestamp");
29
29
  exports.protobufPackage = '';
@@ -284,6 +284,138 @@ exports.PutLogResponse = {
284
284
  return message;
285
285
  },
286
286
  };
287
+ function createBasePutStreamEventRequest() {
288
+ return { stepRunId: '', createdAt: undefined, message: new Uint8Array(0), metadata: '' };
289
+ }
290
+ exports.PutStreamEventRequest = {
291
+ encode(message, writer = _m0.Writer.create()) {
292
+ if (message.stepRunId !== '') {
293
+ writer.uint32(10).string(message.stepRunId);
294
+ }
295
+ if (message.createdAt !== undefined) {
296
+ timestamp_1.Timestamp.encode(toTimestamp(message.createdAt), writer.uint32(18).fork()).ldelim();
297
+ }
298
+ if (message.message.length !== 0) {
299
+ writer.uint32(26).bytes(message.message);
300
+ }
301
+ if (message.metadata !== '') {
302
+ writer.uint32(42).string(message.metadata);
303
+ }
304
+ return writer;
305
+ },
306
+ decode(input, length) {
307
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
308
+ let end = length === undefined ? reader.len : reader.pos + length;
309
+ const message = createBasePutStreamEventRequest();
310
+ while (reader.pos < end) {
311
+ const tag = reader.uint32();
312
+ switch (tag >>> 3) {
313
+ case 1:
314
+ if (tag !== 10) {
315
+ break;
316
+ }
317
+ message.stepRunId = reader.string();
318
+ continue;
319
+ case 2:
320
+ if (tag !== 18) {
321
+ break;
322
+ }
323
+ message.createdAt = fromTimestamp(timestamp_1.Timestamp.decode(reader, reader.uint32()));
324
+ continue;
325
+ case 3:
326
+ if (tag !== 26) {
327
+ break;
328
+ }
329
+ message.message = reader.bytes();
330
+ continue;
331
+ case 5:
332
+ if (tag !== 42) {
333
+ break;
334
+ }
335
+ message.metadata = reader.string();
336
+ continue;
337
+ }
338
+ if ((tag & 7) === 4 || tag === 0) {
339
+ break;
340
+ }
341
+ reader.skipType(tag & 7);
342
+ }
343
+ return message;
344
+ },
345
+ fromJSON(object) {
346
+ return {
347
+ stepRunId: isSet(object.stepRunId) ? globalThis.String(object.stepRunId) : '',
348
+ createdAt: isSet(object.createdAt) ? fromJsonTimestamp(object.createdAt) : undefined,
349
+ message: isSet(object.message) ? bytesFromBase64(object.message) : new Uint8Array(0),
350
+ metadata: isSet(object.metadata) ? globalThis.String(object.metadata) : '',
351
+ };
352
+ },
353
+ toJSON(message) {
354
+ const obj = {};
355
+ if (message.stepRunId !== '') {
356
+ obj.stepRunId = message.stepRunId;
357
+ }
358
+ if (message.createdAt !== undefined) {
359
+ obj.createdAt = message.createdAt.toISOString();
360
+ }
361
+ if (message.message.length !== 0) {
362
+ obj.message = base64FromBytes(message.message);
363
+ }
364
+ if (message.metadata !== '') {
365
+ obj.metadata = message.metadata;
366
+ }
367
+ return obj;
368
+ },
369
+ create(base) {
370
+ return exports.PutStreamEventRequest.fromPartial(base !== null && base !== void 0 ? base : {});
371
+ },
372
+ fromPartial(object) {
373
+ var _a, _b, _c, _d;
374
+ const message = createBasePutStreamEventRequest();
375
+ message.stepRunId = (_a = object.stepRunId) !== null && _a !== void 0 ? _a : '';
376
+ message.createdAt = (_b = object.createdAt) !== null && _b !== void 0 ? _b : undefined;
377
+ message.message = (_c = object.message) !== null && _c !== void 0 ? _c : new Uint8Array(0);
378
+ message.metadata = (_d = object.metadata) !== null && _d !== void 0 ? _d : '';
379
+ return message;
380
+ },
381
+ };
382
+ function createBasePutStreamEventResponse() {
383
+ return {};
384
+ }
385
+ exports.PutStreamEventResponse = {
386
+ encode(_, writer = _m0.Writer.create()) {
387
+ return writer;
388
+ },
389
+ decode(input, length) {
390
+ const reader = input instanceof _m0.Reader ? input : _m0.Reader.create(input);
391
+ let end = length === undefined ? reader.len : reader.pos + length;
392
+ const message = createBasePutStreamEventResponse();
393
+ while (reader.pos < end) {
394
+ const tag = reader.uint32();
395
+ switch (tag >>> 3) {
396
+ }
397
+ if ((tag & 7) === 4 || tag === 0) {
398
+ break;
399
+ }
400
+ reader.skipType(tag & 7);
401
+ }
402
+ return message;
403
+ },
404
+ fromJSON(_) {
405
+ return {};
406
+ },
407
+ toJSON(_) {
408
+ const obj = {};
409
+ return obj;
410
+ },
411
+ create(base) {
412
+ return exports.PutStreamEventResponse.fromPartial(base !== null && base !== void 0 ? base : {});
413
+ },
414
+ fromPartial(_) {
415
+ const message = createBasePutStreamEventResponse();
416
+ return message;
417
+ },
418
+ };
287
419
  function createBasePushEventRequest() {
288
420
  return { key: '', payload: '', eventTimestamp: undefined };
289
421
  }
@@ -446,8 +578,41 @@ exports.EventsServiceDefinition = {
446
578
  responseStream: false,
447
579
  options: {},
448
580
  },
581
+ putStreamEvent: {
582
+ name: 'PutStreamEvent',
583
+ requestType: exports.PutStreamEventRequest,
584
+ requestStream: false,
585
+ responseType: exports.PutStreamEventResponse,
586
+ responseStream: false,
587
+ options: {},
588
+ },
449
589
  },
450
590
  };
591
+ function bytesFromBase64(b64) {
592
+ if (globalThis.Buffer) {
593
+ return Uint8Array.from(globalThis.Buffer.from(b64, 'base64'));
594
+ }
595
+ else {
596
+ const bin = globalThis.atob(b64);
597
+ const arr = new Uint8Array(bin.length);
598
+ for (let i = 0; i < bin.length; ++i) {
599
+ arr[i] = bin.charCodeAt(i);
600
+ }
601
+ return arr;
602
+ }
603
+ }
604
+ function base64FromBytes(arr) {
605
+ if (globalThis.Buffer) {
606
+ return globalThis.Buffer.from(arr).toString('base64');
607
+ }
608
+ else {
609
+ const bin = [];
610
+ arr.forEach((byte) => {
611
+ bin.push(globalThis.String.fromCharCode(byte));
612
+ });
613
+ return globalThis.btoa(bin.join(''));
614
+ }
615
+ }
451
616
  function toTimestamp(date) {
452
617
  const seconds = Math.trunc(date.getTime() / 1000);
453
618
  const nanos = (date.getTime() % 1000) * 1000000;
package/step.d.ts CHANGED
@@ -59,6 +59,7 @@ export declare class Context<T, K> {
59
59
  workflowRunId(): string;
60
60
  playground(name: string, defaultValue?: string): string;
61
61
  log(message: string, level?: LogLevel): void;
62
+ putStream(data: string | Uint8Array): Promise<void>;
62
63
  spawnWorkflow<P = unknown>(workflowName: string, input: T, key?: string): ChildWorkflowRef<P>;
63
64
  }
64
65
  export type StepRunFunction<T, K> = (ctx: Context<T, K>) => Promise<NextStep> | NextStep | void;
package/step.js CHANGED
@@ -182,6 +182,17 @@ class Context {
182
182
  }
183
183
  this.client.event.putLog(stepRunId, message, level);
184
184
  }
185
+ putStream(data) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ const { stepRunId } = this.action;
188
+ if (!stepRunId) {
189
+ // log a warning
190
+ this.logger.warn('cannot log from context without stepRunId');
191
+ return;
192
+ }
193
+ yield this.client.event.putStream(stepRunId, data);
194
+ });
195
+ }
185
196
  spawnWorkflow(workflowName, input, key) {
186
197
  const { workflowRunId, stepRunId } = this.action;
187
198
  const childWorkflowRunIdPromise = this.client.admin.run_workflow(workflowName, input, {