@forklaunch/core 2.1.1 → 3.0.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.
Files changed (52) hide show
  1. package/bin/gateway-mock/routes/email.mjs +233 -0
  2. package/bin/gateway-mock/routes/models.mjs +192 -0
  3. package/bin/gateway-mock/routes/payments.mjs +541 -0
  4. package/bin/gateway-mock/routes/sms.mjs +209 -0
  5. package/bin/gateway-mock/routes/voice.mjs +237 -0
  6. package/bin/gateway-mock/routes/whatsapp.mjs +227 -0
  7. package/bin/gateway-mock/server.mjs +321 -0
  8. package/bin/migrate-compliant-fields.mjs +312 -0
  9. package/bin/model-gateway-mock.mjs +13 -0
  10. package/lib/http/emailClient.d.ts +102 -0
  11. package/lib/http/emailClient.d.ts.map +1 -0
  12. package/lib/http/index.d.ts +7 -0
  13. package/lib/http/index.d.ts.map +1 -1
  14. package/lib/http/index.js +850 -4
  15. package/lib/http/index.js.map +1 -1
  16. package/lib/http/index.mjs +809 -1
  17. package/lib/http/index.mjs.map +1 -1
  18. package/lib/http/instanceGateway.d.ts +113 -0
  19. package/lib/http/instanceGateway.d.ts.map +1 -0
  20. package/lib/http/modelGatewayClient.d.ts +126 -0
  21. package/lib/http/modelGatewayClient.d.ts.map +1 -0
  22. package/lib/http/paymentsClient.d.ts +123 -0
  23. package/lib/http/paymentsClient.d.ts.map +1 -0
  24. package/lib/http/smsClient.d.ts +123 -0
  25. package/lib/http/smsClient.d.ts.map +1 -0
  26. package/lib/http/voiceClient.d.ts +105 -0
  27. package/lib/http/voiceClient.d.ts.map +1 -0
  28. package/lib/http/whatsappClient.d.ts +118 -0
  29. package/lib/http/whatsappClient.d.ts.map +1 -0
  30. package/lib/objectstore/interfaces/objectstore.interface.d.ts +45 -0
  31. package/lib/objectstore/interfaces/objectstore.interface.d.ts.map +1 -1
  32. package/lib/persistence/compliancePropertyBuilder.d.ts.map +1 -1
  33. package/lib/persistence/complianceTypes.d.ts +10 -1
  34. package/lib/persistence/complianceTypes.d.ts.map +1 -1
  35. package/lib/persistence/compliantField.d.ts +203 -0
  36. package/lib/persistence/compliantField.d.ts.map +1 -0
  37. package/lib/persistence/defineComplianceEntity.d.ts.map +1 -1
  38. package/lib/persistence/encryptedType.d.ts +8 -1
  39. package/lib/persistence/encryptedType.d.ts.map +1 -1
  40. package/lib/persistence/fieldEncryptor.d.ts +47 -6
  41. package/lib/persistence/fieldEncryptor.d.ts.map +1 -1
  42. package/lib/persistence/index.d.ts +3 -2
  43. package/lib/persistence/index.d.ts.map +1 -1
  44. package/lib/persistence/index.js +987 -259
  45. package/lib/persistence/index.js.map +1 -1
  46. package/lib/persistence/index.mjs +976 -257
  47. package/lib/persistence/index.mjs.map +1 -1
  48. package/lib/persistence/keyRotation.d.ts +5 -0
  49. package/lib/persistence/keyRotation.d.ts.map +1 -1
  50. package/lib/services/index.js.map +1 -1
  51. package/lib/services/index.mjs.map +1 -1
  52. package/package.json +25 -9
@@ -0,0 +1,102 @@
1
+ import { InstanceGatewayRequestError } from './instanceGateway';
2
+ /**
3
+ * Client for platform-held email, used from inside a managed instance.
4
+ *
5
+ * The instance never holds a mail credential. It signs each request with its
6
+ * own HMAC key; the platform sends through Amazon SES from the instance's own
7
+ * sending identity (`no-reply@<instance>.<platform sending domain>`, a claimed
8
+ * custom domain later) under a per-instance configuration set, enforces the
9
+ * product's daily quota and rate, and refuses addresses on the instance's
10
+ * suppression list (hard bounces and complaints).
11
+ *
12
+ * Delivery outcomes come back as platform events on
13
+ * `/platform-events/email`: `email.delivered`, `email.bounced` and
14
+ * `email.complained`, each carrying the `messageId` `send` returned. A bounced
15
+ * or complained address is suppressed by the platform; mark it undeliverable
16
+ * in the app too so the person can be asked for a new one.
17
+ *
18
+ * Locally, `forklaunch infra add <service> email` points the service at the
19
+ * gateway mock in docker-compose (PLATFORM_GATEWAY_URL, INSTANCE_ID,
20
+ * INSTANCE_HMAC_KEY), which records messages (GET /__mock/email/messages) and
21
+ * emits the same events. Outside managed mode and without those settings,
22
+ * `createEmailClient` refuses to be created.
23
+ *
24
+ * What to put where: the body may hold what the recipient is entitled to
25
+ * read; the subject shows on lock screens, in notification previews and in
26
+ * mail logs, so never put protected data (a `.deanon` value) in it.
27
+ *
28
+ * @example
29
+ * const email = createEmailClient();
30
+ * const { messageId } = await email.send({
31
+ * to: 'pat@example.com',
32
+ * subject: 'Your appointment is confirmed',
33
+ * text: 'See you on Tuesday at 10:00.'
34
+ * });
35
+ * if (await email.suppressed('pat@example.com')) { … ask for another address }
36
+ */
37
+ export interface EmailClientOptions {
38
+ /** Platform base URL. Default: `PLATFORM_GATEWAY_URL`. */
39
+ gatewayUrl?: string;
40
+ /** This instance's id. Default: `INSTANCE_ID`. */
41
+ instanceId?: string;
42
+ /** This instance's HMAC key. Default: `INSTANCE_HMAC_KEY`. */
43
+ hmacKey?: string;
44
+ fetch?: typeof fetch;
45
+ }
46
+ export interface EmailSendRequest {
47
+ /** One address or up to 50. */
48
+ to: string | string[];
49
+ /** Plain text, one line; shown in previews and logs — no protected data. */
50
+ subject: string;
51
+ /** At least one of `text` and `html`. */
52
+ text?: string;
53
+ html?: string;
54
+ replyTo?: string | string[];
55
+ /**
56
+ * Up to 10 tags, echoed on the delivery events. Names and values:
57
+ * letters, digits, `_` and `-`. Names starting `fl-` or `ses:` are reserved.
58
+ */
59
+ tags?: Record<string, string>;
60
+ }
61
+ export interface EmailSendResult {
62
+ /** The provider's message id; delivery events carry it. */
63
+ messageId: string;
64
+ }
65
+ /** Data on `email.delivered`, `email.bounced` and `email.complained` events. */
66
+ export interface EmailEventData {
67
+ messageId: string;
68
+ recipients: string[];
69
+ tags?: Record<string, string>;
70
+ /** `email.bounced`: `Permanent`, `Transient` or `Undetermined`. */
71
+ bounceType?: string;
72
+ bounceSubType?: string;
73
+ /** `email.bounced`: whether the platform suppressed the addresses. */
74
+ permanent?: boolean;
75
+ /** `email.complained`: the feedback type the mailbox provider reported. */
76
+ feedbackType?: string;
77
+ }
78
+ /** A refusal or failure, from the gateway or from validation before sending. */
79
+ export declare class EmailRequestError extends InstanceGatewayRequestError {
80
+ readonly name: 'EmailRequestError';
81
+ }
82
+ export interface EmailClient {
83
+ /** Send one message; throws `EmailRequestError` on a refusal. */
84
+ send(request: EmailSendRequest): Promise<EmailSendResult>;
85
+ /** Whether the platform refuses to send to `address` (bounce/complaint). */
86
+ suppressed(address: string): Promise<boolean>;
87
+ }
88
+ /** Limits the platform enforces too; checked here so a bad call fails fast. */
89
+ export declare const EMAIL_LIMITS: {
90
+ readonly maxRecipients: 50;
91
+ readonly maxAddressLength: 254;
92
+ readonly maxSubjectLength: 998;
93
+ /** text + html, UTF-8 bytes. */
94
+ readonly maxBodyBytes: number;
95
+ readonly maxTags: 10;
96
+ };
97
+ /** Whether `address` is a plain mailbox address (`local@domain.tld`). */
98
+ export declare function isEmailAddress(address: unknown): address is string;
99
+ /** Validate a send request the way the gateway does; returns the wire body. */
100
+ export declare function validateEmailSendRequest(request: EmailSendRequest): Record<string, unknown>;
101
+ export declare function createEmailClient(options?: EmailClientOptions): EmailClient;
102
+ //# sourceMappingURL=emailClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailClient.d.ts","sourceRoot":"","sources":["../../src/http/emailClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,2BAA2B,EAE5B,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,+BAA+B;IAC/B,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC5B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,gFAAgF;AAChF,qBAAa,iBAAkB,SAAQ,2BAA2B;IAChE,SAAkB,IAAI,EAAG,mBAAmB,CAAU;CACvD;AAED,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,4EAA4E;IAC5E,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC/C;AAED,+EAA+E;AAC/E,eAAO,MAAM,YAAY;aACvB,aAAa,EAAE,EAAE;aACjB,gBAAgB,EAAE,GAAG;aACrB,gBAAgB,EAAE,GAAG;IACrB,gCAAgC;aAChC,YAAY;aACZ,OAAO,EAAE,EAAE;CACH,CAAC;AAMX,yEAAyE;AACzE,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,MAAM,CAMlE;AAyBD,+EAA+E;AAC/E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,gBAAgB,GACxB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyCzB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,kBAAuB,GAC/B,WAAW,CAuDb"}
@@ -4,6 +4,13 @@ export * from './cluster/cluster.types';
4
4
  export * from './cluster/isPortBound';
5
5
  export * from './createHmacToken';
6
6
  export * from './generateHmacAuthHeaders';
7
+ export * from './instanceGateway';
8
+ export * from './modelGatewayClient';
9
+ export * from './emailClient';
10
+ export * from './smsClient';
11
+ export * from './whatsappClient';
12
+ export * from './voiceClient';
13
+ export * from './paymentsClient';
7
14
  export * from './discriminateAuthMethod';
8
15
  export * from './guards/isForklaunchRequest';
9
16
  export * from './guards/isForklaunchRouter';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AACnC,cAAc,sCAAsC,CAAC;AACrD,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0CAA0C,CAAC;AACzD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wDAAwD,CAAC;AACvE,cAAc,yCAAyC,CAAC;AACxD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sCAAsC,CAAC;AACrD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iCAAiC,CAAC;AAChD,cAAc,sCAAsC,CAAC;AACrD,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}