@flowcore/pathways 0.14.0 → 0.15.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/CHANGELOG.md +16 -0
- package/README.md +34 -31
- package/esm/pathways/builder.d.ts +14 -6
- package/esm/pathways/builder.d.ts.map +1 -1
- package/esm/pathways/builder.js +46 -111
- package/esm/pathways/session-pathway.js +1 -1
- package/esm/pathways/types.d.ts +20 -3
- package/esm/pathways/types.d.ts.map +1 -1
- package/esm/pathways/types.js +18 -1
- package/package.json +2 -1
- package/script/pathways/builder.d.ts +14 -6
- package/script/pathways/builder.d.ts.map +1 -1
- package/script/pathways/builder.js +46 -111
- package/script/pathways/session-pathway.js +1 -1
- package/script/pathways/types.d.ts +20 -3
- package/script/pathways/types.d.ts.map +1 -1
- package/script/pathways/types.js +19 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.15.0](https://github.com/flowcore-io/flowcore-pathways/compare/v0.14.0...v0.15.0) (2025-05-27)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* file writer + changes to write and writeBatch args ([5cbbb8f](https://github.com/flowcore-io/flowcore-pathways/commit/5cbbb8f83c5b8cdba11436565c4d36c1ad3faa61))
|
|
9
|
+
* unified write method ([19f00bd](https://github.com/flowcore-io/flowcore-pathways/commit/19f00bd550d5b167e0104d9c8ef5a2751a909041))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* fix session pathway ([5b8b1a0](https://github.com/flowcore-io/flowcore-pathways/commit/5b8b1a0b846f97adb679ce79ddd61bdc8868caf9))
|
|
15
|
+
* fix types ([2235058](https://github.com/flowcore-io/flowcore-pathways/commit/22350588845db0a1e320d80928653210048b9a29))
|
|
16
|
+
* update readme ([2285c96](https://github.com/flowcore-io/flowcore-pathways/commit/2285c960d9f3d95c09092c91ab8b93b4fc98a94f))
|
|
17
|
+
* update tests and readme ([c3af713](https://github.com/flowcore-io/flowcore-pathways/commit/c3af7133196bb5da5cf7f342c2922bb7ad778fe9))
|
|
18
|
+
|
|
3
19
|
## [0.14.0](https://github.com/flowcore-io/flowcore-pathways/compare/v0.13.2...v0.14.0) (2025-05-23)
|
|
4
20
|
|
|
5
21
|
|
package/README.md
CHANGED
|
@@ -88,9 +88,11 @@ pathways
|
|
|
88
88
|
|
|
89
89
|
// You can write to another pathway if needed
|
|
90
90
|
await pathways.write("notifications/sent", {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
data: {
|
|
92
|
+
userId: event.payload.id,
|
|
93
|
+
message: `Welcome ${event.payload.name}!`,
|
|
94
|
+
channel: "email",
|
|
95
|
+
},
|
|
94
96
|
})
|
|
95
97
|
})
|
|
96
98
|
```
|
|
@@ -182,31 +184,32 @@ Send events to pathways:
|
|
|
182
184
|
```typescript
|
|
183
185
|
// Basic write
|
|
184
186
|
const eventId = await pathways.write("order/placed", {
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
187
|
+
data: {
|
|
188
|
+
orderId: "ord-123",
|
|
189
|
+
userId: "user-456",
|
|
190
|
+
total: 99.99,
|
|
191
|
+
items: [
|
|
192
|
+
{ id: "item-1", quantity: 2 },
|
|
193
|
+
],
|
|
194
|
+
},
|
|
191
195
|
})
|
|
192
196
|
|
|
193
197
|
// Write with metadata
|
|
194
|
-
const eventId2 = await pathways.write(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
{
|
|
198
|
+
const eventId2 = await pathways.write("order/placed", {
|
|
199
|
+
data: orderData,
|
|
200
|
+
metadata: {
|
|
198
201
|
correlationId: "corr-789",
|
|
199
202
|
source: "checkout-service",
|
|
200
203
|
},
|
|
201
|
-
)
|
|
204
|
+
})
|
|
202
205
|
|
|
203
206
|
// Fire-and-forget mode (doesn't wait for processing)
|
|
204
|
-
const eventId3 = await pathways.write(
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
)
|
|
207
|
+
const eventId3 = await pathways.write("order/placed", {
|
|
208
|
+
data: orderData,
|
|
209
|
+
options: {
|
|
210
|
+
fireAndForget: true,
|
|
211
|
+
},
|
|
212
|
+
})
|
|
210
213
|
```
|
|
211
214
|
|
|
212
215
|
### Error Handling
|
|
@@ -486,19 +489,19 @@ Events written through a session builder automatically include the session ID:
|
|
|
486
489
|
```typescript
|
|
487
490
|
// Write an event with session context
|
|
488
491
|
await session.write("order/placed", {
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
492
|
+
data: {
|
|
493
|
+
orderId: "ord-123",
|
|
494
|
+
userId: "user-456",
|
|
495
|
+
total: 99.99,
|
|
496
|
+
items: [{ id: "item-1", quantity: 2 }],
|
|
497
|
+
},
|
|
493
498
|
})
|
|
494
499
|
|
|
495
500
|
// You can override the session ID for a specific write
|
|
496
|
-
await session.write(
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
{ sessionId: "different-session" },
|
|
501
|
-
)
|
|
501
|
+
await session.write("order/placed", {
|
|
502
|
+
data: orderData,
|
|
503
|
+
options: { sessionId: "different-session" },
|
|
504
|
+
})
|
|
502
505
|
```
|
|
503
506
|
|
|
504
507
|
#### Session ID in Audit Events
|
|
@@ -513,7 +516,7 @@ pathways.withAudit((path, event) => {
|
|
|
513
516
|
})
|
|
514
517
|
|
|
515
518
|
// Now when writing events through a session
|
|
516
|
-
await session.write("order/placed", orderData)
|
|
519
|
+
await session.write("order/placed", { data: orderData })
|
|
517
520
|
// The session ID is automatically included in the audit metadata
|
|
518
521
|
```
|
|
519
522
|
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type AnyZodObject, z } from "zod";
|
|
2
2
|
import type { WebhookSendOptions } from "@flowcore/sdk-transformer-core";
|
|
3
3
|
import type { FlowcoreEvent } from "../contracts/event.js";
|
|
4
4
|
import type { Logger } from "./logger.js";
|
|
5
5
|
import type { EventMetadata, PathwayContract, PathwayKey, PathwayState, PathwayWriteOptions, WritablePathway } from "./types.js";
|
|
6
|
+
import { FileEventSchema, FileInputSchema } from "./types.js";
|
|
6
7
|
/**
|
|
7
8
|
* Defines the mode for auditing pathway operations
|
|
8
9
|
* - "user": Normal user-initiated operations
|
|
@@ -130,7 +131,9 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
130
131
|
private readonly globalErrorSubject;
|
|
131
132
|
private readonly writers;
|
|
132
133
|
private readonly batchWriters;
|
|
134
|
+
private readonly fileWriters;
|
|
133
135
|
private readonly schemas;
|
|
136
|
+
private readonly inputSchemas;
|
|
134
137
|
private readonly writable;
|
|
135
138
|
private readonly timeouts;
|
|
136
139
|
private readonly maxRetries;
|
|
@@ -247,13 +250,14 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
247
250
|
* @param contract The pathway contract describing the pathway
|
|
248
251
|
* @returns The PathwaysBuilder instance with the new pathway registered
|
|
249
252
|
*/
|
|
250
|
-
register<F extends string, E extends string, S extends
|
|
253
|
+
register<F extends string, E extends string, S extends AnyZodObject = AnyZodObject, W extends boolean = true, FP extends boolean = false>(contract: PathwayContract<F, E, S> & {
|
|
251
254
|
writable?: W;
|
|
252
255
|
maxRetries?: number;
|
|
253
256
|
retryDelayMs?: number;
|
|
257
|
+
isFilePathway?: FP;
|
|
254
258
|
}): PathwaysBuilder<TPathway & Record<PathwayKey<F, E>, {
|
|
255
|
-
output: z.infer<S>;
|
|
256
|
-
input: z.input<S>;
|
|
259
|
+
output: FP extends true ? z.infer<typeof FileEventSchema> & z.infer<S> : z.infer<S>;
|
|
260
|
+
input: FP extends true ? z.input<typeof FileInputSchema> & z.input<S> : z.input<S>;
|
|
257
261
|
}>, TWritablePaths | WritablePathway<PathwayKey<F, E>, W>>;
|
|
258
262
|
/**
|
|
259
263
|
* Gets a pathway instance by its path
|
|
@@ -301,8 +305,12 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
301
305
|
* @param options Optional write options
|
|
302
306
|
* @returns A promise that resolves to the event ID(s)
|
|
303
307
|
*/
|
|
304
|
-
write<TPath extends TWritablePaths>(path: TPath,
|
|
305
|
-
|
|
308
|
+
write<TPath extends TWritablePaths, B extends boolean = false>(path: TPath, input: {
|
|
309
|
+
batch?: B;
|
|
310
|
+
data: B extends true ? TPathway[TPath]["input"][] : TPathway[TPath]["input"];
|
|
311
|
+
metadata?: EventMetadata;
|
|
312
|
+
options?: PathwayWriteOptions;
|
|
313
|
+
}): Promise<string | string[]>;
|
|
306
314
|
/**
|
|
307
315
|
* Waits for a specific event to be processed
|
|
308
316
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/pathways/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/pathways/builder.ts"],"names":[],"mappings":"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"}
|
package/esm/pathways/builder.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import { fileTypeFromBuffer } from "file-type";
|
|
2
3
|
import { Subject } from "rxjs";
|
|
3
4
|
import { WebhookBuilder } from "../compatibility/flowcore-transformer-core.sdk.js";
|
|
4
5
|
import { InternalPathwayState } from "./internal-pathway.state.js";
|
|
5
6
|
import { NoopLogger } from "./logger.js";
|
|
6
7
|
import { AUDIT_ENTITY_TYPE, AUDIT_MODE, AUDIT_ON_BEHALF_OF, AUDIT_SYSTEM_MODE, AUDIT_USER_ID, AUDIT_USER_MODE, } from "./constants.js";
|
|
8
|
+
import { FileEventSchema, FileInputSchema } from "./types.js";
|
|
7
9
|
/**
|
|
8
10
|
* Default timeout for pathway processing in milliseconds (10 seconds)
|
|
9
11
|
*/
|
|
@@ -152,12 +154,24 @@ export class PathwaysBuilder {
|
|
|
152
154
|
writable: true,
|
|
153
155
|
value: {}
|
|
154
156
|
});
|
|
157
|
+
Object.defineProperty(this, "fileWriters", {
|
|
158
|
+
enumerable: true,
|
|
159
|
+
configurable: true,
|
|
160
|
+
writable: true,
|
|
161
|
+
value: {}
|
|
162
|
+
});
|
|
155
163
|
Object.defineProperty(this, "schemas", {
|
|
156
164
|
enumerable: true,
|
|
157
165
|
configurable: true,
|
|
158
166
|
writable: true,
|
|
159
167
|
value: {}
|
|
160
168
|
});
|
|
169
|
+
Object.defineProperty(this, "inputSchemas", {
|
|
170
|
+
enumerable: true,
|
|
171
|
+
configurable: true,
|
|
172
|
+
writable: true,
|
|
173
|
+
value: {}
|
|
174
|
+
});
|
|
161
175
|
Object.defineProperty(this, "writable", {
|
|
162
176
|
enumerable: true,
|
|
163
177
|
configurable: true,
|
|
@@ -541,7 +555,7 @@ export class PathwaysBuilder {
|
|
|
541
555
|
if (writable) {
|
|
542
556
|
if (contract.isFilePathway) {
|
|
543
557
|
this.filePathways.add(path);
|
|
544
|
-
this.
|
|
558
|
+
this.fileWriters[path] = this.webhookBuilderFactory()
|
|
545
559
|
.buildFileWebhook(contract.flowType, contract.eventType).send;
|
|
546
560
|
}
|
|
547
561
|
else {
|
|
@@ -561,13 +575,21 @@ export class PathwaysBuilder {
|
|
|
561
575
|
if (contract.retryDelayMs !== undefined) {
|
|
562
576
|
this.retryDelays[path] = contract.retryDelayMs;
|
|
563
577
|
}
|
|
564
|
-
|
|
578
|
+
if (contract.isFilePathway) {
|
|
579
|
+
this.schemas[path] = (contract.schema ?? z.object({})).merge(FileEventSchema);
|
|
580
|
+
this.inputSchemas[path] = (contract.schema ?? z.object({})).merge(FileInputSchema);
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
this.schemas[path] = contract.schema ?? z.object({});
|
|
584
|
+
this.inputSchemas[path] = contract.schema ?? z.object({});
|
|
585
|
+
}
|
|
565
586
|
this.writable[path] = writable;
|
|
566
587
|
this.logger.info(`Pathway registered successfully`, {
|
|
567
588
|
pathway: path,
|
|
568
589
|
flowType: contract.flowType,
|
|
569
590
|
eventType: contract.eventType,
|
|
570
591
|
writable,
|
|
592
|
+
isFilePathway: contract.isFilePathway,
|
|
571
593
|
});
|
|
572
594
|
return this;
|
|
573
595
|
}
|
|
@@ -678,8 +700,14 @@ export class PathwaysBuilder {
|
|
|
678
700
|
* @param options Optional write options
|
|
679
701
|
* @returns A promise that resolves to the event ID(s)
|
|
680
702
|
*/
|
|
681
|
-
async write(path,
|
|
703
|
+
async write(path, input) {
|
|
682
704
|
const pathStr = String(path);
|
|
705
|
+
const { data: inputData, metadata, options, batch } = input;
|
|
706
|
+
if (batch && this.filePathways.has(path)) {
|
|
707
|
+
const error = `Batch is not possible for file pathways. Pathway ${pathStr} is a file pathway`;
|
|
708
|
+
this.logger.error(error);
|
|
709
|
+
throw new Error(error);
|
|
710
|
+
}
|
|
683
711
|
this.logger.debug(`Writing to pathway`, {
|
|
684
712
|
pathway: pathStr,
|
|
685
713
|
metadata,
|
|
@@ -698,7 +726,7 @@ export class PathwaysBuilder {
|
|
|
698
726
|
this.logger.error(error);
|
|
699
727
|
throw new Error(error);
|
|
700
728
|
}
|
|
701
|
-
const schema = this.
|
|
729
|
+
const schema = batch ? z.array(this.inputSchemas[path]) : this.inputSchemas[path];
|
|
702
730
|
const parsedData = schema.safeParse(inputData);
|
|
703
731
|
if (!parsedData.success) {
|
|
704
732
|
const errorMessage = `Invalid data for pathway ${pathStr}`;
|
|
@@ -762,13 +790,22 @@ export class PathwaysBuilder {
|
|
|
762
790
|
}
|
|
763
791
|
}
|
|
764
792
|
let eventIds = [];
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
793
|
+
this.logger.debug(`Writing webhook data to pathway`, { pathway: pathStr, batch });
|
|
794
|
+
if (batch) {
|
|
795
|
+
eventIds = await this.batchWriters[path](data, finalMetadata, options);
|
|
796
|
+
}
|
|
797
|
+
else if (this.filePathways.has(path)) {
|
|
798
|
+
const { fileId, fileName, fileContent, ...additionalProperties } = data;
|
|
799
|
+
const fileType = await fileTypeFromBuffer(fileContent);
|
|
800
|
+
eventIds = await this.fileWriters[path]({
|
|
801
|
+
fileId,
|
|
802
|
+
fileName,
|
|
803
|
+
fileType: fileType?.mime ?? "application/octet-stream",
|
|
804
|
+
fileContent: new Blob([fileContent]),
|
|
805
|
+
additionalProperties,
|
|
806
|
+
}, finalMetadata, options);
|
|
769
807
|
}
|
|
770
808
|
else {
|
|
771
|
-
this.logger.debug(`Writing webhook data to pathway`, { pathway: pathStr });
|
|
772
809
|
eventIds = await this.writers[path](data, finalMetadata, options);
|
|
773
810
|
}
|
|
774
811
|
this.logger[this.logLevel.writeSuccess](`Successfully wrote to pathway`, {
|
|
@@ -787,108 +824,6 @@ export class PathwaysBuilder {
|
|
|
787
824
|
}
|
|
788
825
|
return eventIds;
|
|
789
826
|
}
|
|
790
|
-
async writeBatch(path, inputData, metadata, options) {
|
|
791
|
-
const pathStr = String(path);
|
|
792
|
-
this.logger.debug(`Writing batch to pathway`, {
|
|
793
|
-
pathway: pathStr,
|
|
794
|
-
metadata,
|
|
795
|
-
options: {
|
|
796
|
-
fireAndForget: options?.fireAndForget,
|
|
797
|
-
sessionId: options?.sessionId,
|
|
798
|
-
},
|
|
799
|
-
});
|
|
800
|
-
if (!this.pathways[path]) {
|
|
801
|
-
const error = `Pathway ${pathStr} not found`;
|
|
802
|
-
this.logger.error(error);
|
|
803
|
-
throw new Error(error);
|
|
804
|
-
}
|
|
805
|
-
if (!this.writable[path]) {
|
|
806
|
-
const error = `Pathway ${pathStr} is not writable`;
|
|
807
|
-
this.logger.error(error);
|
|
808
|
-
throw new Error(error);
|
|
809
|
-
}
|
|
810
|
-
const schema = this.schemas[path];
|
|
811
|
-
const parsedData = z.array(schema).safeParse(inputData);
|
|
812
|
-
if (!parsedData.success) {
|
|
813
|
-
const errorMessage = `Invalid batch data for pathway ${pathStr}`;
|
|
814
|
-
this.logger.error(errorMessage, new Error(errorMessage), {
|
|
815
|
-
pathway: pathStr,
|
|
816
|
-
schema: schema.toString(),
|
|
817
|
-
});
|
|
818
|
-
throw new Error(errorMessage);
|
|
819
|
-
}
|
|
820
|
-
const data = parsedData.data;
|
|
821
|
-
// Create a copy of the metadata to avoid modifying the original
|
|
822
|
-
const finalMetadata = metadata ? { ...metadata } : {};
|
|
823
|
-
// Check for session-specific user resolver
|
|
824
|
-
let userId;
|
|
825
|
-
if (options?.sessionId) {
|
|
826
|
-
const sessionUserResolver = this.getSessionUserResolver(options.sessionId);
|
|
827
|
-
if (sessionUserResolver) {
|
|
828
|
-
try {
|
|
829
|
-
userId = await sessionUserResolver();
|
|
830
|
-
this.logger.debug(`Using session-specific user resolver`, {
|
|
831
|
-
pathway: pathStr,
|
|
832
|
-
sessionId: options.sessionId,
|
|
833
|
-
userId,
|
|
834
|
-
});
|
|
835
|
-
}
|
|
836
|
-
catch (error) {
|
|
837
|
-
this.logger.error(`Error resolving session user ID`, error instanceof Error ? error : new Error(String(error)), {
|
|
838
|
-
pathway: pathStr,
|
|
839
|
-
sessionId: options.sessionId,
|
|
840
|
-
});
|
|
841
|
-
}
|
|
842
|
-
}
|
|
843
|
-
}
|
|
844
|
-
// Process audit metadata if audit is configured
|
|
845
|
-
if (this.userIdResolver) {
|
|
846
|
-
// Only use global resolver if we don't already have a user ID from a session resolver
|
|
847
|
-
if (!userId) {
|
|
848
|
-
this.logger.debug(`Resolving user ID for audit metadata`, { pathway: pathStr });
|
|
849
|
-
userId = await this.userIdResolver();
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
// Determine the audit mode: default is "user" unless explicitly specified as "system"
|
|
853
|
-
const auditMode = options?.auditMode ?? "user";
|
|
854
|
-
this.logger.debug(`Adding audit metadata`, {
|
|
855
|
-
pathway: pathStr,
|
|
856
|
-
auditMode,
|
|
857
|
-
userId,
|
|
858
|
-
});
|
|
859
|
-
if (userId) {
|
|
860
|
-
// Add appropriate audit metadata based on mode
|
|
861
|
-
if (auditMode === AUDIT_SYSTEM_MODE) {
|
|
862
|
-
finalMetadata[AUDIT_USER_ID] = "system";
|
|
863
|
-
finalMetadata[AUDIT_ON_BEHALF_OF] = userId.entityId;
|
|
864
|
-
finalMetadata[AUDIT_MODE] = "system";
|
|
865
|
-
finalMetadata[AUDIT_ENTITY_TYPE] = userId.entityType;
|
|
866
|
-
}
|
|
867
|
-
else {
|
|
868
|
-
finalMetadata[AUDIT_USER_ID] = userId.entityId;
|
|
869
|
-
finalMetadata[AUDIT_MODE] = AUDIT_USER_MODE; // Always set mode for user
|
|
870
|
-
finalMetadata[AUDIT_ENTITY_TYPE] = userId.entityType;
|
|
871
|
-
}
|
|
872
|
-
}
|
|
873
|
-
let eventIds = [];
|
|
874
|
-
this.logger.debug(`Writing batch webhook data to pathway`, { pathway: pathStr });
|
|
875
|
-
eventIds = await this.batchWriters[path](data, finalMetadata, options);
|
|
876
|
-
this.logger[this.logLevel.writeSuccess](`Successfully wrote to pathway`, {
|
|
877
|
-
pathway: pathStr,
|
|
878
|
-
eventIds: Array.isArray(eventIds) ? eventIds : [eventIds],
|
|
879
|
-
fireAndForget: options?.fireAndForget,
|
|
880
|
-
});
|
|
881
|
-
if (!options?.fireAndForget) {
|
|
882
|
-
this.logger.debug(`Waiting for pathway to be processed`, {
|
|
883
|
-
pathway: pathStr,
|
|
884
|
-
eventIds: Array.isArray(eventIds) ? eventIds : [eventIds],
|
|
885
|
-
});
|
|
886
|
-
await Promise.all(Array.isArray(eventIds)
|
|
887
|
-
? eventIds.map((id) => this.waitForPathwayToBeProcessed(id))
|
|
888
|
-
: [this.waitForPathwayToBeProcessed(eventIds)]);
|
|
889
|
-
}
|
|
890
|
-
return eventIds;
|
|
891
|
-
}
|
|
892
827
|
/**
|
|
893
828
|
* Waits for a specific event to be processed
|
|
894
829
|
*
|
|
@@ -133,6 +133,6 @@ export class SessionPathwayBuilder {
|
|
|
133
133
|
// Always include the session ID in the options
|
|
134
134
|
finalOptions.sessionId = options?.sessionId ?? this.sessionId;
|
|
135
135
|
// The PathwaysBuilder will handle session-specific user resolvers
|
|
136
|
-
return await this.pathwaysBuilder.write(path, data, metadata, finalOptions);
|
|
136
|
+
return await this.pathwaysBuilder.write(path, { data, metadata, options: finalOptions });
|
|
137
137
|
}
|
|
138
138
|
}
|
package/esm/pathways/types.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AnyZodObject, z } from "zod";
|
|
2
2
|
import type { WebhookFileData, WebhookSendOptions } from "@flowcore/sdk-transformer-core";
|
|
3
|
+
import { Buffer } from "node:buffer";
|
|
3
4
|
/**
|
|
4
5
|
* Helper type to create a custom type error for non-writable pathways
|
|
5
6
|
* @template T The string type to create an error for
|
|
@@ -13,7 +14,7 @@ type NonWritablePathwayError<T extends string> = T & {
|
|
|
13
14
|
* @template E The event type
|
|
14
15
|
* @template T The schema type
|
|
15
16
|
*/
|
|
16
|
-
export interface PathwayContract<F extends string, E extends string, T extends
|
|
17
|
+
export interface PathwayContract<F extends string, E extends string, T extends AnyZodObject> {
|
|
17
18
|
/**
|
|
18
19
|
* The flow type for this pathway
|
|
19
20
|
*/
|
|
@@ -25,7 +26,7 @@ export interface PathwayContract<F extends string, E extends string, T extends Z
|
|
|
25
26
|
/**
|
|
26
27
|
* The schema that defines the structure of events for this pathway
|
|
27
28
|
*/
|
|
28
|
-
schema
|
|
29
|
+
schema?: T;
|
|
29
30
|
/**
|
|
30
31
|
* Whether the pathway is writable. Use `false as const` to make the pathway non-writable at compile time.
|
|
31
32
|
* @example
|
|
@@ -143,5 +144,21 @@ export type PathwayWriteOptions = WebhookSendOptions & {
|
|
|
143
144
|
*/
|
|
144
145
|
sessionId?: string;
|
|
145
146
|
};
|
|
147
|
+
export declare const FileInputSchema: z.ZodObject<{
|
|
148
|
+
fileId: z.ZodString;
|
|
149
|
+
fileName: z.ZodString;
|
|
150
|
+
fileContent: z.ZodType<Buffer>;
|
|
151
|
+
}>;
|
|
152
|
+
export declare const FileEventSchema: z.ZodObject<{
|
|
153
|
+
fileName: z.ZodString;
|
|
154
|
+
fileType: z.ZodString;
|
|
155
|
+
fileSize: z.ZodNumber;
|
|
156
|
+
data: z.ZodString;
|
|
157
|
+
part: z.ZodNumber;
|
|
158
|
+
totalParts: z.ZodNumber;
|
|
159
|
+
checksum: z.ZodString;
|
|
160
|
+
hashType: z.ZodString;
|
|
161
|
+
fileId: z.ZodString;
|
|
162
|
+
}>;
|
|
146
163
|
export {};
|
|
147
164
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pathways/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pathways/types.ts"],"names":[],"mappings":"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"}
|
package/esm/pathways/types.js
CHANGED
|
@@ -1 +1,18 @@
|
|
|
1
|
-
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
export const FileInputSchema = z.object({
|
|
4
|
+
fileId: z.string(),
|
|
5
|
+
fileName: z.string(),
|
|
6
|
+
fileContent: z.instanceof(Buffer),
|
|
7
|
+
});
|
|
8
|
+
export const FileEventSchema = z.object({
|
|
9
|
+
fileName: z.string(),
|
|
10
|
+
fileType: z.string(),
|
|
11
|
+
fileSize: z.number(),
|
|
12
|
+
data: z.string(),
|
|
13
|
+
part: z.number(),
|
|
14
|
+
totalParts: z.number(),
|
|
15
|
+
checksum: z.string(),
|
|
16
|
+
hashType: z.string(),
|
|
17
|
+
fileId: z.string(),
|
|
18
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flowcore/pathways",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "A TypeScript Library for creating Flowcore Pathways, simplifying the integration with the flowcore platform",
|
|
5
5
|
"homepage": "https://github.com/flowcore-io/flowcore-pathways#readme",
|
|
6
6
|
"repository": {
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@flowcore/sdk-transformer-core": "^2.3.6",
|
|
27
|
+
"file-type": "^21.0.0",
|
|
27
28
|
"node-cache": "5.1.2",
|
|
28
29
|
"postgres": "^3.4.3",
|
|
29
30
|
"rxjs": "^7.8.1",
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type AnyZodObject, z } from "zod";
|
|
2
2
|
import type { WebhookSendOptions } from "@flowcore/sdk-transformer-core";
|
|
3
3
|
import type { FlowcoreEvent } from "../contracts/event.js";
|
|
4
4
|
import type { Logger } from "./logger.js";
|
|
5
5
|
import type { EventMetadata, PathwayContract, PathwayKey, PathwayState, PathwayWriteOptions, WritablePathway } from "./types.js";
|
|
6
|
+
import { FileEventSchema, FileInputSchema } from "./types.js";
|
|
6
7
|
/**
|
|
7
8
|
* Defines the mode for auditing pathway operations
|
|
8
9
|
* - "user": Normal user-initiated operations
|
|
@@ -130,7 +131,9 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
130
131
|
private readonly globalErrorSubject;
|
|
131
132
|
private readonly writers;
|
|
132
133
|
private readonly batchWriters;
|
|
134
|
+
private readonly fileWriters;
|
|
133
135
|
private readonly schemas;
|
|
136
|
+
private readonly inputSchemas;
|
|
134
137
|
private readonly writable;
|
|
135
138
|
private readonly timeouts;
|
|
136
139
|
private readonly maxRetries;
|
|
@@ -247,13 +250,14 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
247
250
|
* @param contract The pathway contract describing the pathway
|
|
248
251
|
* @returns The PathwaysBuilder instance with the new pathway registered
|
|
249
252
|
*/
|
|
250
|
-
register<F extends string, E extends string, S extends
|
|
253
|
+
register<F extends string, E extends string, S extends AnyZodObject = AnyZodObject, W extends boolean = true, FP extends boolean = false>(contract: PathwayContract<F, E, S> & {
|
|
251
254
|
writable?: W;
|
|
252
255
|
maxRetries?: number;
|
|
253
256
|
retryDelayMs?: number;
|
|
257
|
+
isFilePathway?: FP;
|
|
254
258
|
}): PathwaysBuilder<TPathway & Record<PathwayKey<F, E>, {
|
|
255
|
-
output: z.infer<S>;
|
|
256
|
-
input: z.input<S>;
|
|
259
|
+
output: FP extends true ? z.infer<typeof FileEventSchema> & z.infer<S> : z.infer<S>;
|
|
260
|
+
input: FP extends true ? z.input<typeof FileInputSchema> & z.input<S> : z.input<S>;
|
|
257
261
|
}>, TWritablePaths | WritablePathway<PathwayKey<F, E>, W>>;
|
|
258
262
|
/**
|
|
259
263
|
* Gets a pathway instance by its path
|
|
@@ -301,8 +305,12 @@ export declare class PathwaysBuilder<TPathway extends Record<string, {
|
|
|
301
305
|
* @param options Optional write options
|
|
302
306
|
* @returns A promise that resolves to the event ID(s)
|
|
303
307
|
*/
|
|
304
|
-
write<TPath extends TWritablePaths>(path: TPath,
|
|
305
|
-
|
|
308
|
+
write<TPath extends TWritablePaths, B extends boolean = false>(path: TPath, input: {
|
|
309
|
+
batch?: B;
|
|
310
|
+
data: B extends true ? TPathway[TPath]["input"][] : TPathway[TPath]["input"];
|
|
311
|
+
metadata?: EventMetadata;
|
|
312
|
+
options?: PathwayWriteOptions;
|
|
313
|
+
}): Promise<string | string[]>;
|
|
306
314
|
/**
|
|
307
315
|
* Waits for a specific event to be processed
|
|
308
316
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/pathways/builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/pathways/builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PathwaysBuilder = exports.SessionUser = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
|
+
const file_type_1 = require("file-type");
|
|
5
6
|
const rxjs_1 = require("rxjs");
|
|
6
7
|
const flowcore_transformer_core_sdk_js_1 = require("../compatibility/flowcore-transformer-core.sdk.js");
|
|
7
8
|
const internal_pathway_state_js_1 = require("./internal-pathway.state.js");
|
|
8
9
|
const logger_js_1 = require("./logger.js");
|
|
9
10
|
const constants_js_1 = require("./constants.js");
|
|
11
|
+
const types_js_1 = require("./types.js");
|
|
10
12
|
/**
|
|
11
13
|
* Default timeout for pathway processing in milliseconds (10 seconds)
|
|
12
14
|
*/
|
|
@@ -156,12 +158,24 @@ class PathwaysBuilder {
|
|
|
156
158
|
writable: true,
|
|
157
159
|
value: {}
|
|
158
160
|
});
|
|
161
|
+
Object.defineProperty(this, "fileWriters", {
|
|
162
|
+
enumerable: true,
|
|
163
|
+
configurable: true,
|
|
164
|
+
writable: true,
|
|
165
|
+
value: {}
|
|
166
|
+
});
|
|
159
167
|
Object.defineProperty(this, "schemas", {
|
|
160
168
|
enumerable: true,
|
|
161
169
|
configurable: true,
|
|
162
170
|
writable: true,
|
|
163
171
|
value: {}
|
|
164
172
|
});
|
|
173
|
+
Object.defineProperty(this, "inputSchemas", {
|
|
174
|
+
enumerable: true,
|
|
175
|
+
configurable: true,
|
|
176
|
+
writable: true,
|
|
177
|
+
value: {}
|
|
178
|
+
});
|
|
165
179
|
Object.defineProperty(this, "writable", {
|
|
166
180
|
enumerable: true,
|
|
167
181
|
configurable: true,
|
|
@@ -545,7 +559,7 @@ class PathwaysBuilder {
|
|
|
545
559
|
if (writable) {
|
|
546
560
|
if (contract.isFilePathway) {
|
|
547
561
|
this.filePathways.add(path);
|
|
548
|
-
this.
|
|
562
|
+
this.fileWriters[path] = this.webhookBuilderFactory()
|
|
549
563
|
.buildFileWebhook(contract.flowType, contract.eventType).send;
|
|
550
564
|
}
|
|
551
565
|
else {
|
|
@@ -565,13 +579,21 @@ class PathwaysBuilder {
|
|
|
565
579
|
if (contract.retryDelayMs !== undefined) {
|
|
566
580
|
this.retryDelays[path] = contract.retryDelayMs;
|
|
567
581
|
}
|
|
568
|
-
|
|
582
|
+
if (contract.isFilePathway) {
|
|
583
|
+
this.schemas[path] = (contract.schema ?? zod_1.z.object({})).merge(types_js_1.FileEventSchema);
|
|
584
|
+
this.inputSchemas[path] = (contract.schema ?? zod_1.z.object({})).merge(types_js_1.FileInputSchema);
|
|
585
|
+
}
|
|
586
|
+
else {
|
|
587
|
+
this.schemas[path] = contract.schema ?? zod_1.z.object({});
|
|
588
|
+
this.inputSchemas[path] = contract.schema ?? zod_1.z.object({});
|
|
589
|
+
}
|
|
569
590
|
this.writable[path] = writable;
|
|
570
591
|
this.logger.info(`Pathway registered successfully`, {
|
|
571
592
|
pathway: path,
|
|
572
593
|
flowType: contract.flowType,
|
|
573
594
|
eventType: contract.eventType,
|
|
574
595
|
writable,
|
|
596
|
+
isFilePathway: contract.isFilePathway,
|
|
575
597
|
});
|
|
576
598
|
return this;
|
|
577
599
|
}
|
|
@@ -682,8 +704,14 @@ class PathwaysBuilder {
|
|
|
682
704
|
* @param options Optional write options
|
|
683
705
|
* @returns A promise that resolves to the event ID(s)
|
|
684
706
|
*/
|
|
685
|
-
async write(path,
|
|
707
|
+
async write(path, input) {
|
|
686
708
|
const pathStr = String(path);
|
|
709
|
+
const { data: inputData, metadata, options, batch } = input;
|
|
710
|
+
if (batch && this.filePathways.has(path)) {
|
|
711
|
+
const error = `Batch is not possible for file pathways. Pathway ${pathStr} is a file pathway`;
|
|
712
|
+
this.logger.error(error);
|
|
713
|
+
throw new Error(error);
|
|
714
|
+
}
|
|
687
715
|
this.logger.debug(`Writing to pathway`, {
|
|
688
716
|
pathway: pathStr,
|
|
689
717
|
metadata,
|
|
@@ -702,7 +730,7 @@ class PathwaysBuilder {
|
|
|
702
730
|
this.logger.error(error);
|
|
703
731
|
throw new Error(error);
|
|
704
732
|
}
|
|
705
|
-
const schema = this.
|
|
733
|
+
const schema = batch ? zod_1.z.array(this.inputSchemas[path]) : this.inputSchemas[path];
|
|
706
734
|
const parsedData = schema.safeParse(inputData);
|
|
707
735
|
if (!parsedData.success) {
|
|
708
736
|
const errorMessage = `Invalid data for pathway ${pathStr}`;
|
|
@@ -766,13 +794,22 @@ class PathwaysBuilder {
|
|
|
766
794
|
}
|
|
767
795
|
}
|
|
768
796
|
let eventIds = [];
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
797
|
+
this.logger.debug(`Writing webhook data to pathway`, { pathway: pathStr, batch });
|
|
798
|
+
if (batch) {
|
|
799
|
+
eventIds = await this.batchWriters[path](data, finalMetadata, options);
|
|
800
|
+
}
|
|
801
|
+
else if (this.filePathways.has(path)) {
|
|
802
|
+
const { fileId, fileName, fileContent, ...additionalProperties } = data;
|
|
803
|
+
const fileType = await (0, file_type_1.fileTypeFromBuffer)(fileContent);
|
|
804
|
+
eventIds = await this.fileWriters[path]({
|
|
805
|
+
fileId,
|
|
806
|
+
fileName,
|
|
807
|
+
fileType: fileType?.mime ?? "application/octet-stream",
|
|
808
|
+
fileContent: new Blob([fileContent]),
|
|
809
|
+
additionalProperties,
|
|
810
|
+
}, finalMetadata, options);
|
|
773
811
|
}
|
|
774
812
|
else {
|
|
775
|
-
this.logger.debug(`Writing webhook data to pathway`, { pathway: pathStr });
|
|
776
813
|
eventIds = await this.writers[path](data, finalMetadata, options);
|
|
777
814
|
}
|
|
778
815
|
this.logger[this.logLevel.writeSuccess](`Successfully wrote to pathway`, {
|
|
@@ -791,108 +828,6 @@ class PathwaysBuilder {
|
|
|
791
828
|
}
|
|
792
829
|
return eventIds;
|
|
793
830
|
}
|
|
794
|
-
async writeBatch(path, inputData, metadata, options) {
|
|
795
|
-
const pathStr = String(path);
|
|
796
|
-
this.logger.debug(`Writing batch to pathway`, {
|
|
797
|
-
pathway: pathStr,
|
|
798
|
-
metadata,
|
|
799
|
-
options: {
|
|
800
|
-
fireAndForget: options?.fireAndForget,
|
|
801
|
-
sessionId: options?.sessionId,
|
|
802
|
-
},
|
|
803
|
-
});
|
|
804
|
-
if (!this.pathways[path]) {
|
|
805
|
-
const error = `Pathway ${pathStr} not found`;
|
|
806
|
-
this.logger.error(error);
|
|
807
|
-
throw new Error(error);
|
|
808
|
-
}
|
|
809
|
-
if (!this.writable[path]) {
|
|
810
|
-
const error = `Pathway ${pathStr} is not writable`;
|
|
811
|
-
this.logger.error(error);
|
|
812
|
-
throw new Error(error);
|
|
813
|
-
}
|
|
814
|
-
const schema = this.schemas[path];
|
|
815
|
-
const parsedData = zod_1.z.array(schema).safeParse(inputData);
|
|
816
|
-
if (!parsedData.success) {
|
|
817
|
-
const errorMessage = `Invalid batch data for pathway ${pathStr}`;
|
|
818
|
-
this.logger.error(errorMessage, new Error(errorMessage), {
|
|
819
|
-
pathway: pathStr,
|
|
820
|
-
schema: schema.toString(),
|
|
821
|
-
});
|
|
822
|
-
throw new Error(errorMessage);
|
|
823
|
-
}
|
|
824
|
-
const data = parsedData.data;
|
|
825
|
-
// Create a copy of the metadata to avoid modifying the original
|
|
826
|
-
const finalMetadata = metadata ? { ...metadata } : {};
|
|
827
|
-
// Check for session-specific user resolver
|
|
828
|
-
let userId;
|
|
829
|
-
if (options?.sessionId) {
|
|
830
|
-
const sessionUserResolver = this.getSessionUserResolver(options.sessionId);
|
|
831
|
-
if (sessionUserResolver) {
|
|
832
|
-
try {
|
|
833
|
-
userId = await sessionUserResolver();
|
|
834
|
-
this.logger.debug(`Using session-specific user resolver`, {
|
|
835
|
-
pathway: pathStr,
|
|
836
|
-
sessionId: options.sessionId,
|
|
837
|
-
userId,
|
|
838
|
-
});
|
|
839
|
-
}
|
|
840
|
-
catch (error) {
|
|
841
|
-
this.logger.error(`Error resolving session user ID`, error instanceof Error ? error : new Error(String(error)), {
|
|
842
|
-
pathway: pathStr,
|
|
843
|
-
sessionId: options.sessionId,
|
|
844
|
-
});
|
|
845
|
-
}
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
// Process audit metadata if audit is configured
|
|
849
|
-
if (this.userIdResolver) {
|
|
850
|
-
// Only use global resolver if we don't already have a user ID from a session resolver
|
|
851
|
-
if (!userId) {
|
|
852
|
-
this.logger.debug(`Resolving user ID for audit metadata`, { pathway: pathStr });
|
|
853
|
-
userId = await this.userIdResolver();
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
// Determine the audit mode: default is "user" unless explicitly specified as "system"
|
|
857
|
-
const auditMode = options?.auditMode ?? "user";
|
|
858
|
-
this.logger.debug(`Adding audit metadata`, {
|
|
859
|
-
pathway: pathStr,
|
|
860
|
-
auditMode,
|
|
861
|
-
userId,
|
|
862
|
-
});
|
|
863
|
-
if (userId) {
|
|
864
|
-
// Add appropriate audit metadata based on mode
|
|
865
|
-
if (auditMode === constants_js_1.AUDIT_SYSTEM_MODE) {
|
|
866
|
-
finalMetadata[constants_js_1.AUDIT_USER_ID] = "system";
|
|
867
|
-
finalMetadata[constants_js_1.AUDIT_ON_BEHALF_OF] = userId.entityId;
|
|
868
|
-
finalMetadata[constants_js_1.AUDIT_MODE] = "system";
|
|
869
|
-
finalMetadata[constants_js_1.AUDIT_ENTITY_TYPE] = userId.entityType;
|
|
870
|
-
}
|
|
871
|
-
else {
|
|
872
|
-
finalMetadata[constants_js_1.AUDIT_USER_ID] = userId.entityId;
|
|
873
|
-
finalMetadata[constants_js_1.AUDIT_MODE] = constants_js_1.AUDIT_USER_MODE; // Always set mode for user
|
|
874
|
-
finalMetadata[constants_js_1.AUDIT_ENTITY_TYPE] = userId.entityType;
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
let eventIds = [];
|
|
878
|
-
this.logger.debug(`Writing batch webhook data to pathway`, { pathway: pathStr });
|
|
879
|
-
eventIds = await this.batchWriters[path](data, finalMetadata, options);
|
|
880
|
-
this.logger[this.logLevel.writeSuccess](`Successfully wrote to pathway`, {
|
|
881
|
-
pathway: pathStr,
|
|
882
|
-
eventIds: Array.isArray(eventIds) ? eventIds : [eventIds],
|
|
883
|
-
fireAndForget: options?.fireAndForget,
|
|
884
|
-
});
|
|
885
|
-
if (!options?.fireAndForget) {
|
|
886
|
-
this.logger.debug(`Waiting for pathway to be processed`, {
|
|
887
|
-
pathway: pathStr,
|
|
888
|
-
eventIds: Array.isArray(eventIds) ? eventIds : [eventIds],
|
|
889
|
-
});
|
|
890
|
-
await Promise.all(Array.isArray(eventIds)
|
|
891
|
-
? eventIds.map((id) => this.waitForPathwayToBeProcessed(id))
|
|
892
|
-
: [this.waitForPathwayToBeProcessed(eventIds)]);
|
|
893
|
-
}
|
|
894
|
-
return eventIds;
|
|
895
|
-
}
|
|
896
831
|
/**
|
|
897
832
|
* Waits for a specific event to be processed
|
|
898
833
|
*
|
|
@@ -136,7 +136,7 @@ class SessionPathwayBuilder {
|
|
|
136
136
|
// Always include the session ID in the options
|
|
137
137
|
finalOptions.sessionId = options?.sessionId ?? this.sessionId;
|
|
138
138
|
// The PathwaysBuilder will handle session-specific user resolvers
|
|
139
|
-
return await this.pathwaysBuilder.write(path, data, metadata, finalOptions);
|
|
139
|
+
return await this.pathwaysBuilder.write(path, { data, metadata, options: finalOptions });
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
exports.SessionPathwayBuilder = SessionPathwayBuilder;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AnyZodObject, z } from "zod";
|
|
2
2
|
import type { WebhookFileData, WebhookSendOptions } from "@flowcore/sdk-transformer-core";
|
|
3
|
+
import { Buffer } from "node:buffer";
|
|
3
4
|
/**
|
|
4
5
|
* Helper type to create a custom type error for non-writable pathways
|
|
5
6
|
* @template T The string type to create an error for
|
|
@@ -13,7 +14,7 @@ type NonWritablePathwayError<T extends string> = T & {
|
|
|
13
14
|
* @template E The event type
|
|
14
15
|
* @template T The schema type
|
|
15
16
|
*/
|
|
16
|
-
export interface PathwayContract<F extends string, E extends string, T extends
|
|
17
|
+
export interface PathwayContract<F extends string, E extends string, T extends AnyZodObject> {
|
|
17
18
|
/**
|
|
18
19
|
* The flow type for this pathway
|
|
19
20
|
*/
|
|
@@ -25,7 +26,7 @@ export interface PathwayContract<F extends string, E extends string, T extends Z
|
|
|
25
26
|
/**
|
|
26
27
|
* The schema that defines the structure of events for this pathway
|
|
27
28
|
*/
|
|
28
|
-
schema
|
|
29
|
+
schema?: T;
|
|
29
30
|
/**
|
|
30
31
|
* Whether the pathway is writable. Use `false as const` to make the pathway non-writable at compile time.
|
|
31
32
|
* @example
|
|
@@ -143,5 +144,21 @@ export type PathwayWriteOptions = WebhookSendOptions & {
|
|
|
143
144
|
*/
|
|
144
145
|
sessionId?: string;
|
|
145
146
|
};
|
|
147
|
+
export declare const FileInputSchema: z.ZodObject<{
|
|
148
|
+
fileId: z.ZodString;
|
|
149
|
+
fileName: z.ZodString;
|
|
150
|
+
fileContent: z.ZodType<Buffer>;
|
|
151
|
+
}>;
|
|
152
|
+
export declare const FileEventSchema: z.ZodObject<{
|
|
153
|
+
fileName: z.ZodString;
|
|
154
|
+
fileType: z.ZodString;
|
|
155
|
+
fileSize: z.ZodNumber;
|
|
156
|
+
data: z.ZodString;
|
|
157
|
+
part: z.ZodNumber;
|
|
158
|
+
totalParts: z.ZodNumber;
|
|
159
|
+
checksum: z.ZodString;
|
|
160
|
+
hashType: z.ZodString;
|
|
161
|
+
fileId: z.ZodString;
|
|
162
|
+
}>;
|
|
146
163
|
export {};
|
|
147
164
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pathways/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/pathways/types.ts"],"names":[],"mappings":"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"}
|
package/script/pathways/types.js
CHANGED
|
@@ -1,2 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileEventSchema = exports.FileInputSchema = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const node_buffer_1 = require("node:buffer");
|
|
6
|
+
exports.FileInputSchema = zod_1.z.object({
|
|
7
|
+
fileId: zod_1.z.string(),
|
|
8
|
+
fileName: zod_1.z.string(),
|
|
9
|
+
fileContent: zod_1.z.instanceof(node_buffer_1.Buffer),
|
|
10
|
+
});
|
|
11
|
+
exports.FileEventSchema = zod_1.z.object({
|
|
12
|
+
fileName: zod_1.z.string(),
|
|
13
|
+
fileType: zod_1.z.string(),
|
|
14
|
+
fileSize: zod_1.z.number(),
|
|
15
|
+
data: zod_1.z.string(),
|
|
16
|
+
part: zod_1.z.number(),
|
|
17
|
+
totalParts: zod_1.z.number(),
|
|
18
|
+
checksum: zod_1.z.string(),
|
|
19
|
+
hashType: zod_1.z.string(),
|
|
20
|
+
fileId: zod_1.z.string(),
|
|
21
|
+
});
|