@bumail/smtp 0.1.0 → 0.2.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/README.md +148 -6
- package/dist/chunks/index-2ybj2z1w.js +216 -0
- package/dist/chunks/index-2ybj2z1w.js.map +14 -0
- package/dist/client/content.d.ts +25 -0
- package/dist/client/content.d.ts.map +1 -0
- package/dist/client/inbox.d.ts +18 -0
- package/dist/client/inbox.d.ts.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +945 -0
- package/dist/client/index.js.map +22 -0
- package/dist/client/mx.d.ts +29 -0
- package/dist/client/mx.d.ts.map +1 -0
- package/dist/client/options.d.ts +136 -0
- package/dist/client/options.d.ts.map +1 -0
- package/dist/client/refusal.d.ts +15 -0
- package/dist/client/refusal.d.ts.map +1 -0
- package/dist/client/send.d.ts +13 -0
- package/dist/client/send.d.ts.map +1 -0
- package/dist/client/session.d.ts +11 -0
- package/dist/client/session.d.ts.map +1 -0
- package/dist/client/settings.d.ts +30 -0
- package/dist/client/settings.d.ts.map +1 -0
- package/dist/client/socket.d.ts +31 -0
- package/dist/client/socket.d.ts.map +1 -0
- package/dist/client/target.d.ts +29 -0
- package/dist/client/target.d.ts.map +1 -0
- package/dist/client/transaction.d.ts +15 -0
- package/dist/client/transaction.d.ts.map +1 -0
- package/dist/errors.d.ts +28 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.js +115 -196
- package/dist/index.js.map +9 -13
- package/dist/io/outgoing.d.ts +21 -0
- package/dist/io/outgoing.d.ts.map +1 -0
- package/dist/protocol/data-writer.d.ts +22 -0
- package/dist/protocol/data-writer.d.ts.map +1 -0
- package/dist/protocol/ehlo.d.ts +7 -0
- package/dist/protocol/ehlo.d.ts.map +1 -0
- package/dist/{server → protocol}/lines.d.ts +9 -4
- package/dist/protocol/lines.d.ts.map +1 -0
- package/dist/protocol/reply-reader.d.ts +19 -0
- package/dist/protocol/reply-reader.d.ts.map +1 -0
- package/dist/protocol/sasl.d.ts +4 -0
- package/dist/protocol/sasl.d.ts.map +1 -1
- package/dist/server/connection.d.ts +8 -0
- package/dist/server/connection.d.ts.map +1 -1
- package/dist/server/input.d.ts.map +1 -1
- package/dist/server/options.d.ts +2 -1
- package/dist/server/options.d.ts.map +1 -1
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/settings.d.ts.map +1 -1
- package/dist/server/transport.d.ts +21 -4
- package/dist/server/transport.d.ts.map +1 -1
- package/docs/README.md +3 -3
- package/docs/guide.md +381 -9
- package/docs/roadmap.md +43 -8
- package/docs/troubleshooting.md +668 -7
- package/package.json +12 -4
- package/dist/server/lines.d.ts.map +0 -1
|
@@ -1,14 +1,17 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* The longest line taken, CRLF included: a command (RFC 5321 §4.5.3.1.4
|
|
3
|
+
* asks for 512 at least) or a reply line (§4.5.3.1.5, 512 too).
|
|
4
|
+
*/
|
|
2
5
|
export declare const MAX_LINE = 2048;
|
|
3
|
-
/** One line from the
|
|
6
|
+
/** One line from the peer, or a line that was too long and was skipped. */
|
|
4
7
|
export type LineEvent = {
|
|
5
8
|
line: string;
|
|
6
9
|
} | {
|
|
7
10
|
tooLong: true;
|
|
8
11
|
};
|
|
9
12
|
/**
|
|
10
|
-
* Cuts
|
|
11
|
-
* CR. It holds one partial line at most: past `MAX_LINE`, the line is
|
|
13
|
+
* Cuts a peer's bytes into lines — a client's commands, a server's
|
|
14
|
+
* replies — ending at LF with or without CR. It holds one partial line at most: past `MAX_LINE`, the line is
|
|
12
15
|
* skipped to its end and reported once.
|
|
13
16
|
*/
|
|
14
17
|
export declare class LineSplitter {
|
|
@@ -17,6 +20,8 @@ export declare class LineSplitter {
|
|
|
17
20
|
push(chunk: Uint8Array): void;
|
|
18
21
|
/** The next line of the current chunk, or `undefined` when it has no more. */
|
|
19
22
|
next(): LineEvent | undefined;
|
|
23
|
+
/** Bytes are held or left: a line begun, or lines not yet read. */
|
|
24
|
+
get holding(): boolean;
|
|
20
25
|
/** What is left of the current chunk: message content pipelined after DATA. */
|
|
21
26
|
takeRest(): Uint8Array;
|
|
22
27
|
/** Forgets everything held: after STARTTLS, or after a refused DATA. */
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lines.d.ts","sourceRoot":"","sources":["../../src/protocol/lines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,QAAQ,OAAO,CAAC;AAE7B,2EAA2E;AAC3E,MAAM,MAAM,SAAS,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC;AAE7D;;;;GAIG;AACH,qBAAa,YAAY;;IAKxB,qDAAqD;IACrD,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAK7B,8EAA8E;IAC9E,IAAI,IAAI,SAAS,GAAG,SAAS;IAyB7B,mEAAmE;IACnE,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,+EAA+E;IAC/E,QAAQ,IAAI,UAAU;IAMtB,wEAAwE;IACxE,KAAK,IAAI,IAAI;CAKb"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Reply } from './reply';
|
|
2
|
+
/** The most lines one reply may have; an EHLO reply has a dozen or so. */
|
|
3
|
+
export declare const MAX_REPLY_LINES = 100;
|
|
4
|
+
/**
|
|
5
|
+
* Puts a server's reply lines together (RFC 5321 §4.2.1): `code-` lines,
|
|
6
|
+
* then a `code ` line, all with the same code. Each line costs one pass,
|
|
7
|
+
* and a reply holds `MAX_REPLY_LINES` at most; what is not a reply is an
|
|
8
|
+
* error, never guessed at.
|
|
9
|
+
*/
|
|
10
|
+
export declare class ReplyReader {
|
|
11
|
+
#private;
|
|
12
|
+
/** One line, CRLF taken off: the reply it completes, `undefined` while it goes on, or why it is not one. */
|
|
13
|
+
line(text: string): Reply | {
|
|
14
|
+
readonly error: string;
|
|
15
|
+
} | undefined;
|
|
16
|
+
}
|
|
17
|
+
/** A reply's text as one line: its lines joined with a space. */
|
|
18
|
+
export declare function replyText(reply: Reply): string;
|
|
19
|
+
//# sourceMappingURL=reply-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply-reader.d.ts","sourceRoot":"","sources":["../../src/protocol/reply-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,0EAA0E;AAC1E,eAAO,MAAM,eAAe,MAAM,CAAC;AAoDnC;;;;;GAKG;AACH,qBAAa,WAAW;;IAIvB,4GAA4G;IAC5G,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAuBlE;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE9C"}
|
package/dist/protocol/sasl.d.ts
CHANGED
|
@@ -13,4 +13,8 @@ export interface Credentials {
|
|
|
13
13
|
export declare function decodePlain(response: string): Credentials | undefined;
|
|
14
14
|
/** One step of LOGIN: a base64 line to its text. */
|
|
15
15
|
export declare function decodeLoginStep(response: string): string | undefined;
|
|
16
|
+
/** A client's PLAIN response (RFC 4616): `NUL username NUL password`, in base64, no authorization identity. */
|
|
17
|
+
export declare function encodePlain(username: string, password: string): string;
|
|
18
|
+
/** One step of LOGIN, the username or the password, in base64. */
|
|
19
|
+
export declare function encodeLoginStep(text: string): string;
|
|
16
20
|
//# sourceMappingURL=sasl.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sasl.d.ts","sourceRoot":"","sources":["../../src/protocol/sasl.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CAClC;AAcD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAerE;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE"}
|
|
1
|
+
{"version":3,"file":"sasl.d.ts","sourceRoot":"","sources":["../../src/protocol/sasl.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CAClC;AAcD,qEAAqE;AACrE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAerE;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE;AAID,+GAA+G;AAC/G,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,kEAAkE;AAClE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
|
@@ -24,7 +24,15 @@ export declare class Connection {
|
|
|
24
24
|
get session(): Session;
|
|
25
25
|
get closed(): boolean;
|
|
26
26
|
send(answer: Reply): void;
|
|
27
|
+
/**
|
|
28
|
+
* Hangs up, the server's decision (a refusal, too many errors, the idle
|
|
29
|
+
* time): `answer` is written, but nothing waits for a client that
|
|
30
|
+
* stopped reading. The connection is closed at once, and what it has
|
|
31
|
+
* not read is dropped, so a close always completes.
|
|
32
|
+
*/
|
|
27
33
|
close(answer?: Reply): void;
|
|
34
|
+
/** QUIT: `answer` leaves whole, then the connection hangs up. */
|
|
35
|
+
quit(answer: Reply): void;
|
|
28
36
|
/** Counts a failed command; past the limit, hangs up. */
|
|
29
37
|
fail(answer: Reply): void;
|
|
30
38
|
/** Hands an error to `onError`, which may not throw back. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/server/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAS,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,UAAU;;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,QAAQ,CAAC,EAAE,SAAqD;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAC5C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAmB;gBAG5B,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;IAapD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,2EAA2E;IAC3E,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,IAAI,OAAO,IAAI,OAAO,CAWrB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAKzB,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;IAQ3B,yDAAyD;IACzD,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAUzB,6DAA6D;IAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ5B;;;;OAIG;IACG,IAAI,CACT,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,EAC3C,QAAQ,UAAO,GACb,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAM7B,kGAAkG;IAC5F,KAAK,CAAC,CAAC,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACzB,QAAQ,UAAO,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE,CAAC;IAgB1D,qFAAqF;IAC/E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIhC,4DAA4D;IAC5D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrB"}
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/server/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,KAAK,EAAS,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAoB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;GAIG;AACH,qBAAa,UAAU;;IACtB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAE5B,QAAQ,CAAC,EAAE,SAAqD;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAC5C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAmB;gBAG5B,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS;IAapD,IAAI,SAAS,IAAI,SAAS,CAEzB;IAED,2EAA2E;IAC3E,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAIxC,IAAI,OAAO,IAAI,OAAO,CAWrB;IAED,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAKzB;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;IAQ3B,iEAAiE;IACjE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAQzB,yDAAyD;IACzD,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,IAAI;IAUzB,6DAA6D;IAC7D,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAQ5B;;;;OAIG;IACG,IAAI,CACT,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,EAC3C,QAAQ,UAAO,GACb,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAM7B,kGAAkG;IAC5F,KAAK,CAAC,CAAC,EACZ,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACzB,QAAQ,UAAO,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,CAAC,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,IAAI,CAAA;KAAE,CAAC;IAgB1D,qFAAqF;IAC/E,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,yEAAyE;IACzE,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAIhC,4DAA4D;IAC5D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/server/input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"input.d.ts","sourceRoot":"","sources":["../../src/server/input.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO/C;;;;;GAKG;AACH,qBAAa,KAAK;;IAajB,6CAA6C;IAC7C,KAAK,UAAS;gBAMF,UAAU,EAAE,UAAU;IAIlC,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAehC,4EAA4E;IAC5E,KAAK,IAAI,IAAI;IASb;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAQd,MAAM,IAAI,IAAI;IAId,yGAAyG;IACzG,IAAI,IAAI,IAAI;IAKZ,+EAA+E;IAC/E,SAAS,IAAI,IAAI;IAMjB,4DAA4D;IACtD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAkF3B"}
|
package/dist/server/options.d.ts
CHANGED
|
@@ -138,7 +138,8 @@ export interface SmtpServerOptions extends SmtpHooks {
|
|
|
138
138
|
/**
|
|
139
139
|
* Seconds a hook, `authenticate` or `localDomains` has to settle — and
|
|
140
140
|
* `onData` to read the next part of a message, then to answer once it
|
|
141
|
-
* ended. Past it, the command is refused with `451 4.3.0`. Default 60
|
|
141
|
+
* ended. Past it, the command is refused with `451 4.3.0`. Default 60,
|
|
142
|
+
* at most 2 147 483 (the longest delay `setTimeout` takes).
|
|
142
143
|
*/
|
|
143
144
|
readonly hookTimeout?: number;
|
|
144
145
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/server/options.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/server/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAWnD,MAAM,WAAW,UAAU;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,wEAAwE;IACxE,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAWnD,MAAM,WAAW,UAAU;IAC1B,0FAA0F;IAC1F,MAAM,CAAC,OAAO,EAAE;QACf,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,wEAAwE;IACxE,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACvC,wBAAwB;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC7B;AAyED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,UAAU,CAqEvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/server/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/server/settings.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,YAAY,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAkED,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,QAAQ,CA+C/D"}
|
|
@@ -7,8 +7,18 @@ export interface Transport {
|
|
|
7
7
|
write(text: string): void;
|
|
8
8
|
/** Resolves once everything written has left. */
|
|
9
9
|
drained(): Promise<void>;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Hangs up once everything written has left: a graceful close, as after
|
|
12
|
+
* QUIT. A socket not closed within `CLOSE_GRACE_MS` is terminated.
|
|
13
|
+
*/
|
|
11
14
|
end(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Hangs up now, the server's decision: what the socket already took
|
|
17
|
+
* leaves, but what still waits for a client that stopped reading is
|
|
18
|
+
* dropped and the connection reset, so the close never hangs on it.
|
|
19
|
+
* With nothing queued it hangs up as `end()` does, within the same grace.
|
|
20
|
+
*/
|
|
21
|
+
abort(): void;
|
|
12
22
|
/** Stops reading from the client, while the server catches up. */
|
|
13
23
|
pause(): void;
|
|
14
24
|
resume(): void;
|
|
@@ -18,9 +28,14 @@ export interface Transport {
|
|
|
18
28
|
restartIdle(seconds: number): void;
|
|
19
29
|
}
|
|
20
30
|
/**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
|
|
31
|
+
* How long any end may wait on the client — for what is queued to leave,
|
|
32
|
+
* then for the close itself — before the socket is terminated.
|
|
33
|
+
*/
|
|
34
|
+
export declare const CLOSE_GRACE_MS = 5000;
|
|
35
|
+
/**
|
|
36
|
+
* A Bun socket as a Transport. What the socket cannot take now waits in an
|
|
37
|
+
* `Outgoing` for the `drain` event, so no reply is lost to a client that
|
|
38
|
+
* reads slowly.
|
|
24
39
|
*/
|
|
25
40
|
export declare class SocketTransport implements Transport {
|
|
26
41
|
#private;
|
|
@@ -33,7 +48,9 @@ export declare class SocketTransport implements Transport {
|
|
|
33
48
|
drained(): Promise<void>;
|
|
34
49
|
/** The socket closed: nothing more will leave. */
|
|
35
50
|
closed(): void;
|
|
51
|
+
/** After `closed()`, does nothing: no grace is armed on a dead socket. */
|
|
36
52
|
end(): void;
|
|
53
|
+
abort(): void;
|
|
37
54
|
pause(): void;
|
|
38
55
|
resume(): void;
|
|
39
56
|
startTls(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAGlC,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,uFAAuF;IACvF,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iDAAiD;IACjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB;;;OAGG;IACH,GAAG,IAAI,IAAI,CAAC;IACZ;;;;;OAKG;IACH,KAAK,IAAI,IAAI,CAAC;IACd,kEAAkE;IAClE,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,uEAAuE;IACvE,QAAQ,IAAI,IAAI,CAAC;IACjB,kEAAkE;IAClE,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,OAAQ,CAAC;AAEpC;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,SAAS;;IAEhD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBASxB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EACvB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,MAAM,IAAI,EACpB,aAAa,SAAuB;IASrC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzB,+CAA+C;IAC/C,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,kDAAkD;IAClD,MAAM,IAAI,IAAI;IAMd,0EAA0E;IAC1E,GAAG,IAAI,IAAI;IAOX,KAAK,IAAI,IAAI;IA8Cb,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGlC"}
|
package/docs/README.md
CHANGED
|
@@ -5,6 +5,6 @@ long one.
|
|
|
5
5
|
|
|
6
6
|
| Page | Read it when |
|
|
7
7
|
| --- | --- |
|
|
8
|
-
| [Guide](guide.md) | running an MX, a submission server or implicit TLS; reading what a reply means; writing hooks and keeping state in `Session.data`; handling what `onData` receives; delivering into `@bumail/store`; setting TLS, limits and `greetingDelay`; or checking which RFC a behaviour follows |
|
|
9
|
-
| [Troubleshooting](troubleshooting.md) | `createSmtpServer` threw, the server will not listen,
|
|
10
|
-
| [Roadmap](roadmap.md) | wondering what is coming — the client, DSN, a ready-made delivery into the store — and what is not planned |
|
|
8
|
+
| [Guide](guide.md) | running an MX, a submission server or implicit TLS; reading what a reply means; writing hooks and keeping state in `Session.data`; handling what `onData` receives; delivering into `@bumail/store`; setting TLS, limits and `greetingDelay`; sending mail with `@bumail/smtp/client` and trying it with Mailpit; or checking which RFC a behaviour follows |
|
|
9
|
+
| [Troubleshooting](troubleshooting.md) | `createSmtpServer` threw, the server will not listen, a client reports a reply you did not expect, or `sendMail` rejected |
|
|
10
|
+
| [Roadmap](roadmap.md) | wondering what is coming — connection reuse in the client, DSN, a ready-made delivery into the store — and what is not planned |
|