@social-mail/social-mail-web-server 1.16.52 → 1.16.53

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.
@@ -1 +1 @@
1
- {"version":3,"file":"WebCluster.d.ts","sourceRoot":"","sources":["../src/WebCluster.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,eAAmC,MAAM,qDAAqD,CAAC;AAMtG,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,eAAe,CAAC,OAAO,SAAS,CAAC;WAEvD,KAAK,CAAC,GAAG,GAAE,OAAO,SAAqB;cAKrC,UAAU,CAAC,GAAG,EAAE,OAAO,SAAS;cAwBhC,SAAS,CAAC,GAAG,EAAE,OAAO,SAAS;CASlD"}
1
+ {"version":3,"file":"WebCluster.d.ts","sourceRoot":"","sources":["../src/WebCluster.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,eAAmC,MAAM,qDAAqD,CAAC;AAQtG,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,eAAe,CAAC,OAAO,SAAS,CAAC;WAEvD,KAAK,CAAC,GAAG,GAAE,OAAO,SAAqB;cAKrC,UAAU,CAAC,GAAG,EAAE,OAAO,SAAS;cAwBhC,SAAS,CAAC,GAAG,EAAE,OAAO,SAAS;CAkBlD"}
@@ -4,6 +4,8 @@ import WebServer from './WebServer.js';
4
4
  import ClusterInstance from "@entity-access/server-pages/dist/ClusterInstance.js";
5
5
  import { globalEnv } from './common/globalEnv.js';
6
6
  import SmtpReceiver from './SmtpReceiver.js';
7
+ import { globalServices } from './globalServices.js';
8
+ import CertificateFetcher from './server/smtp/CertificateFetcher.js';
7
9
  const numCPUs = globalEnv.numCPUs;
8
10
  export default class WebCluster extends ClusterInstance {
9
11
  static start(arg = WebServer) {
@@ -33,7 +35,15 @@ export default class WebCluster extends ClusterInstance {
33
35
  console.log(`Worker started`);
34
36
  const ws = new arg();
35
37
  await ws.create();
36
- await SmtpReceiver.create({});
38
+ const fetcher = globalServices.resolve(CertificateFetcher);
39
+ await SmtpReceiver.create({
40
+ SNICallback: (servername, cb) => {
41
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
42
+ fetcher.getCert(servername).then((r) => {
43
+ cb(null, r);
44
+ }, (error) => cb(error));
45
+ }
46
+ });
37
47
  }
38
48
  }
39
49
  //# sourceMappingURL=WebCluster.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WebCluster.js","sourceRoot":"","sources":["../src/WebCluster.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,eAAmC,MAAM,qDAAqD,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAE7C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,eAAiC;IAE9D,MAAM,CAAC,KAAK,CAAC,MAAwB,SAAS;QACjD,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,GAAqB;QAE5C,UAAU;QACV,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7B,OAAM,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,EAAsB,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,UAAU,CAAC,CAAC;YACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,oBAAoB;YACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC,EAAE,GAAC,EAAE,GAAC,EAAE,GAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,GAAqB;QAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QAGlB,MAAM,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;CAEJ"}
1
+ {"version":3,"file":"WebCluster.js","sourceRoot":"","sources":["../src/WebCluster.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,eAAmC,MAAM,qDAAqD,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,kBAAkB,MAAM,qCAAqC,CAAC;AAErE,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,eAAiC;IAE9D,MAAM,CAAC,KAAK,CAAC,MAAwB,SAAS;QACjD,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,GAAqB;QAE5C,UAAU;QACV,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAE7B,OAAM,IAAI,EAAE,CAAC;YACT,MAAM,OAAO,GAAG,EAAsB,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,OAAO,UAAU,CAAC,CAAC;YACnD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;gBAC3C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;YAED,oBAAoB;YACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;gBACtC,MAAM,KAAK,CAAC,EAAE,GAAC,EAAE,GAAC,EAAE,GAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;IAES,KAAK,CAAC,SAAS,CAAC,GAAqB;QAC3C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,MAAM,EAAE,CAAC;QAElB,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAG3D,MAAM,YAAY,CAAC,MAAM,CAAC;YACtB,WAAW,EAAE,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE;gBAC5B,mEAAmE;gBACnE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE;oBACxC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAChB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC7B,CAAC;SACJ,CAAC,CAAC;IACP,CAAC;CAEJ"}
@@ -0,0 +1,8 @@
1
+ import { SecureContext } from "node:tls";
2
+ import { ICacheContainer, ObjectCache } from "../../common/cacheFor.js";
3
+ export default class CertificateFetcher implements ICacheContainer<CertificateFetcher> {
4
+ cache: ObjectCache<CertificateFetcher>;
5
+ getCert(servername: string): Promise<SecureContext>;
6
+ readFile(servername: string): Promise<SecureContext>;
7
+ }
8
+ //# sourceMappingURL=CertificateFetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificateFetcher.d.ts","sourceRoot":"","sources":["../../../src/server/smtp/CertificateFetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAY,eAAe,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAMlF,MAAM,CAAC,OAAO,OAAO,kBAAmB,YAAW,eAAe,CAAC,kBAAkB,CAAC;IAElF,KAAK,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAI1B,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAsB1D,QAAQ,CAAC,UAAU,EAAE,MAAM;CAYpC"}
@@ -0,0 +1,53 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
11
+ import { createSecureContext } from "node:tls";
12
+ import { cacheFor } from "../../common/cacheFor.js";
13
+ import sleep from "../../common/sleep.js";
14
+ import { existsSync } from "node:fs";
15
+ import { readFile } from "node:fs/promises";
16
+ let CertificateFetcher = class CertificateFetcher {
17
+ async getCert(servername) {
18
+ if (!servername) {
19
+ throw new Error("Invalid domain name");
20
+ }
21
+ await fetch(`https://${servername}`);
22
+ for (let i = 0; i < 30; i++) {
23
+ await sleep(1000);
24
+ // check if we have certificate...
25
+ const context = await this.readFile(servername);
26
+ if (context) {
27
+ return context;
28
+ }
29
+ }
30
+ return null;
31
+ }
32
+ async readFile(servername) {
33
+ const certPath = `/cache/certs/${servername}/cert.pem`;
34
+ const keyPath = `/cache/certs/${servername}/key.pem`;
35
+ if (!existsSync(certPath) || !existsSync(keyPath)) {
36
+ return null;
37
+ }
38
+ const cert = await readFile(certPath, "utf-8");
39
+ const key = await readFile(certPath, "utf-8");
40
+ return createSecureContext({ cert, key });
41
+ }
42
+ };
43
+ __decorate([
44
+ cacheFor(),
45
+ __metadata("design:type", Function),
46
+ __metadata("design:paramtypes", [String]),
47
+ __metadata("design:returntype", Promise)
48
+ ], CertificateFetcher.prototype, "getCert", null);
49
+ CertificateFetcher = __decorate([
50
+ RegisterSingleton
51
+ ], CertificateFetcher);
52
+ export default CertificateFetcher;
53
+ //# sourceMappingURL=CertificateFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CertificateFetcher.js","sourceRoot":"","sources":["../../../src/server/smtp/CertificateFetcher.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAiB,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAgC,MAAM,0BAA0B,CAAC;AAClF,OAAO,KAAK,MAAM,uBAAuB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG7B,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAMtB,AAAN,KAAK,CAAC,OAAO,CAAC,UAAkB;QAEnC,IAAG,CAAC,UAAU,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC;QAGrC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,EAAE,EAAC,CAAC,EAAE,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YAElB,kCAAkC;YAClC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAChD,IAAG,OAAO,EAAE,CAAC;gBACT,OAAO,OAAO,CAAC;YACnB,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC7B,MAAM,QAAQ,GAAG,gBAAgB,UAAU,WAAW,CAAC;QACvD,MAAM,OAAO,GAAG,gBAAgB,UAAU,UAAU,CAAC;QACrD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,mBAAmB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;CAGJ,CAAA;AAlCgB;IADZ,QAAQ,EAAE;;;;iDAqBV;AA1BgB,kBAAkB;IADtC,iBAAiB;GACG,kBAAkB,CAwCtC;eAxCoB,kBAAkB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.16.52",
3
+ "version": "1.16.53",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
package/src/WebCluster.ts CHANGED
@@ -4,6 +4,8 @@ import WebServer from './WebServer.js';
4
4
  import ClusterInstance, { RecycledWorker } from "@entity-access/server-pages/dist/ClusterInstance.js";
5
5
  import { globalEnv } from './common/globalEnv.js';
6
6
  import SmtpReceiver from './SmtpReceiver.js';
7
+ import { globalServices } from './globalServices.js';
8
+ import CertificateFetcher from './server/smtp/CertificateFetcher.js';
7
9
 
8
10
  const numCPUs = globalEnv.numCPUs;
9
11
 
@@ -43,8 +45,17 @@ export default class WebCluster extends ClusterInstance<typeof WebServer> {
43
45
  const ws = new arg();
44
46
  await ws.create();
45
47
 
48
+ const fetcher = globalServices.resolve(CertificateFetcher);
46
49
 
47
- await SmtpReceiver.create({});
50
+
51
+ await SmtpReceiver.create({
52
+ SNICallback: (servername, cb) => {
53
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
54
+ fetcher.getCert(servername).then((r: any) => {
55
+ cb(null, r);
56
+ }, (error) => cb(error));
57
+ }
58
+ });
48
59
  }
49
60
 
50
61
  }
@@ -0,0 +1,49 @@
1
+ import { RegisterSingleton } from "@entity-access/entity-access/dist/di/di.js";
2
+ import { createSecureContext, SecureContext } from "node:tls";
3
+ import { cacheFor, ICacheContainer, ObjectCache } from "../../common/cacheFor.js";
4
+ import sleep from "../../common/sleep.js";
5
+ import { existsSync } from "node:fs";
6
+ import { readFile } from "node:fs/promises";
7
+
8
+ @RegisterSingleton
9
+ export default class CertificateFetcher implements ICacheContainer<CertificateFetcher> {
10
+
11
+ cache: ObjectCache<CertificateFetcher>;
12
+
13
+
14
+ @cacheFor()
15
+ public async getCert(servername: string): Promise<SecureContext> {
16
+
17
+ if(!servername) {
18
+ throw new Error("Invalid domain name");
19
+ }
20
+
21
+ await fetch(`https://${servername}`);
22
+
23
+
24
+ for(let i=0;i<30;i++) {
25
+ await sleep(1000);
26
+
27
+ // check if we have certificate...
28
+ const context = await this.readFile(servername);
29
+ if(context) {
30
+ return context;
31
+ }
32
+ }
33
+
34
+ return null;
35
+ }
36
+
37
+ async readFile(servername: string) {
38
+ const certPath = `/cache/certs/${servername}/cert.pem`;
39
+ const keyPath = `/cache/certs/${servername}/key.pem`;
40
+ if (!existsSync(certPath) || !existsSync(keyPath)) {
41
+ return null;
42
+ }
43
+ const cert = await readFile(certPath, "utf-8");
44
+ const key = await readFile(certPath, "utf-8");
45
+ return createSecureContext({ cert, key });
46
+ }
47
+
48
+
49
+ }