@effect-app/infra 2.30.4 → 2.31.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/_cjs/Emailer/Sendgrid.cjs +7 -2
- package/_cjs/Emailer/Sendgrid.cjs.map +1 -1
- package/_cjs/Emailer/service.cjs.map +1 -1
- package/_cjs/api/internal/events.cjs +1 -1
- package/_cjs/api/internal/events.cjs.map +1 -1
- package/dist/Emailer/Sendgrid.d.ts +7 -10
- package/dist/Emailer/Sendgrid.d.ts.map +1 -1
- package/dist/Emailer/Sendgrid.js +10 -3
- package/dist/Emailer/service.d.ts +23 -13
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +1 -1
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Model/Repository/internal/internal.d.ts +2 -2
- package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
- package/dist/Operations.d.ts +3 -3
- package/dist/QueueMaker/sbqueue.d.ts +2 -2
- package/dist/Store/service.d.ts +1 -1
- package/dist/adapters/ServiceBus.d.ts +1 -1
- package/dist/api/internal/events.js +2 -2
- package/package.json +12 -12
- package/src/Emailer/Sendgrid.ts +19 -8
- package/src/Emailer/service.ts +33 -11
- package/src/api/internal/events.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# @effect-app/infra
|
|
2
2
|
|
|
3
|
+
## 2.31.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 750b46a: update packages
|
|
8
|
+
- e599644: fix: repeat SSE keep-alive
|
|
9
|
+
- Updated dependencies [750b46a]
|
|
10
|
+
- effect-app@2.19.3
|
|
11
|
+
|
|
12
|
+
## 2.31.0
|
|
13
|
+
|
|
14
|
+
### Minor Changes
|
|
15
|
+
|
|
16
|
+
- 2b39183: improve: Tighten Sendgrid types and enable isMultiple by default
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 1bfc3d8: update packages
|
|
21
|
+
- Updated dependencies [1bfc3d8]
|
|
22
|
+
- effect-app@2.19.2
|
|
23
|
+
|
|
3
24
|
## 2.30.4
|
|
4
25
|
|
|
5
26
|
### Patch Changes
|
|
@@ -33,10 +33,15 @@ const makeSendgrid = ({
|
|
|
33
33
|
const renderedMsg_ = render(msg);
|
|
34
34
|
const renderedMsg = {
|
|
35
35
|
...renderedMsg_,
|
|
36
|
-
subject: `${subjectPrefix}${renderedMsg_.subject}
|
|
36
|
+
subject: `${subjectPrefix}${renderedMsg_.subject}`,
|
|
37
|
+
...("content" in renderedMsg_ ? {
|
|
38
|
+
content: [...renderedMsg_.content]
|
|
39
|
+
} : {})
|
|
37
40
|
};
|
|
38
41
|
yield* _logger.InfraLogger.logDebug("Sending email").pipe(_effectApp.Effect.annotateLogs("msg", (0, _util.inspect)(renderedMsg, false, 5)));
|
|
39
|
-
const ret = yield* _effectApp.Effect.async(cb => void _mail.default.send(renderedMsg,
|
|
42
|
+
const ret = yield* _effectApp.Effect.async(cb => void _mail.default.send(renderedMsg,
|
|
43
|
+
// sue me
|
|
44
|
+
msg.isMultiple ?? true, (err, result) => err ? cb(_effectApp.Effect.fail(err)) : cb(_effectApp.Effect.sync(() => result))));
|
|
40
45
|
// const event = {
|
|
41
46
|
// name: "EmailSent",
|
|
42
47
|
// properties: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sendgrid.cjs","names":["_mail","_interopRequireDefault","require","_effectApp","_utils","_util","_logger","_service","e","__esModule","default","makeSendgrid","apiKey","defaultFrom","defaultReplyTo","realMail","subjectPrefix","Effect","sync","sgMail","setApiKey","Redacted","value","Emailer","of","sendMail","msg_","gen","msg","dropUndefinedT","from","replyTo","undefined","render","renderMessage","renderedMsg_","renderedMsg","subject","InfraLogger","logDebug","pipe","annotateLogs","inspect","ret","async","cb","send","err","result","fail","Sendgrid","config","toLayer","forceFake","i","makeId","to","renderFake","cc","bcc","renderFakeIfTest","isTestAddress","toLowerCase","endsWith","email","addr","name","renderMailData","eq","Equivalence","mapInput","string","Array","isArray","dedupeWith","map","x","md","join"],"sources":["../../src/Emailer/Sendgrid.ts"],"sourcesContent":[null],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"Sendgrid.cjs","names":["_mail","_interopRequireDefault","require","_effectApp","_utils","_util","_logger","_service","e","__esModule","default","makeSendgrid","apiKey","defaultFrom","defaultReplyTo","realMail","subjectPrefix","Effect","sync","sgMail","setApiKey","Redacted","value","Emailer","of","sendMail","msg_","gen","msg","dropUndefinedT","from","replyTo","undefined","render","renderMessage","renderedMsg_","renderedMsg","subject","content","InfraLogger","logDebug","pipe","annotateLogs","inspect","ret","async","cb","send","isMultiple","err","result","fail","Sendgrid","config","toLayer","forceFake","i","makeId","to","renderFake","cc","bcc","renderFakeIfTest","isTestAddress","toLowerCase","endsWith","email","addr","name","renderMailData","eq","Equivalence","mapInput","string","Array","isArray","dedupeWith","map","x","md","join"],"sources":["../../src/Emailer/Sendgrid.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.cjs","names":["_effectApp","require","Emailer","Context","TagId","exports"],"sources":["../../src/Emailer/service.ts"],"sourcesContent":[null],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"service.cjs","names":["_effectApp","require","Emailer","Context","TagId","exports"],"sources":["../../src/Emailer/service.ts"],"sourcesContent":[null],"mappings":";;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AAGA;;;;AAIM,MAAOC,OAAQ,SAAQC,kBAAO,CAACC,KAAK,CAAC,oBAAoB,CAAC,EAE5D;AAAGC,OAAA,CAAAH,OAAA,GAAAA,OAAA","ignoreList":[]}
|
|
@@ -11,7 +11,7 @@ var _logger = require("../../logger.cjs");
|
|
|
11
11
|
var _setupRequest = require("../setupRequest.cjs");
|
|
12
12
|
// Tell the client to retry every 10 seconds if connectivity is lost
|
|
13
13
|
const setRetry = _effectApp.Stream.succeed("retry: 10000");
|
|
14
|
-
const keepAlive = _effectApp.Stream.
|
|
14
|
+
const keepAlive = _effectApp.Stream.repeat(_effectApp.Effect.succeed(":keep-alive"), _effectApp.Schedule.fixed(_effectApp.Duration.seconds(15)));
|
|
15
15
|
const makeSSE = schema => events => _effectApp.Effect.gen(function* () {
|
|
16
16
|
yield* _logger.InfraLogger.logInfo("$ start listening to events");
|
|
17
17
|
const enc = new TextEncoder();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.cjs","names":["_effectApp","require","_http","_errorReporter","_logger","_setupRequest","setRetry","Stream","succeed","keepAlive","
|
|
1
|
+
{"version":3,"file":"events.cjs","names":["_effectApp","require","_http","_errorReporter","_logger","_setupRequest","setRetry","Stream","succeed","keepAlive","repeat","Effect","Schedule","fixed","Duration","seconds","makeSSE","schema","events","gen","InfraLogger","logInfo","enc","TextEncoder","encode","S","eventStream","flatMap","_","evt","pipe","andThen","id","JSON","stringify","stream","merge","map","ctx","context","res","HttpServerResponse","tapErrorCause","reportError","provideContext","contentType","headers","HttpHeaders","fromInput","setupRequestContextFromCurrent","exports"],"sources":["../../../src/api/internal/events.ts"],"sourcesContent":[null],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,aAAA,GAAAJ,OAAA;AAEA;AACA,MAAMK,QAAQ,GAAGC,iBAAM,CAACC,OAAO,CAAC,cAAc,CAAC;AAC/C,MAAMC,SAAS,GAAGF,iBAAM,CAACG,MAAM,CAACC,iBAAM,CAACH,OAAO,CAAC,aAAa,CAAC,EAAEI,mBAAQ,CAACC,KAAK,CAACC,mBAAQ,CAACC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAE7F,MAAMC,OAAO,GAClBC,MAA2B,IAEtBC,MAA0D,IAC/DP,iBAAM,CACHQ,GAAG,CAAC,aAAS;EACZ,OAAOC,mBAAW,CAACC,OAAO,CAAC,6BAA6B,CAAC;EAEzD,MAAMC,GAAG,GAAG,IAAIC,WAAW,EAAE;EAE7B,MAAMC,MAAM,GAAGC,YAAC,CAACD,MAAM,CAACP,MAAM,CAAC;EAE/B,MAAMS,WAAW,GAAGnB,iBAAM,CAACoB,OAAO,CAChCT,MAAM,EACLU,CAAC,IACAJ,MAAM,CAACI,CAAC,CAACC,GAAG,CAAC,CACVC,IAAI,CAACnB,iBAAM,CAACoB,OAAO,CAAEF,GAAG,IAAK,OAAOD,CAAC,CAACC,GAAG,CAACG,EAAE,WAAWC,IAAI,CAACC,SAAS,CAACL,GAAG,CAAC,EAAE,CAAC,CAAC,CACpF;EAED,MAAMM,MAAM,GAAG,IAAAL,eAAI,EACjBxB,QAAQ,EACRC,iBAAM,CAAC6B,KAAK,CAAC3B,SAAS,CAAC,EACvBF,iBAAM,CAAC6B,KAAK,CAACV,WAAW,CAAC,EACzBnB,iBAAM,CAAC8B,GAAG,CAAET,CAAC,IAAKN,GAAG,CAACE,MAAM,CAACI,CAAC,GAAG,MAAM,CAAC,CAAC,CAC1C;EAED,MAAMU,GAAG,GAAG,OAAO3B,iBAAM,CAAC4B,OAAO,EAAU;EAC3C,MAAMC,GAAG,GAAGC,wBAAkB,CAACN,MAAM,CACnCA,MAAM,CACHL,IAAI,CACHvB,iBAAM,CAACmC,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAC5CpC,iBAAM,CAACqC,cAAc,CAACN,GAAG,CAAC,CAC3B,EACH;IACEO,WAAW,EAAE,mBAAmB;IAChCC,OAAO,EAAEC,iBAAW,CAACC,SAAS,CAAC;MAC7B,cAAc,EAAE,mBAAmB;MACnC,eAAe,EAAE,UAAU;MAC3B,mBAAmB,EAAE,IAAI;MACzB,YAAY,EAAE,YAAY,CAAC;KAC5B;GACF,CACF;EACD,OAAOR,GAAG;AACZ,CAAC,CAAC,CACDV,IAAI,CAACnB,iBAAM,CAAC+B,aAAa,CAAC,IAAAC,0BAAW,EAAC,SAAS,CAAC,CAAC,EAAE,IAAAM,4CAA8B,EAAC,QAAQ,CAAC,CAAC;AAAAC,OAAA,CAAAlC,OAAA,GAAAA,OAAA","ignoreList":[]}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { EmailData } from "@sendgrid/helpers/classes/email-address.js";
|
|
2
|
+
import type { MailContent } from "@sendgrid/helpers/classes/mail.js";
|
|
3
|
+
import { Array } from "effect-app";
|
|
2
4
|
import { Emailer } from "./service.js";
|
|
3
5
|
import type { EmailMsg, SendgridConfig } from "./service.js";
|
|
4
6
|
/**
|
|
@@ -12,13 +14,11 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
12
14
|
to: EmailData | EmailData[];
|
|
13
15
|
cc: EmailData | EmailData[];
|
|
14
16
|
bcc: EmailData | EmailData[];
|
|
15
|
-
from: EmailData;
|
|
16
17
|
replyTo?: EmailData;
|
|
17
18
|
sendAt?: number;
|
|
18
19
|
subject?: string;
|
|
19
20
|
text: string;
|
|
20
21
|
html?: string;
|
|
21
|
-
content?: import("@sendgrid/helpers/classes/mail.js").MailContent[];
|
|
22
22
|
templateId?: string;
|
|
23
23
|
personalizations?: import("@sendgrid/helpers/classes/personalization.js").PersonalizationData[];
|
|
24
24
|
attachments?: import("@sendgrid/helpers/classes/attachment.js").AttachmentData[];
|
|
@@ -48,17 +48,16 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
48
48
|
};
|
|
49
49
|
hideWarnings?: boolean;
|
|
50
50
|
replyToList?: import("@sendgrid/helpers/classes/email-address.js").EmailJSON | import("@sendgrid/helpers/classes/email-address.js").EmailJSON[];
|
|
51
|
+
from: import("./service.js").EmailData;
|
|
51
52
|
} | {
|
|
52
53
|
to: EmailData | EmailData[];
|
|
53
54
|
cc: EmailData | EmailData[];
|
|
54
55
|
bcc: EmailData | EmailData[];
|
|
55
|
-
from: EmailData;
|
|
56
56
|
replyTo?: EmailData;
|
|
57
57
|
sendAt?: number;
|
|
58
58
|
subject?: string;
|
|
59
59
|
text?: string;
|
|
60
60
|
html: string;
|
|
61
|
-
content?: import("@sendgrid/helpers/classes/mail.js").MailContent[];
|
|
62
61
|
templateId?: string;
|
|
63
62
|
personalizations?: import("@sendgrid/helpers/classes/personalization.js").PersonalizationData[];
|
|
64
63
|
attachments?: import("@sendgrid/helpers/classes/attachment.js").AttachmentData[];
|
|
@@ -88,17 +87,16 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
88
87
|
};
|
|
89
88
|
hideWarnings?: boolean;
|
|
90
89
|
replyToList?: import("@sendgrid/helpers/classes/email-address.js").EmailJSON | import("@sendgrid/helpers/classes/email-address.js").EmailJSON[];
|
|
90
|
+
from: import("./service.js").EmailData;
|
|
91
91
|
} | {
|
|
92
92
|
to: EmailData | EmailData[];
|
|
93
93
|
cc: EmailData | EmailData[];
|
|
94
94
|
bcc: EmailData | EmailData[];
|
|
95
|
-
from: EmailData;
|
|
96
95
|
replyTo?: EmailData;
|
|
97
96
|
sendAt?: number;
|
|
98
97
|
subject?: string;
|
|
99
98
|
text?: string;
|
|
100
99
|
html?: string;
|
|
101
|
-
content?: import("@sendgrid/helpers/classes/mail.js").MailContent[];
|
|
102
100
|
templateId: string;
|
|
103
101
|
personalizations?: import("@sendgrid/helpers/classes/personalization.js").PersonalizationData[];
|
|
104
102
|
attachments?: import("@sendgrid/helpers/classes/attachment.js").AttachmentData[];
|
|
@@ -128,19 +126,16 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
128
126
|
};
|
|
129
127
|
hideWarnings?: boolean;
|
|
130
128
|
replyToList?: import("@sendgrid/helpers/classes/email-address.js").EmailJSON | import("@sendgrid/helpers/classes/email-address.js").EmailJSON[];
|
|
129
|
+
from: import("./service.js").EmailData;
|
|
131
130
|
} | {
|
|
132
131
|
to: EmailData | EmailData[];
|
|
133
132
|
cc: EmailData | EmailData[];
|
|
134
133
|
bcc: EmailData | EmailData[];
|
|
135
|
-
from: EmailData;
|
|
136
134
|
replyTo?: EmailData;
|
|
137
135
|
sendAt?: number;
|
|
138
136
|
subject?: string;
|
|
139
137
|
text?: string;
|
|
140
138
|
html?: string;
|
|
141
|
-
content: import("@sendgrid/helpers/classes/mail.js").MailContent[] & {
|
|
142
|
-
0: import("@sendgrid/helpers/classes/mail.js").MailContent;
|
|
143
|
-
};
|
|
144
139
|
templateId?: string;
|
|
145
140
|
personalizations?: import("@sendgrid/helpers/classes/personalization.js").PersonalizationData[];
|
|
146
141
|
attachments?: import("@sendgrid/helpers/classes/attachment.js").AttachmentData[];
|
|
@@ -170,6 +165,8 @@ export declare function renderMessage(forceFake: boolean): (msg: EmailMsg) => {
|
|
|
170
165
|
};
|
|
171
166
|
hideWarnings?: boolean;
|
|
172
167
|
replyToList?: import("@sendgrid/helpers/classes/email-address.js").EmailJSON | import("@sendgrid/helpers/classes/email-address.js").EmailJSON[];
|
|
168
|
+
from: import("./service.js").EmailData;
|
|
169
|
+
content: Array.NonEmptyReadonlyArray<MailContent>;
|
|
173
170
|
};
|
|
174
171
|
/**
|
|
175
172
|
* @hidden
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sendgrid.d.ts","sourceRoot":"","sources":["../../src/Emailer/Sendgrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAA;
|
|
1
|
+
{"version":3,"file":"Sendgrid.d.ts","sourceRoot":"","sources":["../../src/Emailer/Sendgrid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4CAA4C,CAAA;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAEpE,OAAO,EAAE,KAAK,EAAiC,MAAM,YAAY,CAAA;AAIjE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,QAAQ,EAAwB,cAAc,EAAE,MAAM,cAAc,CAAA;AAwDlF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,uDAE9C;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,OAAO,SAWpC,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,WAO1C"}
|
package/dist/Emailer/Sendgrid.js
CHANGED
|
@@ -16,9 +16,16 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
16
16
|
});
|
|
17
17
|
const render = renderMessage(!realMail);
|
|
18
18
|
const renderedMsg_ = render(msg);
|
|
19
|
-
const renderedMsg = {
|
|
19
|
+
const renderedMsg = {
|
|
20
|
+
...renderedMsg_,
|
|
21
|
+
subject: `${subjectPrefix}${renderedMsg_.subject}`,
|
|
22
|
+
..."content" in renderedMsg_
|
|
23
|
+
? { content: [...renderedMsg_.content] }
|
|
24
|
+
: {}
|
|
25
|
+
};
|
|
20
26
|
yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)));
|
|
21
|
-
const ret = yield* Effect.async((cb) => void sgMail.send(renderedMsg,
|
|
27
|
+
const ret = yield* Effect.async((cb) => void sgMail.send(renderedMsg, // sue me
|
|
28
|
+
msg.isMultiple ?? true, (err, result) => err
|
|
22
29
|
? cb(Effect.fail(err))
|
|
23
30
|
: cb(Effect.sync(() => result))));
|
|
24
31
|
// const event = {
|
|
@@ -96,4 +103,4 @@ function renderMailData(md) {
|
|
|
96
103
|
}
|
|
97
104
|
return md.email;
|
|
98
105
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VuZGdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvRW1haWxlci9TZW5kZ3JpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLE1BQU0sTUFBTSxnQkFBZ0IsQ0FBQTtBQUNuQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUd0QyxNQUFNLFlBQVksR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBa0IsRUFBRSxFQUFFLENBQ3hHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ2YsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFFeEMsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ2hCLFFBQVEsQ0FBQyxJQUEwQjtZQUNqQyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUN6QixNQUFNLEdBQUcsR0FBYSxjQUFjLENBQUM7b0JBQ25DLEdBQUcsSUFBSTtvQkFDUCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXO29CQUM5QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDO2lCQUNsRSxDQUFDLENBQUE7Z0JBQ0YsTUFBTSxNQUFNLEdB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
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js";
|
|
2
2
|
import type { ResponseError } from "@sendgrid/mail";
|
|
3
|
-
import type sgMail from "@sendgrid/mail";
|
|
4
3
|
import type { Effect, NonEmptyReadonlyArray, Redacted } from "effect-app";
|
|
5
4
|
import { Context } from "effect-app";
|
|
6
|
-
import type { Email
|
|
5
|
+
import type { Email } from "effect-app/Schema";
|
|
7
6
|
declare const Emailer_base: (abstract new (service: {
|
|
8
7
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect<void, Error | ResponseError>;
|
|
9
8
|
}) => Readonly<{
|
|
@@ -27,24 +26,33 @@ declare const Emailer_base: (abstract new (service: {
|
|
|
27
26
|
*/
|
|
28
27
|
export declare class Emailer extends Emailer_base {
|
|
29
28
|
}
|
|
29
|
+
export type EmailData = Email | {
|
|
30
|
+
name?: string;
|
|
31
|
+
email: Email;
|
|
32
|
+
};
|
|
30
33
|
export interface SendgridConfig {
|
|
31
|
-
defaultReplyTo?:
|
|
32
|
-
name?: NonEmptyString255;
|
|
33
|
-
email: Email;
|
|
34
|
-
};
|
|
34
|
+
defaultReplyTo?: EmailData;
|
|
35
35
|
subjectPrefix: string;
|
|
36
36
|
realMail: boolean;
|
|
37
|
-
defaultFrom:
|
|
38
|
-
name?: NonEmptyString255;
|
|
39
|
-
email: Email;
|
|
40
|
-
};
|
|
37
|
+
defaultFrom: EmailData;
|
|
41
38
|
apiKey: Redacted.Redacted<string>;
|
|
42
39
|
}
|
|
43
|
-
export type EmailMsg = sgMail.MailDataRequired;
|
|
44
40
|
export type EmailTemplateMsg = MailData & {
|
|
45
41
|
templateId: string;
|
|
46
42
|
};
|
|
47
|
-
export type
|
|
43
|
+
export type EmailRecipients = EmailData | NonEmptyReadonlyArray<EmailData>;
|
|
44
|
+
export type EmailMsgBase = Omit<MailData, "from" | "to" | "bcc" | "cc" | "content"> & {
|
|
45
|
+
to: EmailData | NonEmptyReadonlyArray<EmailData>;
|
|
46
|
+
cc?: EmailData | NonEmptyReadonlyArray<EmailData>;
|
|
47
|
+
bcc?: EmailData | NonEmptyReadonlyArray<EmailData>;
|
|
48
|
+
from: EmailData;
|
|
49
|
+
/**
|
|
50
|
+
* should multiple `to` addresess be considered multiple emails?
|
|
51
|
+
* defaults to `true`, not to leak email addresses
|
|
52
|
+
*/
|
|
53
|
+
isMultiple?: boolean;
|
|
54
|
+
};
|
|
55
|
+
export type EmailContent = {
|
|
48
56
|
text: string;
|
|
49
57
|
} | {
|
|
50
58
|
html: string;
|
|
@@ -52,6 +60,8 @@ export type EmailMsgOptionalFrom = Omit<MailData, "from"> & ({
|
|
|
52
60
|
templateId: string;
|
|
53
61
|
} | {
|
|
54
62
|
content: NonEmptyReadonlyArray<MailContent>;
|
|
55
|
-
}
|
|
63
|
+
};
|
|
64
|
+
export type EmailMsg = EmailMsgBase & EmailContent;
|
|
65
|
+
export type EmailMsgOptionalFrom = Omit<EmailMsgBase, "from"> & Partial<Pick<EmailMsg, "from">> & EmailContent;
|
|
56
66
|
export {};
|
|
57
67
|
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/Emailer/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/Emailer/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAA;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;;cAOlC,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;cAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;cAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;;;;;;;;kBAAlE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAAC;;;AAL9E;;;GAGG;AACH,qBAAa,OAAQ,SAAQ,YAEzB;CAAG;AAEP,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;IACjB,WAAW,EAAE,SAAS,CAAA;IACtB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;CAClC;AACD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAA;AAEhE,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;AAE1E,MAAM,MAAM,YAAY,GACpB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,SAAS,CAAC,GACxD;IACA,EAAE,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IAChD,EAAE,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IACjD,GAAG,CAAC,EAAE,SAAS,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAA;IAClD,IAAI,EAAE,SAAS,CAAA;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,CAAA;AAEH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IACxF,OAAO,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;CAC5C,CAAA;AAED,MAAM,MAAM,QAAQ,GAChB,YAAY,GACZ,YAAY,CAAA;AAEhB,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAAG,YAAY,CAAA"}
|
package/dist/Emailer/service.js
CHANGED
|
@@ -5,4 +5,4 @@ import { Context } from "effect-app";
|
|
|
5
5
|
*/
|
|
6
6
|
export class Emailer extends Context.TagId("effect-app/Emailer")() {
|
|
7
7
|
}
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9FbWFpbGVyL3NlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdwQzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sT0FBUSxTQUFRLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsRUFFNUQ7Q0FBRyJ9
|
package/dist/MainFiberSet.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ declare const MainFiberSet_base: (abstract new (service: {
|
|
|
44
44
|
run: <R_1, XE extends never, XA extends unknown>(effect: Effect.Effect<XA, XE, R_1>) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R_1>;
|
|
45
45
|
add: (...fibers: Fiber.RuntimeFiber<never, never>[]) => Effect.Effect<void, never, never>;
|
|
46
46
|
addAll: (fibers: readonly Fiber.RuntimeFiber<never, never>[]) => Effect.Effect<void, never, never>;
|
|
47
|
-
}) => X) => X extends Effect.Effect<infer A_1, infer E_2, infer R_4> ? Effect.Effect<A_1, E_2,
|
|
47
|
+
}) => X) => X extends Effect.Effect<infer A_1, infer E_2, infer R_4> ? Effect.Effect<A_1, E_2, MainFiberSet | R_4> : Effect.Effect<X, never, MainFiberSet>;
|
|
48
48
|
};
|
|
49
49
|
/**
|
|
50
50
|
* Whenever you fork long running (e.g worker) fibers via e.g `Effect.forkScoped` or `Effect.forkDaemon`
|
|
@@ -22,12 +22,12 @@ export declare function makeRepoInternal<Evt = never>(): <ItemType extends strin
|
|
|
22
22
|
config?: Omit<StoreConfig<Encoded>, "partitionValue"> & {
|
|
23
23
|
partitionValue?: (a: Encoded) => string;
|
|
24
24
|
};
|
|
25
|
-
}) => Effect.Effect<Repository<T, Encoded, Evt, ItemType, IdKey, Exclude<R, RCtx>, RPublish>, E,
|
|
25
|
+
}) => Effect.Effect<Repository<T, Encoded, Evt, ItemType, IdKey, Exclude<R, RCtx>, RPublish>, E, R | RInitial | StoreMaker>;
|
|
26
26
|
Q: Q.Query<Encoded>;
|
|
27
27
|
};
|
|
28
28
|
export declare function makeStore<Encoded extends FieldValues>(): <ItemType extends string, R, E, T, IdKey extends keyof Encoded>(name: ItemType, schema: S.Schema<T, E, R>, mapTo: (e: E, etag: string | undefined) => Encoded, idKey: IdKey) => <RInitial = never, EInitial = never>(makeInitial?: Effect<readonly T[], EInitial, RInitial>, config?: Omit<StoreConfig<Encoded>, "partitionValue"> & {
|
|
29
29
|
partitionValue?: (a: Encoded) => string;
|
|
30
|
-
}) => Effect.Effect<import("../../../Store.js").Store<IdKey, Encoded, PersistenceModelType<Encoded>>, EInitial,
|
|
30
|
+
}) => Effect.Effect<import("../../../Store.js").Store<IdKey, Encoded, PersistenceModelType<Encoded>>, EInitial, R | RInitial | StoreMaker>;
|
|
31
31
|
export interface Repos<T, Encoded extends {
|
|
32
32
|
id: string;
|
|
33
33
|
}, RSchema, Evt, ItemType extends string, IdKey extends keyof T, RPublish> {
|
|
@@ -15,7 +15,7 @@ export declare const toFilter: <TFieldValues extends FieldValues, A, R, TFieldVa
|
|
|
15
15
|
key: import("../filter/types/path/eager.js").Path<TFieldValues>;
|
|
16
16
|
direction: "ASC" | "DESC";
|
|
17
17
|
}[]];
|
|
18
|
-
ttype: "one" | "
|
|
18
|
+
ttype: "one" | "count" | "many";
|
|
19
19
|
mode: "project" | "collect" | "transform";
|
|
20
20
|
filter: FilterResult[];
|
|
21
21
|
};
|
package/dist/Operations.d.ts
CHANGED
|
@@ -56,15 +56,15 @@ declare const Operations_base: (abstract new (service: {
|
|
|
56
56
|
update: (id: OperationId, progress: OperationProgress) => Effect.Effect<void, never, never>;
|
|
57
57
|
}>) & {
|
|
58
58
|
toLayer: {
|
|
59
|
-
(): Layer.Layer<Operations, never,
|
|
59
|
+
(): Layer.Layer<Operations, never, OperationsRepo | RequestFiberSet>;
|
|
60
60
|
<E_1, R_1>(eff: Effect.Effect<Omit<Operations, keyof Context.TagClassShape<any, any>>, E_1, R_1>): Layer.Layer<Operations, E_1, R_1>;
|
|
61
61
|
};
|
|
62
62
|
toLayerScoped: {
|
|
63
|
-
(): Layer.Layer<Operations, never,
|
|
63
|
+
(): Layer.Layer<Operations, never, OperationsRepo | RequestFiberSet>;
|
|
64
64
|
<E_1, R_2>(eff: Effect.Effect<Context.TagClassShape<any, any>, E_1, R_2>): Layer.Layer<Operations, E_1, Exclude<R_2, Scope.Scope>>;
|
|
65
65
|
};
|
|
66
66
|
of: (service: Context.TagClassShape<any, any>) => Operations;
|
|
67
|
-
make: Effect.Effect<Operations, never,
|
|
67
|
+
make: Effect.Effect<Operations, never, OperationsRepo | RequestFiberSet>;
|
|
68
68
|
} & Context.Tag<Operations, Operations> & {
|
|
69
69
|
cleanup: Effect.Effect<void[], never, Operations>;
|
|
70
70
|
register: (title: S.NonEmptyString2k) => Effect.Effect<S.StringId, never, Scope.Scope | Operations>;
|
|
@@ -14,9 +14,9 @@ export declare function makeServiceBusQueue<Evt extends {
|
|
|
14
14
|
}, EvtE, DrainEvtE>(queueName: string, queueDrainName: string, schema: S.Schema<Evt, EvtE>, drainSchema: S.Schema<DrainEvt, DrainEvtE>): Effect.Effect<{
|
|
15
15
|
drain: <DrainE, DrainR>(handleEvent: (ks: DrainEvt) => Effect<void, DrainE, DrainR>, sessionId?: string) => Effect.Effect<never, never, import("effect/Scope").Scope | Exclude<Exclude<Exclude<Exclude<DrainR, Tracer.ParentSpan>, never>, Tracer.ParentSpan>, ServiceBusReceiverFactory>>;
|
|
16
16
|
publish: (messages_0: Evt, ...messages: Evt[]) => Effect.Effect<void, never, never>;
|
|
17
|
-
}, never, import("@azure/service-bus").ServiceBusSender
|
|
17
|
+
}, never, ServiceBusReceiverFactory | import("@azure/service-bus").ServiceBusSender>;
|
|
18
18
|
/**
|
|
19
19
|
* @tsplus static QueueMaker.Ops makeServiceBusLayers
|
|
20
20
|
*/
|
|
21
|
-
export declare function makeServiceBusLayers(url: string, queueName: string, queueDrainName: string): Layer.Layer<import("@azure/service-bus").ServiceBusSender
|
|
21
|
+
export declare function makeServiceBusLayers(url: string, queueName: string, queueDrainName: string): Layer.Layer<ServiceBusReceiverFactory | import("@azure/service-bus").ServiceBusSender, never, never>;
|
|
22
22
|
//# sourceMappingURL=sbqueue.d.ts.map
|
package/dist/Store/service.d.ts
CHANGED
|
@@ -127,7 +127,7 @@ declare const ContextMap_base: (abstract new (service: {
|
|
|
127
127
|
use: <X>(body: (_: {
|
|
128
128
|
get: (id: string) => string | undefined;
|
|
129
129
|
set: (id: string, eTag: string | undefined) => void;
|
|
130
|
-
}) => X) => X extends Effect.Effect<infer A_1, infer E_2, infer R_4> ? Effect.Effect<A_1, E_2,
|
|
130
|
+
}) => X) => X extends Effect.Effect<infer A_1, infer E_2, infer R_4> ? Effect.Effect<A_1, E_2, R_4 | ContextMap> : Effect.Effect<X, never, ContextMap>;
|
|
131
131
|
};
|
|
132
132
|
/**
|
|
133
133
|
* @tsplus type ContextMap
|
|
@@ -31,7 +31,7 @@ export declare class ServiceBusReceiverFactory extends ServiceBusReceiverFactory
|
|
|
31
31
|
static readonly Live: (queueName: string) => Layer.Layer<ServiceBusReceiverFactory, never, ServiceBusClient>;
|
|
32
32
|
}
|
|
33
33
|
export declare function sendMessages(messages: ServiceBusMessage | ServiceBusMessage[] | ServiceBusMessageBatch, options?: OperationOptionsBase): Effect.Effect<void, never, ServiceBusSender>;
|
|
34
|
-
export declare function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string): Effect.Effect<void, never, Scope.Scope |
|
|
34
|
+
export declare function subscribe<RMsg, RErr>(hndlr: MessageHandlers<RMsg, RErr>, sessionId?: string): Effect.Effect<void, never, Scope.Scope | RMsg | RErr | ServiceBusReceiverFactory>;
|
|
35
35
|
export interface MessageHandlers<RMsg, RErr> {
|
|
36
36
|
/**
|
|
37
37
|
* Handler that processes messages from service bus.
|
|
@@ -5,7 +5,7 @@ import { InfraLogger } from "../../logger.js";
|
|
|
5
5
|
import { setupRequestContextFromCurrent } from "../setupRequest.js";
|
|
6
6
|
// Tell the client to retry every 10 seconds if connectivity is lost
|
|
7
7
|
const setRetry = Stream.succeed("retry: 10000");
|
|
8
|
-
const keepAlive = Stream.
|
|
8
|
+
const keepAlive = Stream.repeat(Effect.succeed(":keep-alive"), Schedule.fixed(Duration.seconds(15)));
|
|
9
9
|
export const makeSSE = (schema) => (events) => Effect
|
|
10
10
|
.gen(function* () {
|
|
11
11
|
yield* InfraLogger.logInfo("$ start listening to events");
|
|
@@ -28,4 +28,4 @@ export const makeSSE = (schema) => (events) => Effect
|
|
|
28
28
|
return res;
|
|
29
29
|
})
|
|
30
30
|
.pipe(Effect.tapErrorCause(reportError("Request")), setupRequestContextFromCurrent("events"));
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwaS9pbnRlcm5hbC9ldmVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUE7QUFDcEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzdDLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRW5FLG9FQUFvRTtBQUNwRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFBO0FBQy9DLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBRXBHLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxDQUNyQixNQUEyQixFQUMzQixFQUFFLENBQ0osQ0FBTyxNQUEwRCxFQUFFLEVBQUUsQ0FDbkUsTUFBTTtLQUNILEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDWixLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFFekQsTUFBTSxHQUFHLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQTtJQUU3QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRS9CLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQ2hDLE1BQU0sRUFDTixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDVixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsV0FBVyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNwRixDQUFBO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUNqQixRQUFRLEVBQ1IsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFDdkIsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFDekIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FDMUMsQ0FBQTtJQUVELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQVUsQ0FBQTtJQUMzQyxNQUFNLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQ25DLE1BQU07U0FDSCxJQUFJLENBQ0gsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFDNUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FDM0IsRUFDSDtRQUNFLFdBQVcsRUFBRSxtQkFBbUI7UUFDaEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUM7WUFDN0IsY0FBYyxFQUFFLG1CQUFtQjtZQUNuQyxlQUFlLEVBQUUsVUFBVTtZQUMzQixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFlBQVksRUFBRSxZQUFZLENBQUMsaUNBQWlDO1NBQzdELENBQUM7S0FDSCxDQUNGLENBQUE7SUFDRCxPQUFPLEdBQUcsQ0FBQTtBQUNaLENBQUMsQ0FBQztLQUNELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUEifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effect-app/infra",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.31.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
@@ -13,19 +13,19 @@
|
|
|
13
13
|
"proper-lockfile": "^4.1.2",
|
|
14
14
|
"pure-rand": "6.1.0",
|
|
15
15
|
"query-string": "^9.1.1",
|
|
16
|
-
"effect-app": "2.19.
|
|
16
|
+
"effect-app": "2.19.3"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@azure/cosmos": "^4.2.0",
|
|
20
20
|
"@azure/service-bus": "^7.9.5",
|
|
21
|
-
"@babel/cli": "^7.
|
|
21
|
+
"@babel/cli": "^7.26.4",
|
|
22
22
|
"@sentry/node": "^8.42.0",
|
|
23
23
|
"@types/express": "^5.0.0",
|
|
24
24
|
"@types/node": "~22.10.1",
|
|
25
25
|
"@types/proper-lockfile": "^4.1.4",
|
|
26
26
|
"@types/redis": "^2.8.32",
|
|
27
27
|
"@types/redlock": "^4.0.7",
|
|
28
|
-
"express": "^4.21.
|
|
28
|
+
"express": "^4.21.2",
|
|
29
29
|
"jwks-rsa": "2.1.4",
|
|
30
30
|
"jwt-decode": "^4.0.0",
|
|
31
31
|
"mongodb": "6.11.0",
|
|
@@ -38,18 +38,18 @@
|
|
|
38
38
|
"peerDependencies": {
|
|
39
39
|
"@azure/cosmos": "^4.2.0",
|
|
40
40
|
"@azure/service-bus": "^7.9.5",
|
|
41
|
-
"@effect/experimental": "^0.33.
|
|
42
|
-
"@effect/platform": "^0.70.
|
|
43
|
-
"@effect/rpc-http": "^0.43.
|
|
44
|
-
"@effect/rpc": "^0.45.
|
|
45
|
-
"@effect/sql": "^0.22.
|
|
46
|
-
"@effect/vitest": "^0.14.
|
|
41
|
+
"@effect/experimental": "^0.33.4",
|
|
42
|
+
"@effect/platform": "^0.70.4",
|
|
43
|
+
"@effect/rpc-http": "^0.43.4",
|
|
44
|
+
"@effect/rpc": "^0.45.4",
|
|
45
|
+
"@effect/sql": "^0.22.4",
|
|
46
|
+
"@effect/vitest": "^0.14.3",
|
|
47
47
|
"@sendgrid/helpers": "^8.0.0",
|
|
48
48
|
"@sendgrid/mail": "^8.1.4",
|
|
49
49
|
"redis": "^3.1.2",
|
|
50
50
|
"redlock": "^4.2.0",
|
|
51
|
-
"effect": "^3.11.
|
|
52
|
-
"express": "^4.21.
|
|
51
|
+
"effect": "^3.11.3",
|
|
52
|
+
"express": "^4.21.2"
|
|
53
53
|
},
|
|
54
54
|
"typesVersions": {
|
|
55
55
|
"*": {
|
package/src/Emailer/Sendgrid.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
|
|
2
|
+
import type { MailContent } from "@sendgrid/helpers/classes/mail.js"
|
|
2
3
|
import sgMail from "@sendgrid/mail"
|
|
3
4
|
import { Array, Effect, Equivalence, Redacted } from "effect-app"
|
|
4
5
|
import { dropUndefinedT } from "effect-app/utils"
|
|
@@ -22,7 +23,13 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
22
23
|
const render = renderMessage(!realMail)
|
|
23
24
|
|
|
24
25
|
const renderedMsg_ = render(msg)
|
|
25
|
-
const renderedMsg = {
|
|
26
|
+
const renderedMsg = {
|
|
27
|
+
...renderedMsg_ as Omit<typeof renderedMsg_, "content">,
|
|
28
|
+
subject: `${subjectPrefix}${renderedMsg_.subject}`,
|
|
29
|
+
..."content" in renderedMsg_
|
|
30
|
+
? { content: [...renderedMsg_.content] as [MailContent, ...MailContent[]] }
|
|
31
|
+
: {}
|
|
32
|
+
}
|
|
26
33
|
yield* InfraLogger.logDebug("Sending email").pipe(Effect.annotateLogs("msg", inspect(renderedMsg, false, 5)))
|
|
27
34
|
|
|
28
35
|
const ret = yield* Effect.async<
|
|
@@ -30,10 +37,14 @@ const makeSendgrid = ({ apiKey, defaultFrom, defaultReplyTo, realMail, subjectPr
|
|
|
30
37
|
Error | sgMail.ResponseError
|
|
31
38
|
>(
|
|
32
39
|
(cb) =>
|
|
33
|
-
void sgMail.send(
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
void sgMail.send(
|
|
41
|
+
renderedMsg as any, // sue me
|
|
42
|
+
msg.isMultiple ?? true,
|
|
43
|
+
(err, result) =>
|
|
44
|
+
err
|
|
45
|
+
? cb(Effect.fail(err))
|
|
46
|
+
: cb(Effect.sync(() => result))
|
|
47
|
+
)
|
|
37
48
|
)
|
|
38
49
|
|
|
39
50
|
// const event = {
|
|
@@ -93,7 +104,7 @@ export function isTestAddress(to: EmailData) {
|
|
|
93
104
|
)
|
|
94
105
|
}
|
|
95
106
|
|
|
96
|
-
function renderFake(addr: EmailData | EmailData[], makeId: () => number) {
|
|
107
|
+
function renderFake(addr: EmailData | readonly EmailData[], makeId: () => number) {
|
|
97
108
|
return {
|
|
98
109
|
name: renderMailData(addr),
|
|
99
110
|
email: `test+${makeId()}@nomizz.com`
|
|
@@ -106,7 +117,7 @@ const eq = Equivalence.mapInput(
|
|
|
106
117
|
|
|
107
118
|
// TODO: should just not add any already added email address
|
|
108
119
|
// https://stackoverflow.com/a/53603076/11595834
|
|
109
|
-
function renderFakeIfTest(addr: EmailData | EmailData[], makeId: () => number) {
|
|
120
|
+
function renderFakeIfTest(addr: EmailData | readonly EmailData[], makeId: () => number) {
|
|
110
121
|
return Array.isArray(addr)
|
|
111
122
|
? Array.dedupeWith(
|
|
112
123
|
addr
|
|
@@ -118,7 +129,7 @@ function renderFakeIfTest(addr: EmailData | EmailData[], makeId: () => number) {
|
|
|
118
129
|
: addr
|
|
119
130
|
}
|
|
120
131
|
|
|
121
|
-
function renderMailData(md:
|
|
132
|
+
function renderMailData(md: EmailData | readonly EmailData[]): string {
|
|
122
133
|
if (Array.isArray(md)) {
|
|
123
134
|
return md.map(renderMailData).join(", ")
|
|
124
135
|
}
|
package/src/Emailer/service.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
2
|
import type { ResponseError } from "@sendgrid/mail"
|
|
3
|
-
import type sgMail from "@sendgrid/mail"
|
|
4
3
|
import type { Effect, NonEmptyReadonlyArray, Redacted } from "effect-app"
|
|
5
4
|
import { Context } from "effect-app"
|
|
6
|
-
import type { Email
|
|
5
|
+
import type { Email } from "effect-app/Schema"
|
|
7
6
|
|
|
8
7
|
/**
|
|
9
8
|
* @tsplus type Emailer
|
|
@@ -13,19 +12,42 @@ export class Emailer extends Context.TagId("effect-app/Emailer")<Emailer, {
|
|
|
13
12
|
sendMail: (msg: EmailMsgOptionalFrom) => Effect<void, Error | ResponseError>
|
|
14
13
|
}>() {}
|
|
15
14
|
|
|
15
|
+
export type EmailData = Email | {
|
|
16
|
+
name?: string
|
|
17
|
+
email: Email
|
|
18
|
+
}
|
|
19
|
+
|
|
16
20
|
export interface SendgridConfig {
|
|
17
|
-
defaultReplyTo?:
|
|
21
|
+
defaultReplyTo?: EmailData
|
|
18
22
|
subjectPrefix: string
|
|
19
23
|
realMail: boolean
|
|
20
|
-
defaultFrom:
|
|
24
|
+
defaultFrom: EmailData
|
|
21
25
|
apiKey: Redacted.Redacted<string>
|
|
22
26
|
}
|
|
23
|
-
export type EmailMsg = sgMail.MailDataRequired
|
|
24
27
|
export type EmailTemplateMsg = MailData & { templateId: string }
|
|
25
28
|
|
|
26
|
-
export type
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
export type EmailRecipients = EmailData | NonEmptyReadonlyArray<EmailData>
|
|
30
|
+
|
|
31
|
+
export type EmailMsgBase =
|
|
32
|
+
& Omit<MailData, "from" | "to" | "bcc" | "cc" | "content">
|
|
33
|
+
& {
|
|
34
|
+
to: EmailData | NonEmptyReadonlyArray<EmailData>
|
|
35
|
+
cc?: EmailData | NonEmptyReadonlyArray<EmailData>
|
|
36
|
+
bcc?: EmailData | NonEmptyReadonlyArray<EmailData>
|
|
37
|
+
from: EmailData
|
|
38
|
+
/**
|
|
39
|
+
* should multiple `to` addresess be considered multiple emails?
|
|
40
|
+
* defaults to `true`, not to leak email addresses
|
|
41
|
+
*/
|
|
42
|
+
isMultiple?: boolean
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type EmailContent = { text: string } | { html: string } | { templateId: string } | {
|
|
46
|
+
content: NonEmptyReadonlyArray<MailContent>
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export type EmailMsg =
|
|
50
|
+
& EmailMsgBase
|
|
51
|
+
& EmailContent
|
|
52
|
+
|
|
53
|
+
export type EmailMsgOptionalFrom = Omit<EmailMsgBase, "from"> & Partial<Pick<EmailMsg, "from">> & EmailContent
|
|
@@ -6,7 +6,7 @@ import { setupRequestContextFromCurrent } from "../setupRequest.js"
|
|
|
6
6
|
|
|
7
7
|
// Tell the client to retry every 10 seconds if connectivity is lost
|
|
8
8
|
const setRetry = Stream.succeed("retry: 10000")
|
|
9
|
-
const keepAlive = Stream.
|
|
9
|
+
const keepAlive = Stream.repeat(Effect.succeed(":keep-alive"), Schedule.fixed(Duration.seconds(15)))
|
|
10
10
|
|
|
11
11
|
export const makeSSE = <A extends { id: any }, SI, SR>(
|
|
12
12
|
schema: S.Schema<A, SI, SR>
|