maidraw-gcm-net-adapter 0.0.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.
@@ -0,0 +1,17 @@
1
+ import type Kasumi from "kasumi.js";
2
+ export declare class Crypto {
3
+ private kasumi;
4
+ static global?: Crypto;
5
+ private pgpKey;
6
+ private constructor();
7
+ private init;
8
+ getPublicKey(): string;
9
+ encrypt(payload: Record<string, string>): Promise<GenericWebStream<T>>;
10
+ decrypt(encrypted: string): Promise<Record<string, string> | null>;
11
+ resetStoredKey(): void;
12
+ static new(kasumi: Kasumi, PgpKey?: {
13
+ privateKey: string;
14
+ passphrase: string;
15
+ publicKey?: string;
16
+ }): Promise<Crypto>;
17
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Crypto = void 0;
7
+ const node_os_1 = __importDefault(require("node:os"));
8
+ class Crypto {
9
+ kasumi;
10
+ static global;
11
+ pgpKey;
12
+ constructor(kasumi, PgpKey) {
13
+ this.kasumi = kasumi;
14
+ if (PgpKey)
15
+ this.pgpKey = {
16
+ privateKey: PgpKey.privateKey,
17
+ passphrase: PgpKey.passphrase,
18
+ publicKey: PgpKey.publicKey || "",
19
+ };
20
+ }
21
+ async init() {
22
+ const openpgp = await import("openpgp");
23
+ if (!this.pgpKey) {
24
+ const key = await this.kasumi.config.getOne("maidraw-gcm-net-adapter:auth.pgpkey");
25
+ if (key && Date.now() < key.expire) {
26
+ this.pgpKey = key.key;
27
+ }
28
+ else {
29
+ const passphrase = node_os_1.default.hostname();
30
+ const { privateKey, publicKey } = await openpgp.generateKey({
31
+ // biome-ignore lint/style/useNamingConvention: openpgp naming convention
32
+ userIDs: {
33
+ name: "maidraw-gcm-net-adapter",
34
+ email: "salt@example.com",
35
+ },
36
+ passphrase,
37
+ format: "armored",
38
+ });
39
+ this.pgpKey = {
40
+ publicKey,
41
+ privateKey,
42
+ passphrase,
43
+ };
44
+ this.kasumi.config.set("maidraw-gcm-net-adapter:auth.pgpkey", {
45
+ key: this.pgpKey,
46
+ expire: Date.now() + 30 * 24 * 60 * 60 * 1000,
47
+ });
48
+ await this.kasumi.config.syncEssential();
49
+ }
50
+ }
51
+ else {
52
+ if (!this.pgpKey.publicKey) {
53
+ const privateKey = await openpgp.readPrivateKey({
54
+ armoredKey: this.pgpKey.privateKey,
55
+ });
56
+ const publicKey = privateKey.toPublic();
57
+ this.pgpKey.publicKey = publicKey.armor();
58
+ }
59
+ }
60
+ }
61
+ getPublicKey() {
62
+ return this.pgpKey.publicKey;
63
+ }
64
+ async encrypt(payload) {
65
+ const openpgp = await import("openpgp");
66
+ const publicKey = await openpgp.readKey({
67
+ armoredKey: this.pgpKey.publicKey,
68
+ });
69
+ const encrypted = await openpgp.encrypt({
70
+ message: await openpgp.createMessage({
71
+ text: JSON.stringify(payload),
72
+ }),
73
+ encryptionKeys: publicKey,
74
+ format: "armored",
75
+ });
76
+ return encrypted;
77
+ }
78
+ async decrypt(encrypted) {
79
+ try {
80
+ const openpgp = await import("openpgp");
81
+ const privateKey = await openpgp.decryptKey({
82
+ privateKey: await openpgp.readPrivateKey({
83
+ armoredKey: this.pgpKey.privateKey,
84
+ }),
85
+ passphrase: this.pgpKey.passphrase,
86
+ });
87
+ const message = await openpgp.readMessage({
88
+ armoredMessage: encrypted,
89
+ });
90
+ const { data: decrypted } = await openpgp.decrypt({
91
+ message,
92
+ decryptionKeys: privateKey,
93
+ });
94
+ return JSON.parse(decrypted);
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ resetStoredKey() {
101
+ this.kasumi.config.set("maidraw-gcm-net-adapter:auth.gpgkey", undefined);
102
+ }
103
+ static async new(kasumi, PgpKey) {
104
+ const instance = new Crypto(kasumi, PgpKey);
105
+ await instance.init();
106
+ return instance;
107
+ }
108
+ }
109
+ exports.Crypto = Crypto;
110
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/common/crypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BaseError } from "maidraw";
2
+ export declare class BaseGcmError extends BaseError {
3
+ constructor(type: string, message: string);
4
+ }
5
+ export declare class FailedToDecryptError extends BaseGcmError {
6
+ constructor();
7
+ }
8
+ export declare class FailedToAuthenticateError extends BaseGcmError {
9
+ constructor();
10
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FailedToAuthenticateError = exports.FailedToDecryptError = exports.BaseGcmError = void 0;
4
+ const maidraw_1 = require("maidraw");
5
+ class BaseGcmError extends maidraw_1.BaseError {
6
+ constructor(type, message) {
7
+ super("maidraw.adapter.gcm-net", type, message);
8
+ }
9
+ }
10
+ exports.BaseGcmError = BaseGcmError;
11
+ class FailedToDecryptError extends BaseGcmError {
12
+ constructor() {
13
+ super("failed-to-decrypt", "Decryption failed");
14
+ }
15
+ }
16
+ exports.FailedToDecryptError = FailedToDecryptError;
17
+ class FailedToAuthenticateError extends BaseGcmError {
18
+ constructor() {
19
+ super("failed-to-authenticate", "Failed to authenticate using provided credentials");
20
+ }
21
+ }
22
+ exports.FailedToAuthenticateError = FailedToAuthenticateError;
23
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/common/error.ts"],"names":[],"mappings":";;;AAAA,qCAAoC;AAEpC,MAAa,YAAa,SAAQ,mBAAS;IACvC,YAAY,IAAY,EAAE,OAAe;QACrC,KAAK,CAAC,yBAAyB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ;AAJD,oCAIC;AAED,MAAa,oBAAqB,SAAQ,YAAY;IAClD;QACI,KAAK,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IACpD,CAAC;CACJ;AAJD,oDAIC;AAED,MAAa,yBAA0B,SAAQ,YAAY;IACvD;QACI,KAAK,CAAC,wBAAwB,EAAE,mDAAmD,CAAC,CAAC;IACzF,CAAC;CACJ;AAJD,8DAIC"}
@@ -0,0 +1 @@
1
+ export declare const CHAINED_CERTIFICATE = "-----BEGIN CERTIFICATE-----\nMIIGgDCCBWigAwIBAgIMG4lfR2a+j5VTAGXUMA0GCSqGSIb3DQEBCwUAMFAxCzAJ\nBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H\nbG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yNTA3MjQwMjExMTlaFw0y\nNjA4MjUwMjExMThaMGUxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEVMBMG\nA1UEBxMMU2hpbmFnYXdhLWt1MRkwFwYDVQQKExBTRUdBIENPUlBPUkFUSU9OMRQw\nEgYDVQQDEwttYWltYWlkeC5qcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL0NznYhVU1MS/e48SwRbrGx+OmJCTFnD57ZJnXVJUP0FOU/zrSWYLVP/Dti\nMM3sWhBVmNdgKv/yJm7quO6jIKu4CO6Al2dLlF1drvAvG/t8MWxWIV8gz/WA9o5I\n++fCEkMT6o+6AwVKaEdcEwd8r0V7bal7ra+33D/aMDwiI3Vr2fFX3xPEKOg56/1F\nxkVn5LMp+b6tI1cS0U1xtrAkAnZZXWa+eeERIhUHSFnpUf62cf5rmiXmgTonsESp\nZSlnpzqeAe6X6oeiRXxFcInHrfXa6tic3kIN9i32Tv9HIeJEtzJRKa0hkz82GeHW\nRtSmCQp633D60Nm2MqSwlA1nOBECAwEAAaOCA0MwggM/MA4GA1UdDwEB/wQEAwIF\noDAMBgNVHRMBAf8EAjAAMIGOBggrBgEFBQcBAQSBgTB/MEQGCCsGAQUFBzAChjho\ndHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc3JzYW92c3NsY2Ey\nMDE4LmNydDA3BggrBgEFBQcwAYYraHR0cDovL29jc3AuZ2xvYmFsc2lnbi5jb20v\nZ3Nyc2FvdnNzbGNhMjAxODBWBgNVHSAETzBNMEEGCSsGAQQBoDIBFDA0MDIGCCsG\nAQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAI\nBgZngQwBAgIwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC5nbG9iYWxzaWdu\nLmNvbS9nc3JzYW92c3NsY2EyMDE4LmNybDAWBgNVHREEDzANggttYWltYWlkeC5q\ncDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAU+O9/\n8s14Z6jeb48kjYjxhwMCs+swHQYDVR0OBBYEFCt/vhyHYIlScZLV7wfLwftNo3Cc\nMIIBfAYKKwYBBAHWeQIEAgSCAWwEggFoAWYAdQCUTkOH+uzB74HzGSQmqBhlAcfT\nXzgCAT9yZ31VNy4Z2AAAAZg6MxMkAAAEAwBGMEQCIFc6vYz9yGzXNbC/viwttBYd\npATIzoSdcc+X8oinlgs1AiAtBEWtQSJCcGvtD9sTRuKnyufKy2KbQ5SpxrV0ut5u\nkAB2AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABmDozEywAAAQD\nAEcwRQIgWpv9tPy11oij9DPTrC49nJJB/MCDiYL13Z6CFMTLSdgCIQDswsjLprfu\nyFfD9xCCT/z4eJovRPjQNG4dci4s9WfPBwB1AMIxfldFGaNF7n843rKQQevHwiFa\nIr9/1bWtdprZDlLNAAABmDozExQAAAQDAEYwRAIgLbxSWBItkx1Yx8widtjzowSG\nTtiLFeRRqlcHKgc0DNACIHjpzOqSj8kaDP13wHLRiuV2OQ8tPtfzlz7OfSEuqF/4\nMA0GCSqGSIb3DQEBCwUAA4IBAQAb7ilHVhfyilqIUVDAINPfAlpOSCe9RNzQktmz\nfni951M4SWCGxdYdh33bM+Hpo+0Rd2ugy6w71Fh4OIg/h/a2XdRn5S2LUw9nnQEU\nwNkVki1yOov9x2ZaRV05DqOqk7AMqn8F9li6npabtFLibxVi8Xozw372Fr3CEzdF\n2JdRr1rwVpwdewETBWuPz21DNosrX4dpMEhz7njJQ+aD/EC+SG/ghGdpdGdfprgk\nX0BIvHe65SA1mGqhUp/Hyd6ubqWxsJ3n6JnYcYwY5nrgrMF8WHDkFumK179Saamw\ngWBEed5mDhqoVPRF3J+VCbPsKUJrMgZOJbqRindnC5pb13h+\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw\nHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFs\nU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xODExMjEwMDAwMDBaFw0yODEx\nMjEwMDAwMDBaMFAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52\nLXNhMSYwJAYDVQQDEx1HbG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODCCASIw\nDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKdaydUMGCEAI9WXD+uu3Vxoa2uP\nUGATeoHLl+6OimGUSyZ59gSnKvuk2la77qCk8HuKf1UfR5NhDW5xUTolJAgvjOH3\nidaSz6+zpz8w7bXfIa7+9UQX/dhj2S/TgVprX9NHsKzyqzskeU8fxy7quRU6fBhM\nabO1IFkJXinDY+YuRluqlJBJDrnw9UqhCS98NE3QvADFBlV5Bs6i0BDxSEPouVq1\nlVW9MdIbPYa+oewNEtssmSStR8JvA+Z6cLVwzM0nLKWMjsIYPJLJLnNvBhBWk0Cq\no8VS++XFBdZpaFwGue5RieGKDkFNm5KQConpFmvv73W+eka440eKHRwup08CAwEA\nAaOCASkwggElMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G\nA1UdDgQWBBT473/yzXhnqN5vjySNiPGHAwKz6zAfBgNVHSMEGDAWgBSP8Et/qC5F\nJK5NUPpjmove4t0bvDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6\nLy9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290cjMwNgYDVR0fBC8wLTAroCmgJ4Yl\naHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIzLmNybDBHBgNVHSAEQDA+\nMDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5j\nb20vcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAJmQyC1fQorUC2bbmANz\nEdSIhlIoU4r7rd/9c446ZwTbw1MUcBQJfMPg+NccmBqixD7b6QDjynCy8SIwIVbb\n0615XoFYC20UgDX1b10d65pHBf9ZjQCxQNqQmJYaumxtf4z1s4DfjGRzNpZ5eWl0\n6r/4ngGPoJVpjemEuunl1Ig423g7mNA2eymw0lIYkN5SQwCuaifIFJ6GlazhgDEw\nfpolu4usBCOmmQDo8dIm7A9+O4orkjgTHY+GzYZSR+Y0fFukAj6KYXwidlNalFMz\nhriSqHKvoflShx8xpfywgVcvzfTO3PYkz6fiNJBonf6q8amaEsybwMbDqKWwIX7e\nSPY=\n-----END CERTIFICATE-----\n";
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CHAINED_CERTIFICATE = void 0;
4
+ exports.CHAINED_CERTIFICATE = `-----BEGIN CERTIFICATE-----
5
+ MIIGgDCCBWigAwIBAgIMG4lfR2a+j5VTAGXUMA0GCSqGSIb3DQEBCwUAMFAxCzAJ
6
+ BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSYwJAYDVQQDEx1H
7
+ bG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODAeFw0yNTA3MjQwMjExMTlaFw0y
8
+ NjA4MjUwMjExMThaMGUxCzAJBgNVBAYTAkpQMQ4wDAYDVQQIEwVUb2t5bzEVMBMG
9
+ A1UEBxMMU2hpbmFnYXdhLWt1MRkwFwYDVQQKExBTRUdBIENPUlBPUkFUSU9OMRQw
10
+ EgYDVQQDEwttYWltYWlkeC5qcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
11
+ ggEBAL0NznYhVU1MS/e48SwRbrGx+OmJCTFnD57ZJnXVJUP0FOU/zrSWYLVP/Dti
12
+ MM3sWhBVmNdgKv/yJm7quO6jIKu4CO6Al2dLlF1drvAvG/t8MWxWIV8gz/WA9o5I
13
+ ++fCEkMT6o+6AwVKaEdcEwd8r0V7bal7ra+33D/aMDwiI3Vr2fFX3xPEKOg56/1F
14
+ xkVn5LMp+b6tI1cS0U1xtrAkAnZZXWa+eeERIhUHSFnpUf62cf5rmiXmgTonsESp
15
+ ZSlnpzqeAe6X6oeiRXxFcInHrfXa6tic3kIN9i32Tv9HIeJEtzJRKa0hkz82GeHW
16
+ RtSmCQp633D60Nm2MqSwlA1nOBECAwEAAaOCA0MwggM/MA4GA1UdDwEB/wQEAwIF
17
+ oDAMBgNVHRMBAf8EAjAAMIGOBggrBgEFBQcBAQSBgTB/MEQGCCsGAQUFBzAChjho
18
+ dHRwOi8vc2VjdXJlLmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc3JzYW92c3NsY2Ey
19
+ MDE4LmNydDA3BggrBgEFBQcwAYYraHR0cDovL29jc3AuZ2xvYmFsc2lnbi5jb20v
20
+ Z3Nyc2FvdnNzbGNhMjAxODBWBgNVHSAETzBNMEEGCSsGAQQBoDIBFDA0MDIGCCsG
21
+ AQUFBwIBFiZodHRwczovL3d3dy5nbG9iYWxzaWduLmNvbS9yZXBvc2l0b3J5LzAI
22
+ BgZngQwBAgIwPwYDVR0fBDgwNjA0oDKgMIYuaHR0cDovL2NybC5nbG9iYWxzaWdu
23
+ LmNvbS9nc3JzYW92c3NsY2EyMDE4LmNybDAWBgNVHREEDzANggttYWltYWlkeC5q
24
+ cDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAU+O9/
25
+ 8s14Z6jeb48kjYjxhwMCs+swHQYDVR0OBBYEFCt/vhyHYIlScZLV7wfLwftNo3Cc
26
+ MIIBfAYKKwYBBAHWeQIEAgSCAWwEggFoAWYAdQCUTkOH+uzB74HzGSQmqBhlAcfT
27
+ XzgCAT9yZ31VNy4Z2AAAAZg6MxMkAAAEAwBGMEQCIFc6vYz9yGzXNbC/viwttBYd
28
+ pATIzoSdcc+X8oinlgs1AiAtBEWtQSJCcGvtD9sTRuKnyufKy2KbQ5SpxrV0ut5u
29
+ kAB2AMs49xWJfIShRF9bwd37yW7ymlnNRwppBYWwyxTDFFjnAAABmDozEywAAAQD
30
+ AEcwRQIgWpv9tPy11oij9DPTrC49nJJB/MCDiYL13Z6CFMTLSdgCIQDswsjLprfu
31
+ yFfD9xCCT/z4eJovRPjQNG4dci4s9WfPBwB1AMIxfldFGaNF7n843rKQQevHwiFa
32
+ Ir9/1bWtdprZDlLNAAABmDozExQAAAQDAEYwRAIgLbxSWBItkx1Yx8widtjzowSG
33
+ TtiLFeRRqlcHKgc0DNACIHjpzOqSj8kaDP13wHLRiuV2OQ8tPtfzlz7OfSEuqF/4
34
+ MA0GCSqGSIb3DQEBCwUAA4IBAQAb7ilHVhfyilqIUVDAINPfAlpOSCe9RNzQktmz
35
+ fni951M4SWCGxdYdh33bM+Hpo+0Rd2ugy6w71Fh4OIg/h/a2XdRn5S2LUw9nnQEU
36
+ wNkVki1yOov9x2ZaRV05DqOqk7AMqn8F9li6npabtFLibxVi8Xozw372Fr3CEzdF
37
+ 2JdRr1rwVpwdewETBWuPz21DNosrX4dpMEhz7njJQ+aD/EC+SG/ghGdpdGdfprgk
38
+ X0BIvHe65SA1mGqhUp/Hyd6ubqWxsJ3n6JnYcYwY5nrgrMF8WHDkFumK179Saamw
39
+ gWBEed5mDhqoVPRF3J+VCbPsKUJrMgZOJbqRindnC5pb13h+
40
+ -----END CERTIFICATE-----
41
+ -----BEGIN CERTIFICATE-----
42
+ MIIETjCCAzagAwIBAgINAe5fIh38YjvUMzqFVzANBgkqhkiG9w0BAQsFADBMMSAw
43
+ HgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFs
44
+ U2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0xODExMjEwMDAwMDBaFw0yODEx
45
+ MjEwMDAwMDBaMFAxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52
46
+ LXNhMSYwJAYDVQQDEx1HbG9iYWxTaWduIFJTQSBPViBTU0wgQ0EgMjAxODCCASIw
47
+ DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKdaydUMGCEAI9WXD+uu3Vxoa2uP
48
+ UGATeoHLl+6OimGUSyZ59gSnKvuk2la77qCk8HuKf1UfR5NhDW5xUTolJAgvjOH3
49
+ idaSz6+zpz8w7bXfIa7+9UQX/dhj2S/TgVprX9NHsKzyqzskeU8fxy7quRU6fBhM
50
+ abO1IFkJXinDY+YuRluqlJBJDrnw9UqhCS98NE3QvADFBlV5Bs6i0BDxSEPouVq1
51
+ lVW9MdIbPYa+oewNEtssmSStR8JvA+Z6cLVwzM0nLKWMjsIYPJLJLnNvBhBWk0Cq
52
+ o8VS++XFBdZpaFwGue5RieGKDkFNm5KQConpFmvv73W+eka440eKHRwup08CAwEA
53
+ AaOCASkwggElMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
54
+ A1UdDgQWBBT473/yzXhnqN5vjySNiPGHAwKz6zAfBgNVHSMEGDAWgBSP8Et/qC5F
55
+ JK5NUPpjmove4t0bvDA+BggrBgEFBQcBAQQyMDAwLgYIKwYBBQUHMAGGImh0dHA6
56
+ Ly9vY3NwMi5nbG9iYWxzaWduLmNvbS9yb290cjMwNgYDVR0fBC8wLTAroCmgJ4Yl
57
+ aHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIzLmNybDBHBgNVHSAEQDA+
58
+ MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5j
59
+ b20vcmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAJmQyC1fQorUC2bbmANz
60
+ EdSIhlIoU4r7rd/9c446ZwTbw1MUcBQJfMPg+NccmBqixD7b6QDjynCy8SIwIVbb
61
+ 0615XoFYC20UgDX1b10d65pHBf9ZjQCxQNqQmJYaumxtf4z1s4DfjGRzNpZ5eWl0
62
+ 6r/4ngGPoJVpjemEuunl1Ig423g7mNA2eymw0lIYkN5SQwCuaifIFJ6GlazhgDEw
63
+ fpolu4usBCOmmQDo8dIm7A9+O4orkjgTHY+GzYZSR+Y0fFukAj6KYXwidlNalFMz
64
+ hriSqHKvoflShx8xpfywgVcvzfTO3PYkz6fiNJBonf6q8amaEsybwMbDqKWwIX7e
65
+ SPY=
66
+ -----END CERTIFICATE-----
67
+ `;
68
+ //# sourceMappingURL=chainedCertificate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chainedCertificate.js","sourceRoot":"","sources":["../../../src/maimai/lib/chainedCertificate.ts"],"names":[],"mappings":";;;AAAa,QAAA,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DlC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { Chart, Database } from "gcm-database-otogedb/maimai";
2
+ export interface WorkingChart {
3
+ name: string;
4
+ level: string;
5
+ difficulty: string;
6
+ mode: string;
7
+ dbChart?: Chart;
8
+ }
9
+ export interface NetScore extends WorkingChart {
10
+ sync: string;
11
+ combo: string;
12
+ achievement: string;
13
+ score: number;
14
+ dxScore: number;
15
+ maxDxScore: number;
16
+ }
17
+ export declare function getToken(): Promise<{
18
+ cookies: Record<string, string>;
19
+ token: string | undefined;
20
+ } | null>;
21
+ export declare function login(username: string, password: string): Promise<any>;
22
+ export declare function getScores(difficulty: number, cookies: Record<string, string>): Promise<NetScore[]>;
23
+ export declare function getBest50(cookies: Record<string, string>, database: Database): Promise<{
24
+ new: NetScore[];
25
+ old: NetScore[];
26
+ }>;
27
+ export declare function getProfile(cookies: Record<string, string>): Promise<{
28
+ name: string;
29
+ rating: number;
30
+ }>;
31
+ export declare function getCharts(level: number, cookies: Record<string, string>): Promise<{
32
+ name: string;
33
+ level: string;
34
+ difficulty: string;
35
+ mode: string;
36
+ }[]>;
37
+ export declare function checkLogin(cookies: Record<string, string>): Promise<boolean>;
@@ -0,0 +1,314 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getToken = getToken;
37
+ exports.login = login;
38
+ exports.getScores = getScores;
39
+ exports.getBest50 = getBest50;
40
+ exports.getProfile = getProfile;
41
+ exports.getCharts = getCharts;
42
+ exports.checkLogin = checkLogin;
43
+ const tls = __importStar(require("node:tls"));
44
+ const cache_1 = require("@saltcute/cache");
45
+ const Cheerio = __importStar(require("cheerio"));
46
+ const maimai_1 = require("gcm-database/maimai");
47
+ const undici_1 = require("undici");
48
+ const chainedCertificate_1 = require("../chainedCertificate");
49
+ const UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36";
50
+ const headers = {
51
+ "User-Agent": UA,
52
+ origin: "https://maimaidx-eng",
53
+ };
54
+ const HTTPS_AGENT = new undici_1.Agent({
55
+ connect: {
56
+ ca: [...tls.rootCertificates, chainedCertificate_1.CHAINED_CERTIFICATE],
57
+ },
58
+ });
59
+ async function fetch(...args) {
60
+ const res = await (0, undici_1.fetch)(args[0], {
61
+ ...args[1],
62
+ dispatcher: HTTPS_AGENT,
63
+ });
64
+ return res;
65
+ }
66
+ async function getToken() {
67
+ const res = await fetch("https://maimaidx-eng.com/maimai-mobile/", {
68
+ headers: headers,
69
+ });
70
+ if (!res.ok)
71
+ return null;
72
+ const html = await res.text();
73
+ const $ = Cheerio.load(html);
74
+ const token = $("div.main_wrapper div.see_through_block form div input[name=token]").attr("value");
75
+ const cookies = {};
76
+ for (const [key, value] of res.headers) {
77
+ if (key.toLowerCase() === "set-cookie") {
78
+ const [k, v] = value.split(";")[0].split("=");
79
+ cookies[k] = v;
80
+ }
81
+ }
82
+ return {
83
+ cookies,
84
+ token,
85
+ };
86
+ }
87
+ const cache = new cache_1.Cache("maidraw/adapter/maimaidx-net-eng-scraper");
88
+ async function login(username, password) {
89
+ const cached = await cache.get(`cookielogin-${username}`);
90
+ if (cached) {
91
+ if (await checkLogin(cached)) {
92
+ return cached;
93
+ }
94
+ }
95
+ const form = new URLSearchParams();
96
+ form.append("sid", username);
97
+ form.append("password", password);
98
+ form.append("retention", "1");
99
+ {
100
+ const loginCookies = {};
101
+ const loginReq = await fetch("https://lng-tgk-aime-gw.am-all.net/common_auth/login?site_id=maimaidxex&redirect_url=https://maimaidx-eng.com/maimai-mobile/&back_url=https://maimai.sega.com/", {
102
+ method: "POST",
103
+ body: form,
104
+ headers: {
105
+ "User-Agent": headers["User-Agent"],
106
+ referer: "https://maimaidx-eng.com/",
107
+ },
108
+ redirect: "manual",
109
+ });
110
+ if (!(loginReq.status >= 200 && loginReq.status < 300))
111
+ return null;
112
+ for (const setCookie of loginReq.headers.getSetCookie()) {
113
+ const [k, v] = setCookie.split(";")[0].split("=");
114
+ loginCookies[k] = v;
115
+ }
116
+ const oauthReq = await fetch("https://lng-tgk-aime-gw.am-all.net/common_auth/login/sid", {
117
+ method: "POST",
118
+ body: form,
119
+ headers: {
120
+ "User-Agent": headers["User-Agent"],
121
+ referer: "https://lng-tgk-aime-gw.am-all.net/common_auth/login?site_id=maimaidxex&redirect_url=https://maimaidx-eng.com/maimai-mobile/&back_url=https://maimai.sega.com/",
122
+ cookie: Object.entries(loginCookies)
123
+ .map(([k, v]) => `${k}=${v}`)
124
+ .join("; "),
125
+ },
126
+ redirect: "manual",
127
+ });
128
+ if (!(oauthReq.status >= 300 && oauthReq.status < 400))
129
+ return null;
130
+ const getTokenLocation = oauthReq.headers.get("location");
131
+ if (!getTokenLocation)
132
+ return null;
133
+ for (const setCookie of oauthReq.headers.getSetCookie()) {
134
+ const [k, v] = setCookie.split(";")[0].split("=");
135
+ loginCookies[k] = v;
136
+ }
137
+ const getTokenCookies = {};
138
+ const getTokenReq = await fetch(getTokenLocation, {
139
+ method: "GET",
140
+ headers: {
141
+ "User-Agent": headers["User-Agent"],
142
+ referer: "https://lng-tgk-aime-gw.am-all.net/",
143
+ cookie: Object.entries(loginCookies)
144
+ .map(([k, v]) => `${k}=${v}`)
145
+ .join("; "),
146
+ },
147
+ redirect: "manual",
148
+ });
149
+ if (!(getTokenReq.status >= 300 && getTokenReq.status < 400))
150
+ return null;
151
+ for (const setCookie of getTokenReq.headers.getSetCookie()) {
152
+ const [k, v] = setCookie.split(";")[0].split("=");
153
+ getTokenCookies[k] = v;
154
+ }
155
+ await cache.put(`cookielogin-${username}`, getTokenCookies, 15 * 60 * 1000);
156
+ return getTokenCookies;
157
+ }
158
+ }
159
+ async function getScores(difficulty, cookies) {
160
+ const res = await fetch(`https://maimaidx-eng.com/maimai-mobile/record/musicGenre/search/?genre=99&diff=${difficulty}`, {
161
+ headers: {
162
+ ...headers,
163
+ cookie: Object.entries(cookies)
164
+ .map(([k, v]) => `${k}=${v}`)
165
+ .join("; "),
166
+ referer: "https://maimaidx-eng.com/maimai-mobile/record/musicGenre/search/",
167
+ },
168
+ });
169
+ if (!res.ok)
170
+ throw await res.text();
171
+ const charts = [];
172
+ const html = await res.text();
173
+ const $ = Cheerio.load(html);
174
+ for (const e of $("div.main_wrapper .w_450.m_15.p_r.f_0")) {
175
+ const name = $("div form div.music_name_block", e).text();
176
+ const score = parseInt($("div form div.music_score_block.w_112", e).text().trim().replace(".", ""), 10);
177
+ const dxScore = parseInt($("div form div.music_score_block.w_190", e).text().trim().replace(",", ""), 10);
178
+ const maxDxScore = parseInt($("div form div.music_score_block.w_190", e).text().trim().split("/")[1]?.replace(",", ""), 10);
179
+ const level = $("div form div.music_lv_block", e).text();
180
+ const difficulty = ($("div form img.f_l", e).attr("src") ?? "").split("img/diff_")[1]?.split(".png")[0]?.trim();
181
+ const mode = ($("img.music_kind_icon", e).attr("src") ?? "").includes("music_dx") ? "DX" : "ST";
182
+ const attrs = $("div form img.f_r", e);
183
+ const sync = ($(attrs[0]).attr("src") || "").split("img/music_icon_")[1]?.split(".png")[0]?.trim();
184
+ const combo = ($(attrs[1]).attr("src") || "").split("img/music_icon_")[1]?.split(".png")[0]?.trim();
185
+ const achievement = ($(attrs[2]).attr("src") || "").split("img/music_icon_")[1]?.split(".png")[0]?.trim();
186
+ charts.push({
187
+ name,
188
+ level,
189
+ difficulty,
190
+ mode,
191
+ sync,
192
+ combo,
193
+ achievement,
194
+ score,
195
+ dxScore,
196
+ maxDxScore,
197
+ });
198
+ }
199
+ return charts;
200
+ }
201
+ const NEW_SCORE_VERSION = 26000;
202
+ async function getBest50(cookies, database) {
203
+ const promises = [];
204
+ for (const difficulty of Object.values(maimai_1.Difficulty)) {
205
+ const difficultyMap = {
206
+ [maimai_1.Difficulty.EASY]: 0,
207
+ [maimai_1.Difficulty.BASIC]: 0,
208
+ [maimai_1.Difficulty.ADVANCED]: 1,
209
+ [maimai_1.Difficulty.EXPERT]: 2,
210
+ [maimai_1.Difficulty.MASTER]: 3,
211
+ [maimai_1.Difficulty.RE_MASTER]: 4,
212
+ [maimai_1.Difficulty.UTAGE]: 10,
213
+ };
214
+ if (difficulty === maimai_1.Difficulty.EASY)
215
+ continue;
216
+ promises.push(getScores(difficultyMap[difficulty], cookies).then((scores) => {
217
+ return scores
218
+ .filter((v) => !Number.isNaN(v.score) && !Number.isNaN(v.dxScore) && !Number.isNaN(v.maxDxScore) && v.combo && v.sync && v.achievement)
219
+ .map(async (v) => {
220
+ return await database
221
+ .searchChart({
222
+ title: v.name,
223
+ level: parseFloat(v.level),
224
+ difficulty,
225
+ type: v.mode.toLowerCase() === "dx" ? maimai_1.Type.DELUXE : maimai_1.Type.STANDARD,
226
+ })
227
+ .then(({ data }) => {
228
+ if (data[0].chart)
229
+ v.dbChart = data[0].chart;
230
+ return v;
231
+ });
232
+ });
233
+ }));
234
+ }
235
+ const scores = await Promise.all((await Promise.all(promises)).flat());
236
+ const newScores = scores.filter((v) => {
237
+ if (v.dbChart) {
238
+ const versionNum = parseInt(v.dbChart.optionalData.gameVersion, 10);
239
+ if (!Number.isNaN(versionNum)) {
240
+ return versionNum >= NEW_SCORE_VERSION;
241
+ }
242
+ }
243
+ return true;
244
+ });
245
+ const oldScores = scores.filter((v) => {
246
+ if (v.dbChart) {
247
+ const versionNum = parseInt(v.dbChart.optionalData.gameVersion, 10);
248
+ if (!Number.isNaN(versionNum)) {
249
+ return versionNum < NEW_SCORE_VERSION;
250
+ }
251
+ }
252
+ return false;
253
+ });
254
+ return {
255
+ new: newScores,
256
+ old: oldScores,
257
+ };
258
+ }
259
+ async function getProfile(cookies) {
260
+ const res = await fetch(`https://maimaidx-eng.com/maimai-mobile/home/`, {
261
+ headers: {
262
+ ...headers,
263
+ cookie: Object.entries(cookies)
264
+ .map(([k, v]) => `${k}=${v}`)
265
+ .join("; "),
266
+ referer: "https://maimaidx-eng.com/maimai-mobile/home/",
267
+ },
268
+ });
269
+ if (!res.ok)
270
+ throw await res.text();
271
+ const html = await res.text();
272
+ const $ = Cheerio.load(html);
273
+ const name = $("div.main_wrapper div.see_through_block div.basic_block div.name_block").text();
274
+ const rating = parseInt($("div.main_wrapper div.see_through_block div.rating_block").text(), 10);
275
+ return { name, rating };
276
+ }
277
+ async function getCharts(level, cookies) {
278
+ const res = await fetch(`https://maimaidx-eng.com/maimai-mobile/record/musicLevel/search/?level=${level}`, {
279
+ headers: {
280
+ ...headers,
281
+ cookie: Object.entries(cookies)
282
+ .map(([k, v]) => `${k}=${v}`)
283
+ .join("; "),
284
+ referer: "https://maimaidx-eng.com/maimai-mobile/record/musicLevel/",
285
+ },
286
+ });
287
+ if (!res.ok)
288
+ throw await res.text();
289
+ const charts = [];
290
+ const html = await res.text();
291
+ const $ = Cheerio.load(html);
292
+ for (const e of $("div.main_wrapper div.pointer form")) {
293
+ const name = $("div.music_name_block", e).text();
294
+ const level = $("div.music_lv_block", e).text();
295
+ const difficulty = ($("img.f_l", e).attr("src") ?? "").split("img/diff_")[1].split(".png")[0];
296
+ const mode = ($("img.music_kind_icon", e).attr("src") ?? "").includes("music_dx") ? "DX" : "ST";
297
+ charts.push({ name, level, difficulty, mode });
298
+ }
299
+ return charts;
300
+ }
301
+ async function checkLogin(cookies) {
302
+ const res = await fetch("https://maimaidx-eng.com/maimai-mobile/home/", {
303
+ headers: {
304
+ ...headers,
305
+ cookie: Object.entries(cookies)
306
+ .map(([k, v]) => `${k}=${v}`)
307
+ .join("; "),
308
+ referer: "https://maimaidx-eng.com/maimai-mobile/",
309
+ },
310
+ redirect: "manual",
311
+ });
312
+ return res.ok;
313
+ }
314
+ //# sourceMappingURL=maimaidx-eng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maimaidx-eng.js","sourceRoot":"","sources":["../../../../src/maimai/lib/scraper/maimaidx-eng.ts"],"names":[],"mappings":"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"}