@efffrida/gplayapi 0.0.3 → 0.0.5
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/dist/GooglePlayApi.d.ts +17 -19
- package/dist/GooglePlayApi.d.ts.map +1 -1
- package/dist/GooglePlayApi.js +34 -10
- package/dist/GooglePlayApi.js.map +1 -1
- package/dist/internal/http.js +3 -6
- package/dist/internal/http.js.map +1 -1
- package/package.json +1 -1
- package/src/GooglePlayApi.ts +81 -28
- package/src/internal/auth.ts +3 -3
- package/src/internal/http.ts +1 -1
package/dist/GooglePlayApi.d.ts
CHANGED
|
@@ -4,12 +4,14 @@
|
|
|
4
4
|
*
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*/
|
|
7
|
+
import type * as PlatformError from "@effect/platform/Error";
|
|
7
8
|
import type * as HttpClientError from "@effect/platform/HttpClientError";
|
|
9
|
+
import type * as Scope from "effect/Scope";
|
|
8
10
|
import * as FileSystem from "@effect/platform/FileSystem";
|
|
9
11
|
import * as HttpClient from "@effect/platform/HttpClient";
|
|
10
12
|
import * as Effect from "effect/Effect";
|
|
11
13
|
import * as Layer from "effect/Layer";
|
|
12
|
-
import { type BulkDetailsResponse, type BuyResponse, type DetailsResponse } from "./generated/GooglePlay_pb.
|
|
14
|
+
import { type BulkDetailsResponse, type BuyResponse, type DetailsResponse } from "./generated/GooglePlay_pb.ts";
|
|
13
15
|
export {
|
|
14
16
|
/**
|
|
15
17
|
* @since 1.0.0
|
|
@@ -21,12 +23,12 @@ export {
|
|
|
21
23
|
* @since 1.0.0
|
|
22
24
|
* @category Device
|
|
23
25
|
*/
|
|
24
|
-
Device, } from "./internal/device.
|
|
26
|
+
Device, } from "./internal/device.ts";
|
|
25
27
|
/**
|
|
26
28
|
* @since 1.0.0
|
|
27
29
|
* @category Auth
|
|
28
30
|
*/
|
|
29
|
-
export declare const defaultHttpClient: Layer.Layer<HttpClient.HttpClient,
|
|
31
|
+
export declare const defaultHttpClient: Layer.Layer<HttpClient.HttpClient, PlatformError.PlatformError | import("effect/ParseResult").ParseError | HttpClientError.HttpClientError, FileSystem.FileSystem>;
|
|
30
32
|
/**
|
|
31
33
|
* @since 1.0.0
|
|
32
34
|
* @category API
|
|
@@ -55,34 +57,30 @@ export declare const delivery: (bundleIdentifier: string, options: {
|
|
|
55
57
|
deliveryToken: string;
|
|
56
58
|
versionCode: number | bigint;
|
|
57
59
|
certificateHash?: string | undefined;
|
|
58
|
-
}) => Effect.Effect<import("./generated/GooglePlay_pb.
|
|
60
|
+
}) => Effect.Effect<import("./generated/GooglePlay_pb.ts").DeliveryResponse, HttpClientError.HttpClientError, HttpClient.HttpClient>;
|
|
59
61
|
/**
|
|
60
62
|
* @since 1.0.0
|
|
61
63
|
* @category API
|
|
62
64
|
*/
|
|
63
|
-
export declare const download: (bundleIdentifier: string) => Effect.Effect<[{
|
|
64
|
-
file: string;
|
|
65
|
-
name: string;
|
|
65
|
+
export declare const download: (bundleIdentifier: string) => Effect.Effect<readonly [{
|
|
66
66
|
url: string;
|
|
67
|
-
|
|
67
|
+
name: string;
|
|
68
|
+
file: string;
|
|
69
|
+
size: number | bigint;
|
|
68
70
|
integrity: {
|
|
71
|
+
sha1: string;
|
|
72
|
+
} | {
|
|
69
73
|
sha256: string;
|
|
70
74
|
};
|
|
71
|
-
}, ...
|
|
72
|
-
file: string;
|
|
75
|
+
}, ...{
|
|
73
76
|
url: string;
|
|
74
|
-
size: bigint;
|
|
75
77
|
name: string;
|
|
76
|
-
integrity: {
|
|
77
|
-
sha256: string;
|
|
78
|
-
};
|
|
79
|
-
} | {
|
|
80
78
|
file: string;
|
|
81
|
-
|
|
82
|
-
size: bigint;
|
|
83
|
-
url: string;
|
|
79
|
+
size: number | bigint;
|
|
84
80
|
integrity: {
|
|
85
81
|
sha1: string;
|
|
82
|
+
} | {
|
|
83
|
+
sha256: string;
|
|
86
84
|
};
|
|
87
|
-
}
|
|
85
|
+
}[]], PlatformError.PlatformError | HttpClientError.HttpClientError, FileSystem.FileSystem | HttpClient.HttpClient | Scope.Scope>;
|
|
88
86
|
//# sourceMappingURL=GooglePlayApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GooglePlayApi.d.ts","sourceRoot":"","sources":["../src/GooglePlayApi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,eAAe,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"GooglePlayApi.d.ts","sourceRoot":"","sources":["../src/GooglePlayApi.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,aAAa,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,KAAK,eAAe,MAAM,kCAAkC,CAAC;AACzE,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAG3C,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAC1D,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAC;AAI1D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAKtC,OAAO,EAEH,KAAK,mBAAmB,EACxB,KAAK,WAAW,EAChB,KAAK,eAAe,EACvB,MAAM,8BAA8B,CAAC;AAKtC,OAAO;AACH;;;GAGG;AACH,cAAc,GACjB,MAAM,oBAAoB,CAAC;AAE5B,OAAO;AACH;;;GAGG;AACH,MAAM,GACT,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oKAK7B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,GAChB,kBAAkB,MAAM,KACzB,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,UAAU,CAInF,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,WAAW,GACpB,kBAAkB,MAAM,KACzB,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,UAAU,CAUvF,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,QAAQ,GACjB,kBAAkB,MAAM,EACxB,SAAS;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,KACF,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,eAAe,CAAC,eAAe,EAAE,UAAU,CAAC,UAAU,CAW/E,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,QAAQ,GACjB,kBAAkB,MAAM,EACxB,SAAS;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,mIAaA,CAAC;AAEN;;;GAGG;AACH,eAAO,MAAM,QAAQ;SAER,MAAM;UACL,MAAM;UACN,MAAM;UACN,MAAM,GAAG,MAAM;eACV;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;;SAJ3C,MAAM;UACL,MAAM;UACN,MAAM;UACN,MAAM,GAAG,MAAM;eACV;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;iIAuItD,CAAC"}
|
package/dist/GooglePlayApi.js
CHANGED
|
@@ -13,6 +13,7 @@ import * as Array from "effect/Array";
|
|
|
13
13
|
import * as Effect from "effect/Effect";
|
|
14
14
|
import * as Function from "effect/Function";
|
|
15
15
|
import * as Layer from "effect/Layer";
|
|
16
|
+
import * as Sink from "effect/Sink";
|
|
16
17
|
import * as Stream from "effect/Stream";
|
|
17
18
|
import * as url from "node:url";
|
|
18
19
|
import { BulkDetailsRequestSchema } from "./generated/GooglePlay_pb.js";
|
|
@@ -101,22 +102,33 @@ export const download = /*#__PURE__*/Effect.fnUntraced(function* (bundleIdentifi
|
|
|
101
102
|
});
|
|
102
103
|
const mainDeliveryData = deliveryResult?.appDeliveryData;
|
|
103
104
|
if (mainDeliveryData === undefined) {
|
|
104
|
-
return yield* Effect.
|
|
105
|
+
return yield* Effect.dieMessage("No delivery data available");
|
|
105
106
|
}
|
|
107
|
+
const digestSink = algorithm => {
|
|
108
|
+
const toHex = buffer => Array.fromIterable(new Uint8Array(buffer)).map(b => b.toString(16).padStart(2, "0")).join("");
|
|
109
|
+
const digestToHex = data => Effect.map(Effect.promise(() => crypto.subtle.digest(algorithm, data)), toHex);
|
|
110
|
+
return Sink.mapEffect(Sink.foldLeft(Buffer.alloc(0), (acc, chunk) => Buffer.concat([acc, chunk])), digestToHex);
|
|
111
|
+
};
|
|
106
112
|
const main = Effect.gen(function* () {
|
|
107
113
|
const file = yield* fileSystem.makeTempFileScoped({
|
|
108
114
|
suffix: ".apk"
|
|
109
115
|
});
|
|
116
|
+
const integrity = Buffer.from(mainDeliveryData.sha256, "base64url").toString("hex");
|
|
110
117
|
const stream = HttpClientResponse.stream(HttpClient.get(mainDeliveryData.downloadUrl));
|
|
111
|
-
yield* Stream.run(stream, fileSystem.sink(file))
|
|
112
|
-
|
|
118
|
+
const downloadedIntegrity = yield* Stream.run(stream, Sink.zipRight(fileSystem.sink(file), digestSink("SHA-256"), {
|
|
119
|
+
concurrent: true
|
|
120
|
+
}));
|
|
121
|
+
yield* Effect.logDebug(`main APK of ${mainDeliveryData.downloadSize}bytes from ${mainDeliveryData.downloadUrl} with integrity ${integrity}(sha256) downloaded to ${file}`);
|
|
122
|
+
if (downloadedIntegrity !== integrity) {
|
|
123
|
+
return yield* Effect.dieMessage(`Downloaded main APK integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`);
|
|
124
|
+
}
|
|
113
125
|
return {
|
|
114
126
|
file,
|
|
115
127
|
name: `${bundleIdentifier}.apk`,
|
|
116
128
|
url: mainDeliveryData.downloadUrl,
|
|
117
129
|
size: mainDeliveryData.downloadSize,
|
|
118
130
|
integrity: {
|
|
119
|
-
sha256:
|
|
131
|
+
sha256: integrity
|
|
120
132
|
}
|
|
121
133
|
};
|
|
122
134
|
});
|
|
@@ -124,16 +136,22 @@ export const download = /*#__PURE__*/Effect.fnUntraced(function* (bundleIdentifi
|
|
|
124
136
|
const file = yield* fileSystem.makeTempFileScoped({
|
|
125
137
|
suffix: ".apk"
|
|
126
138
|
});
|
|
139
|
+
const integrity = Buffer.from(split.sha256, "base64url").toString("hex");
|
|
127
140
|
const stream = HttpClientResponse.stream(HttpClient.get(split.downloadUrl));
|
|
128
|
-
yield* Stream.run(stream, fileSystem.sink(file))
|
|
129
|
-
|
|
141
|
+
const downloadedIntegrity = yield* Stream.run(stream, Sink.zipRight(fileSystem.sink(file), digestSink("SHA-256"), {
|
|
142
|
+
concurrent: true
|
|
143
|
+
}));
|
|
144
|
+
yield* Effect.logDebug(`split ${split.name} of ${split.downloadSize}bytes from ${split.downloadUrl} with integrity ${integrity}(sha256) downloaded to ${file}`);
|
|
145
|
+
if (downloadedIntegrity !== integrity) {
|
|
146
|
+
return yield* Effect.dieMessage(`Downloaded split ${split.name} integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`);
|
|
147
|
+
}
|
|
130
148
|
return {
|
|
131
149
|
file,
|
|
132
150
|
url: split.downloadUrl,
|
|
133
151
|
size: split.downloadSize,
|
|
134
152
|
name: `${split.name}.apk`,
|
|
135
153
|
integrity: {
|
|
136
|
-
sha256:
|
|
154
|
+
sha256: integrity
|
|
137
155
|
}
|
|
138
156
|
};
|
|
139
157
|
}));
|
|
@@ -143,16 +161,22 @@ export const download = /*#__PURE__*/Effect.fnUntraced(function* (bundleIdentifi
|
|
|
143
161
|
const file = yield* fileSystem.makeTempFileScoped({
|
|
144
162
|
suffix: ".obb"
|
|
145
163
|
});
|
|
164
|
+
const integrity = Buffer.from(expansion.sha1, "base64url").toString("hex");
|
|
146
165
|
const stream = HttpClientResponse.stream(HttpClient.get(expansion.downloadUrl));
|
|
147
|
-
yield* Stream.run(stream, fileSystem.sink(file))
|
|
148
|
-
|
|
166
|
+
const downloadedIntegrity = yield* Stream.run(stream, Sink.zipRight(fileSystem.sink(file), digestSink("SHA-1"), {
|
|
167
|
+
concurrent: true
|
|
168
|
+
}));
|
|
169
|
+
yield* Effect.logDebug(`expansion file ${name} of ${expansion.size}bytes from ${expansion.downloadUrl} with integrity ${integrity}(sha1) downloaded to ${file}`);
|
|
170
|
+
if (downloadedIntegrity !== integrity) {
|
|
171
|
+
return yield* Effect.dieMessage(`Downloaded expansion file ${name} integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`);
|
|
172
|
+
}
|
|
149
173
|
return {
|
|
150
174
|
file,
|
|
151
175
|
name,
|
|
152
176
|
size: expansion.size,
|
|
153
177
|
url: expansion.downloadUrl,
|
|
154
178
|
integrity: {
|
|
155
|
-
sha1:
|
|
179
|
+
sha1: integrity
|
|
156
180
|
}
|
|
157
181
|
};
|
|
158
182
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GooglePlayApi.js","names":["FetchHttpClient","FileSystem","HttpClient","HttpClientRequest","HttpClientResponse","Array","Effect","Function","Layer","Stream","url","BulkDetailsRequestSchema","makeHttpClient","Device","decodeResponseFromResponseWrapper","encodeRequest","defaultHttpClient","pipe","fromPropertiesFile","fileURLToPath","URL","import","meta","map","unwrapEffect","provide","layer","details","bundleIdentifier","flatMap","get","urlParams","doc","bulkDetails","post","includeDetails","includeChildDocs","DocId","execute","purchase","options","ch","certificateHash","ot","offerType","toString","vc","versionCode","delivery","dtok","deliveryToken","download","fnUntraced","fileSystem","item","encodedDeliveryToken","offer","appDetails","deliveryResult","mainDeliveryData","appDeliveryData","undefined","
|
|
1
|
+
{"version":3,"file":"GooglePlayApi.js","names":["FetchHttpClient","FileSystem","HttpClient","HttpClientRequest","HttpClientResponse","Array","Effect","Function","Layer","Sink","Stream","url","BulkDetailsRequestSchema","makeHttpClient","Device","decodeResponseFromResponseWrapper","encodeRequest","defaultHttpClient","pipe","fromPropertiesFile","fileURLToPath","URL","import","meta","map","unwrapEffect","provide","layer","details","bundleIdentifier","flatMap","get","urlParams","doc","bulkDetails","post","includeDetails","includeChildDocs","DocId","execute","purchase","options","ch","certificateHash","ot","offerType","toString","vc","versionCode","delivery","dtok","deliveryToken","download","fnUntraced","fileSystem","item","encodedDeliveryToken","offer","appDetails","deliveryResult","mainDeliveryData","appDeliveryData","undefined","dieMessage","digestSink","algorithm","toHex","buffer","fromIterable","Uint8Array","b","padStart","join","digestToHex","data","promise","crypto","subtle","digest","mapEffect","foldLeft","Buffer","alloc","acc","chunk","concat","main","gen","file","makeTempFileScoped","suffix","integrity","from","sha256","stream","downloadUrl","downloadedIntegrity","run","zipRight","sink","concurrent","logDebug","downloadSize","name","size","splits","splitDeliveryData","split","expansions","additionalFile","expansion","typeStr","fileType","sha1","all"],"sources":["../src/GooglePlayApi.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;AAWA,OAAO,KAAKA,eAAe,MAAM,kCAAkC;AACnE,OAAO,KAAKC,UAAU,MAAM,6BAA6B;AACzD,OAAO,KAAKC,UAAU,MAAM,6BAA6B;AACzD,OAAO,KAAKC,iBAAiB,MAAM,oCAAoC;AACvE,OAAO,KAAKC,kBAAkB,MAAM,qCAAqC;AACzE,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,IAAI,MAAM,aAAa;AACnC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,GAAG,MAAM,UAAU;AAE/B,SACIC,wBAAwB,QAIrB,8BAA8B;AACrC,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,MAAM,QAAQ,sBAAsB;AAC7C,SAASC,iCAAiC,EAAEC,aAAa,QAAQ,oBAAoB;AAErF;AACI;;;;AAIAH,cAAc,QACX,oBAAoB;AAE3B;AACI;;;;AAIAC,MAAM,QACH,sBAAsB;AAE7B;;;;AAIA,OAAO,MAAMG,iBAAiB,gBAAGV,QAAQ,CAACW,IAAI,cAC1CJ,MAAM,CAACK,kBAAkB,cAACR,GAAG,CAACS,aAAa,cAAC,IAAIC,GAAG,CAAC,oCAAoC,EAAEC,MAAM,CAACC,IAAI,CAACZ,GAAG,CAAC,CAAC,CAAC,eAC5GL,MAAM,CAACkB,GAAG,CAACX,cAAc,CAAC,EAC1BL,KAAK,CAACiB,YAAY,eAClBjB,KAAK,CAACkB,OAAO,CAAC1B,eAAe,CAAC2B,KAAK,CAAC,CACvC;AAED;;;;AAIA,OAAO,MAAMC,OAAO,GAChBC,gBAAwB,IAExBvB,MAAM,CAACwB,OAAO,CACV5B,UAAU,CAAC6B,GAAG,CAAC,eAAe,EAAE;EAAEC,SAAS,EAAE;IAAEC,GAAG,EAAEJ;EAAgB;AAAE,CAAE,CAAC,EACzEd,iCAAiC,CAAC,iBAAiB,CAAC,CACvD;AAEL;;;;AAIA,OAAO,MAAMmB,WAAW,GACpBL,gBAAwB,IAExBtB,QAAQ,CAACW,IAAI,CACTf,iBAAiB,CAACgC,IAAI,CAAC,mBAAmB,CAAC,EAC3CnB,aAAa,CAACJ,wBAAwB,EAAE;EACpCwB,cAAc,EAAE,IAAI;EACpBC,gBAAgB,EAAE,IAAI;EACtBC,KAAK,EAAE,CAACT,gBAAgB;CAC3B,CAAC,EACFvB,MAAM,CAACwB,OAAO,CAAC5B,UAAU,CAACqC,OAAO,CAAC,EAClCjC,MAAM,CAACwB,OAAO,CAACf,iCAAiC,CAAC,qBAAqB,CAAC,CAAC,CAC3E;AAEL;;;;AAIA,OAAO,MAAMyB,QAAQ,GAAGA,CACpBX,gBAAwB,EACxBY,OAIC,KAEDnC,MAAM,CAACwB,OAAO,CACV5B,UAAU,CAACiC,IAAI,CAAC,gBAAgB,EAAE;EAC9BH,SAAS,EAAE;IACPC,GAAG,EAAEJ,gBAAgB;IACrBa,EAAE,EAAED,OAAO,CAACE,eAAe,IAAI,EAAE;IACjCC,EAAE,EAAEH,OAAO,CAACI,SAAS,CAACC,QAAQ,EAAE;IAChCC,EAAE,EAAEN,OAAO,CAACO,WAAW,CAACF,QAAQ;;CAEvC,CAAC,EACF/B,iCAAiC,CAAC,aAAa,CAAC,CACnD;AAEL;;;;AAIA,OAAO,MAAMkC,QAAQ,GAAGA,CACpBpB,gBAAwB,EACxBY,OAKC,KAEDnC,MAAM,CAACwB,OAAO,CACV5B,UAAU,CAAC6B,GAAG,CAAC,gBAAgB,EAAE;EAC7BC,SAAS,EAAE;IACPC,GAAG,EAAEJ,gBAAgB;IACrBqB,IAAI,EAAET,OAAO,CAACU,aAAa;IAC3BT,EAAE,EAAED,OAAO,CAACE,eAAe,IAAI,EAAE;IACjCC,EAAE,EAAEH,OAAO,CAACI,SAAS,CAACC,QAAQ,EAAE;IAChCC,EAAE,EAAEN,OAAO,CAACO,WAAW,CAACF,QAAQ;;CAEvC,CAAC,EACF/B,iCAAiC,CAAC,kBAAkB,CAAC,CACxD;AAEL;;;;AAIA,OAAO,MAAMqC,QAAQ,gBAAG9C,MAAM,CAAC+C,UAAU,CAAC,WAAWxB,gBAAwB;EAWzE,MAAMyB,UAAU,GAAG,OAAOrD,UAAU,CAACA,UAAU;EAE/C,MAAM;IAAEsD;EAAI,CAAE,GAAG,OAAO3B,OAAO,CAACC,gBAAgB,CAAC;EACjD,MAAM;IAAE2B;EAAoB,CAAE,GAAG,OAAOhB,QAAQ,CAACX,gBAAgB,EAAE;IAC/DgB,SAAS,EAAEU,IAAI,EAAEE,KAAK,CAAC,CAAC,CAAC,CAACZ,SAAS,IAAI,CAAC;IACxCG,WAAW,EAAEO,IAAI,EAAE3B,OAAO,EAAE8B,UAAU,EAAEV,WAAW,IAAI;GAC1D,CAAC;EAEF,MAAMW,cAAc,GAAG,OAAOV,QAAQ,CAACpB,gBAAgB,EAAE;IACrDsB,aAAa,EAAEK,oBAAoB;IACnCX,SAAS,EAAEU,IAAI,EAAEE,KAAK,CAAC,CAAC,CAAC,CAACZ,SAAS,IAAI,CAAC;IACxCG,WAAW,EAAEO,IAAI,EAAE3B,OAAO,EAAE8B,UAAU,EAAEV,WAAW,IAAI;GAC1D,CAAC;EAEF,MAAMY,gBAAgB,GAAGD,cAAc,EAAEE,eAAe;EACxD,IAAID,gBAAgB,KAAKE,SAAS,EAAE;IAChC,OAAO,OAAOxD,MAAM,CAACyD,UAAU,CAAC,4BAA4B,CAAC;EACjE;EAEA,MAAMC,UAAU,GACZC,SAAsD,IACF;IACpD,MAAMC,KAAK,GAAIC,MAAmB,IAC9B9D,KAAK,CAAC+D,YAAY,CAAC,IAAIC,UAAU,CAACF,MAAM,CAAC,CAAC,CACrC3C,GAAG,CAAE8C,CAAC,IAAKA,CAAC,CAACxB,QAAQ,CAAC,EAAE,CAAC,CAACyB,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAC3CC,IAAI,CAAC,EAAE,CAAC;IAEjB,MAAMC,WAAW,GAAIC,IAAkB,IACnCpE,MAAM,CAACkB,GAAG,CACNlB,MAAM,CAACqE,OAAO,CAAC,MAAMC,MAAM,CAACC,MAAM,CAACC,MAAM,CAACb,SAAS,EAAES,IAAI,CAAC,CAAC,EAC3DR,KAAK,CACR;IAEL,OAAOzD,IAAI,CAACsE,SAAS,CACjBtE,IAAI,CAACuE,QAAQ,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,CAAC,EAAE,CAACC,GAAG,EAAEC,KAAiB,KAAKH,MAAM,CAACI,MAAM,CAAC,CAACF,GAAG,EAAEC,KAAK,CAAC,CAAC,CAAC,EACvFX,WAAW,CACd;EACL,CAAC;EAED,MAAMa,IAAI,GAAGhF,MAAM,CAACiF,GAAG,CAAC,aAAS;IAC7B,MAAMC,IAAI,GAAG,OAAOlC,UAAU,CAACmC,kBAAkB,CAAC;MAAEC,MAAM,EAAE;IAAM,CAAE,CAAC;IACrE,MAAMC,SAAS,GAAGV,MAAM,CAACW,IAAI,CAAChC,gBAAgB,CAACiC,MAAM,EAAE,WAAW,CAAC,CAAC/C,QAAQ,CAAC,KAAK,CAAC;IACnF,MAAMgD,MAAM,GAAG1F,kBAAkB,CAAC0F,MAAM,CAAC5F,UAAU,CAAC6B,GAAG,CAAC6B,gBAAgB,CAACmC,WAAW,CAAC,CAAC;IACtF,MAAMC,mBAAmB,GAAG,OAAOtF,MAAM,CAACuF,GAAG,CACzCH,MAAM,EACNrF,IAAI,CAACyF,QAAQ,CAAC5C,UAAU,CAAC6C,IAAI,CAACX,IAAI,CAAC,EAAExB,UAAU,CAAC,SAAS,CAAC,EAAE;MAAEoC,UAAU,EAAE;IAAI,CAAE,CAAC,CACpF;IAED,OAAO9F,MAAM,CAAC+F,QAAQ,CAClB,eAAezC,gBAAgB,CAAC0C,YAAY,cAAc1C,gBAAgB,CAACmC,WAAW,mBAAmBJ,SAAS,0BAA0BH,IAAI,EAAE,CACrJ;IAED,IAAIQ,mBAAmB,KAAKL,SAAS,EAAE;MACnC,OAAO,OAAOrF,MAAM,CAACyD,UAAU,CAC3B,oDAAoD4B,SAAS,SAASK,mBAAmB,EAAE,CAC9F;IACL;IAEA,OAAO;MACHR,IAAI;MACJe,IAAI,EAAE,GAAG1E,gBAAgB,MAAM;MAC/BlB,GAAG,EAAEiD,gBAAgB,CAACmC,WAAW;MACjCS,IAAI,EAAE5C,gBAAgB,CAAC0C,YAAY;MACnCX,SAAS,EAAE;QAAEE,MAAM,EAAEF;MAAS;KACjC;EACL,CAAC,CAAC;EAEF,MAAMc,MAAM,GAAGpG,KAAK,CAACmB,GAAG,CAACoC,gBAAgB,CAAC8C,iBAAiB,EAAGC,KAAK,IAC/DrG,MAAM,CAACiF,GAAG,CAAC,aAAS;IAChB,MAAMC,IAAI,GAAG,OAAOlC,UAAU,CAACmC,kBAAkB,CAAC;MAAEC,MAAM,EAAE;IAAM,CAAE,CAAC;IACrE,MAAMC,SAAS,GAAGV,MAAM,CAACW,IAAI,CAACe,KAAK,CAACd,MAAM,EAAE,WAAW,CAAC,CAAC/C,QAAQ,CAAC,KAAK,CAAC;IACxE,MAAMgD,MAAM,GAAG1F,kBAAkB,CAAC0F,MAAM,CAAC5F,UAAU,CAAC6B,GAAG,CAAC4E,KAAK,CAACZ,WAAW,CAAC,CAAC;IAC3E,MAAMC,mBAAmB,GAAG,OAAOtF,MAAM,CAACuF,GAAG,CACzCH,MAAM,EACNrF,IAAI,CAACyF,QAAQ,CAAC5C,UAAU,CAAC6C,IAAI,CAACX,IAAI,CAAC,EAAExB,UAAU,CAAC,SAAS,CAAC,EAAE;MAAEoC,UAAU,EAAE;IAAI,CAAE,CAAC,CACpF;IAED,OAAO9F,MAAM,CAAC+F,QAAQ,CAClB,SAASM,KAAK,CAACJ,IAAI,OAAOI,KAAK,CAACL,YAAY,cAAcK,KAAK,CAACZ,WAAW,mBAAmBJ,SAAS,0BAA0BH,IAAI,EAAE,CAC1I;IAED,IAAIQ,mBAAmB,KAAKL,SAAS,EAAE;MACnC,OAAO,OAAOrF,MAAM,CAACyD,UAAU,CAC3B,oBAAoB4C,KAAK,CAACJ,IAAI,iCAAiCZ,SAAS,SAASK,mBAAmB,EAAE,CACzG;IACL;IAEA,OAAO;MACHR,IAAI;MACJ7E,GAAG,EAAEgG,KAAK,CAACZ,WAAW;MACtBS,IAAI,EAAEG,KAAK,CAACL,YAAY;MACxBC,IAAI,EAAE,GAAGI,KAAK,CAACJ,IAAI,MAAM;MACzBZ,SAAS,EAAE;QAAEE,MAAM,EAAEF;MAAS;KACjC;EACL,CAAC,CAAC,CACL;EAED,MAAMiB,UAAU,GAAGvG,KAAK,CAACmB,GAAG,CAACoC,gBAAgB,CAACiD,cAAc,EAAGC,SAAS,IACpExG,MAAM,CAACiF,GAAG,CAAC,aAAS;IAChB,MAAMwB,OAAO,GAAGD,SAAS,CAACE,QAAQ,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO;IAC3D,MAAMT,IAAI,GAAG,GAAGQ,OAAO,IAAID,SAAS,CAAC9D,WAAW,IAAInB,gBAAgB,MAAM;IAC1E,MAAM2D,IAAI,GAAG,OAAOlC,UAAU,CAACmC,kBAAkB,CAAC;MAAEC,MAAM,EAAE;IAAM,CAAE,CAAC;IACrE,MAAMC,SAAS,GAAGV,MAAM,CAACW,IAAI,CAACkB,SAAS,CAACG,IAAI,EAAE,WAAW,CAAC,CAACnE,QAAQ,CAAC,KAAK,CAAC;IAC1E,MAAMgD,MAAM,GAAG1F,kBAAkB,CAAC0F,MAAM,CAAC5F,UAAU,CAAC6B,GAAG,CAAC+E,SAAS,CAACf,WAAW,CAAC,CAAC;IAC/E,MAAMC,mBAAmB,GAAG,OAAOtF,MAAM,CAACuF,GAAG,CACzCH,MAAM,EACNrF,IAAI,CAACyF,QAAQ,CAAC5C,UAAU,CAAC6C,IAAI,CAACX,IAAI,CAAC,EAAExB,UAAU,CAAC,OAAO,CAAC,EAAE;MAAEoC,UAAU,EAAE;IAAI,CAAE,CAAC,CAClF;IAED,OAAO9F,MAAM,CAAC+F,QAAQ,CAClB,kBAAkBE,IAAI,OAAOO,SAAS,CAACN,IAAI,cAAcM,SAAS,CAACf,WAAW,mBAAmBJ,SAAS,wBAAwBH,IAAI,EAAE,CAC3I;IAED,IAAIQ,mBAAmB,KAAKL,SAAS,EAAE;MACnC,OAAO,OAAOrF,MAAM,CAACyD,UAAU,CAC3B,6BAA6BwC,IAAI,iCAAiCZ,SAAS,SAASK,mBAAmB,EAAE,CAC5G;IACL;IAEA,OAAO;MACHR,IAAI;MACJe,IAAI;MACJC,IAAI,EAAEM,SAAS,CAACN,IAAI;MACpB7F,GAAG,EAAEmG,SAAS,CAACf,WAAW;MAC1BJ,SAAS,EAAE;QAAEsB,IAAI,EAAEtB;MAAS;KAC/B;EACL,CAAC,CAAC,CACL;EAED,OAAO,OAAOrF,MAAM,CAAC4G,GAAG,CAAC,CAAC5B,IAAI,EAAE,GAAGmB,MAAM,EAAE,GAAGG,UAAU,CAAC,CAAC;AAC9D,CAAC,CAAC","ignoreList":[]}
|
package/dist/internal/http.js
CHANGED
|
@@ -9,8 +9,7 @@ import { ResponseWrapperSchema } from "../generated/GooglePlay_pb.js";
|
|
|
9
9
|
/** @internal */
|
|
10
10
|
export const encodeRequest = /*#__PURE__*/Function.dual(
|
|
11
11
|
// Data first if the first argument is an http request
|
|
12
|
-
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientRequest.TypeId),
|
|
13
|
-
/*#__PURE__*/
|
|
12
|
+
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientRequest.TypeId), /*#__PURE__*/
|
|
14
13
|
// Body implementation
|
|
15
14
|
Effect.fn("encodeRequest")(function* (request, description, body, options) {
|
|
16
15
|
const messageType = description.name;
|
|
@@ -32,8 +31,7 @@ Effect.fn("encodeRequest")(function* (request, description, body, options) {
|
|
|
32
31
|
/** @internal */
|
|
33
32
|
export const decodeResponse = /*#__PURE__*/Function.dual(
|
|
34
33
|
// Data first if the first argument is an http response
|
|
35
|
-
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientResponse.TypeId),
|
|
36
|
-
/*#__PURE__*/
|
|
34
|
+
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientResponse.TypeId), /*#__PURE__*/
|
|
37
35
|
// Body implementation
|
|
38
36
|
Effect.fn("decodeResponse")(function* (response, protobufDescription, options) {
|
|
39
37
|
const messageType = protobufDescription.name;
|
|
@@ -64,8 +62,7 @@ Effect.fn("decodeResponse")(function* (response, protobufDescription, options) {
|
|
|
64
62
|
/** @internal */
|
|
65
63
|
export const decodeResponseFromResponseWrapper = /*#__PURE__*/Function.dual(
|
|
66
64
|
// Data first if the first argument is an http response
|
|
67
|
-
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientResponse.TypeId),
|
|
68
|
-
/*#__PURE__*/
|
|
65
|
+
arguments_ => Predicate.hasProperty(arguments_[0], HttpClientResponse.TypeId), /*#__PURE__*/
|
|
69
66
|
// Body implementation
|
|
70
67
|
Effect.fn("decodeResponse")(function* (response, extractPayload, options) {
|
|
71
68
|
const responseWrapper = yield* decodeResponse(response, ResponseWrapperSchema, options);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","names":["Protobuf","HttpClientError","HttpClientRequest","HttpClientResponse","Effect","Function","Predicate","ResponseWrapperSchema","encodeRequest","dual","arguments_","hasProperty","TypeId","fn","request","description","body","options","messageType","name","annotateCurrentSpan","bytes","try","toBinary","create","writeUnknownFields","catch","cause","RequestError","reason","applyBody","bodyUint8Array","decodeResponse","response","protobufDescription","arrayBuffer","message","fromBinary","Uint8Array","readUnknownFields","ResponseError","isUndefined","decodeResponseFromResponseWrapper","extractPayload","responseWrapper","isNotUndefined","commands","displayErrorMessage","extracted","payload"],"sources":["../../src/internal/http.ts"],"sourcesContent":[null],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,oBAAoB;AAC9C,OAAO,KAAKC,eAAe,MAAM,kCAAkC;AACnE,OAAO,KAAKC,iBAAiB,MAAM,oCAAoC;AACvE,OAAO,KAAKC,kBAAkB,MAAM,qCAAqC;AACzE,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,QAAQ,MAAM,iBAAiB;AAC3C,OAAO,KAAKC,SAAS,MAAM,kBAAkB;AAE7C,SAA6BC,qBAAqB,QAAQ,+BAA+B;AAEzF;AACA,OAAO,MAAMC,aAAa,gBAAGH,QAAQ,CAACI,IAAI;AAiBtC;AACCC,UAAU,IAAKJ,SAAS,CAACK,WAAW,CAACD,UAAU,CAAC,CAAC,CAAC,EAAER,iBAAiB,CAACU,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","names":["Protobuf","HttpClientError","HttpClientRequest","HttpClientResponse","Effect","Function","Predicate","ResponseWrapperSchema","encodeRequest","dual","arguments_","hasProperty","TypeId","fn","request","description","body","options","messageType","name","annotateCurrentSpan","bytes","try","toBinary","create","writeUnknownFields","catch","cause","RequestError","reason","applyBody","bodyUint8Array","decodeResponse","response","protobufDescription","arrayBuffer","message","fromBinary","Uint8Array","readUnknownFields","ResponseError","isUndefined","decodeResponseFromResponseWrapper","extractPayload","responseWrapper","isNotUndefined","commands","displayErrorMessage","extracted","payload"],"sources":["../../src/internal/http.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
package/src/GooglePlayApi.ts
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* @since 1.0.0
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type * as PlatformError from "@effect/platform/Error";
|
|
8
9
|
import type * as HttpClientError from "@effect/platform/HttpClientError";
|
|
10
|
+
import type * as Scope from "effect/Scope";
|
|
9
11
|
|
|
10
12
|
import * as FetchHttpClient from "@effect/platform/FetchHttpClient";
|
|
11
13
|
import * as FileSystem from "@effect/platform/FileSystem";
|
|
@@ -16,6 +18,7 @@ import * as Array from "effect/Array";
|
|
|
16
18
|
import * as Effect from "effect/Effect";
|
|
17
19
|
import * as Function from "effect/Function";
|
|
18
20
|
import * as Layer from "effect/Layer";
|
|
21
|
+
import * as Sink from "effect/Sink";
|
|
19
22
|
import * as Stream from "effect/Stream";
|
|
20
23
|
import * as url from "node:url";
|
|
21
24
|
|
|
@@ -24,10 +27,10 @@ import {
|
|
|
24
27
|
type BulkDetailsResponse,
|
|
25
28
|
type BuyResponse,
|
|
26
29
|
type DetailsResponse,
|
|
27
|
-
} from "./generated/GooglePlay_pb.
|
|
28
|
-
import { makeHttpClient } from "./internal/auth.
|
|
29
|
-
import { Device } from "./internal/device.
|
|
30
|
-
import { decodeResponseFromResponseWrapper, encodeRequest } from "./internal/http.
|
|
30
|
+
} from "./generated/GooglePlay_pb.ts";
|
|
31
|
+
import { makeHttpClient } from "./internal/auth.ts";
|
|
32
|
+
import { Device } from "./internal/device.ts";
|
|
33
|
+
import { decodeResponseFromResponseWrapper, encodeRequest } from "./internal/http.ts";
|
|
31
34
|
|
|
32
35
|
export {
|
|
33
36
|
/**
|
|
@@ -43,7 +46,7 @@ export {
|
|
|
43
46
|
* @category Device
|
|
44
47
|
*/
|
|
45
48
|
Device,
|
|
46
|
-
} from "./internal/device.
|
|
49
|
+
} from "./internal/device.ts";
|
|
47
50
|
|
|
48
51
|
/**
|
|
49
52
|
* @since 1.0.0
|
|
@@ -140,7 +143,17 @@ export const delivery = (
|
|
|
140
143
|
* @since 1.0.0
|
|
141
144
|
* @category API
|
|
142
145
|
*/
|
|
143
|
-
export const download = Effect.fnUntraced(function* (bundleIdentifier: string)
|
|
146
|
+
export const download = Effect.fnUntraced(function* (bundleIdentifier: string): Effect.fn.Return<
|
|
147
|
+
Array.NonEmptyReadonlyArray<{
|
|
148
|
+
url: string;
|
|
149
|
+
name: string;
|
|
150
|
+
file: string;
|
|
151
|
+
size: number | bigint;
|
|
152
|
+
integrity: { sha1: string } | { sha256: string };
|
|
153
|
+
}>,
|
|
154
|
+
PlatformError.PlatformError | HttpClientError.HttpClientError,
|
|
155
|
+
HttpClient.HttpClient | FileSystem.FileSystem | Scope.Scope
|
|
156
|
+
> {
|
|
144
157
|
const fileSystem = yield* FileSystem.FileSystem;
|
|
145
158
|
|
|
146
159
|
const { item } = yield* details(bundleIdentifier);
|
|
@@ -148,6 +161,7 @@ export const download = Effect.fnUntraced(function* (bundleIdentifier: string) {
|
|
|
148
161
|
offerType: item?.offer[0].offerType ?? 1,
|
|
149
162
|
versionCode: item?.details?.appDetails?.versionCode ?? 0,
|
|
150
163
|
});
|
|
164
|
+
|
|
151
165
|
const deliveryResult = yield* delivery(bundleIdentifier, {
|
|
152
166
|
deliveryToken: encodedDeliveryToken,
|
|
153
167
|
offerType: item?.offer[0].offerType ?? 1,
|
|
@@ -156,54 +170,84 @@ export const download = Effect.fnUntraced(function* (bundleIdentifier: string) {
|
|
|
156
170
|
|
|
157
171
|
const mainDeliveryData = deliveryResult?.appDeliveryData;
|
|
158
172
|
if (mainDeliveryData === undefined) {
|
|
159
|
-
return yield* Effect.
|
|
173
|
+
return yield* Effect.dieMessage("No delivery data available");
|
|
160
174
|
}
|
|
161
175
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
176
|
+
const digestSink = (
|
|
177
|
+
algorithm: "SHA-1" | "SHA-256" | "SHA-384" | "SHA-512"
|
|
178
|
+
): Sink.Sink<string, Uint8Array, never, never, never> => {
|
|
179
|
+
const toHex = (buffer: ArrayBuffer): string =>
|
|
180
|
+
Array.fromIterable(new Uint8Array(buffer))
|
|
181
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
182
|
+
.join("");
|
|
183
|
+
|
|
184
|
+
const digestToHex = (data: BufferSource): Effect.Effect<string, never, never> =>
|
|
185
|
+
Effect.map(
|
|
186
|
+
Effect.promise(() => crypto.subtle.digest(algorithm, data)),
|
|
187
|
+
toHex
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
return Sink.mapEffect(
|
|
191
|
+
Sink.foldLeft(Buffer.alloc(0), (acc, chunk: Uint8Array) => Buffer.concat([acc, chunk])),
|
|
192
|
+
digestToHex
|
|
193
|
+
);
|
|
168
194
|
};
|
|
169
195
|
|
|
170
196
|
const main = Effect.gen(function* () {
|
|
171
197
|
const file = yield* fileSystem.makeTempFileScoped({ suffix: ".apk" });
|
|
172
|
-
|
|
198
|
+
const integrity = Buffer.from(mainDeliveryData.sha256, "base64url").toString("hex");
|
|
173
199
|
const stream = HttpClientResponse.stream(HttpClient.get(mainDeliveryData.downloadUrl));
|
|
174
|
-
yield* Stream.run(
|
|
200
|
+
const downloadedIntegrity = yield* Stream.run(
|
|
201
|
+
stream,
|
|
202
|
+
Sink.zipRight(fileSystem.sink(file), digestSink("SHA-256"), { concurrent: true })
|
|
203
|
+
);
|
|
175
204
|
|
|
176
205
|
yield* Effect.logDebug(
|
|
177
|
-
`main APK of ${mainDeliveryData.downloadSize}bytes from ${mainDeliveryData.downloadUrl} with integrity ${
|
|
206
|
+
`main APK of ${mainDeliveryData.downloadSize}bytes from ${mainDeliveryData.downloadUrl} with integrity ${integrity}(sha256) downloaded to ${file}`
|
|
178
207
|
);
|
|
179
208
|
|
|
209
|
+
if (downloadedIntegrity !== integrity) {
|
|
210
|
+
return yield* Effect.dieMessage(
|
|
211
|
+
`Downloaded main APK integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
180
215
|
return {
|
|
181
216
|
file,
|
|
182
217
|
name: `${bundleIdentifier}.apk`,
|
|
183
218
|
url: mainDeliveryData.downloadUrl,
|
|
184
219
|
size: mainDeliveryData.downloadSize,
|
|
185
|
-
integrity: { sha256:
|
|
186
|
-
}
|
|
220
|
+
integrity: { sha256: integrity },
|
|
221
|
+
};
|
|
187
222
|
});
|
|
188
223
|
|
|
189
224
|
const splits = Array.map(mainDeliveryData.splitDeliveryData, (split) =>
|
|
190
225
|
Effect.gen(function* () {
|
|
191
226
|
const file = yield* fileSystem.makeTempFileScoped({ suffix: ".apk" });
|
|
192
|
-
|
|
227
|
+
const integrity = Buffer.from(split.sha256, "base64url").toString("hex");
|
|
193
228
|
const stream = HttpClientResponse.stream(HttpClient.get(split.downloadUrl));
|
|
194
|
-
yield* Stream.run(
|
|
229
|
+
const downloadedIntegrity = yield* Stream.run(
|
|
230
|
+
stream,
|
|
231
|
+
Sink.zipRight(fileSystem.sink(file), digestSink("SHA-256"), { concurrent: true })
|
|
232
|
+
);
|
|
195
233
|
|
|
196
234
|
yield* Effect.logDebug(
|
|
197
|
-
`split ${split.name} of ${split.downloadSize}bytes from ${split.downloadUrl} with integrity ${
|
|
235
|
+
`split ${split.name} of ${split.downloadSize}bytes from ${split.downloadUrl} with integrity ${integrity}(sha256) downloaded to ${file}`
|
|
198
236
|
);
|
|
199
237
|
|
|
238
|
+
if (downloadedIntegrity !== integrity) {
|
|
239
|
+
return yield* Effect.dieMessage(
|
|
240
|
+
`Downloaded split ${split.name} integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
200
244
|
return {
|
|
201
245
|
file,
|
|
202
246
|
url: split.downloadUrl,
|
|
203
247
|
size: split.downloadSize,
|
|
204
248
|
name: `${split.name}.apk`,
|
|
205
|
-
integrity: { sha256:
|
|
206
|
-
}
|
|
249
|
+
integrity: { sha256: integrity },
|
|
250
|
+
};
|
|
207
251
|
})
|
|
208
252
|
);
|
|
209
253
|
|
|
@@ -212,21 +256,30 @@ export const download = Effect.fnUntraced(function* (bundleIdentifier: string) {
|
|
|
212
256
|
const typeStr = expansion.fileType === 1 ? "main" : "patch";
|
|
213
257
|
const name = `${typeStr}.${expansion.versionCode}.${bundleIdentifier}.obb`;
|
|
214
258
|
const file = yield* fileSystem.makeTempFileScoped({ suffix: ".obb" });
|
|
215
|
-
|
|
259
|
+
const integrity = Buffer.from(expansion.sha1, "base64url").toString("hex");
|
|
216
260
|
const stream = HttpClientResponse.stream(HttpClient.get(expansion.downloadUrl));
|
|
217
|
-
yield* Stream.run(
|
|
261
|
+
const downloadedIntegrity = yield* Stream.run(
|
|
262
|
+
stream,
|
|
263
|
+
Sink.zipRight(fileSystem.sink(file), digestSink("SHA-1"), { concurrent: true })
|
|
264
|
+
);
|
|
218
265
|
|
|
219
266
|
yield* Effect.logDebug(
|
|
220
|
-
`expansion file ${name} of ${expansion.size}bytes from ${expansion.downloadUrl} with integrity ${
|
|
267
|
+
`expansion file ${name} of ${expansion.size}bytes from ${expansion.downloadUrl} with integrity ${integrity}(sha1) downloaded to ${file}`
|
|
221
268
|
);
|
|
222
269
|
|
|
270
|
+
if (downloadedIntegrity !== integrity) {
|
|
271
|
+
return yield* Effect.dieMessage(
|
|
272
|
+
`Downloaded expansion file ${name} integrity mismatch: expected ${integrity}, got ${downloadedIntegrity}`
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
223
276
|
return {
|
|
224
277
|
file,
|
|
225
278
|
name,
|
|
226
279
|
size: expansion.size,
|
|
227
280
|
url: expansion.downloadUrl,
|
|
228
|
-
integrity: { sha1:
|
|
229
|
-
}
|
|
281
|
+
integrity: { sha1: integrity },
|
|
282
|
+
};
|
|
230
283
|
})
|
|
231
284
|
);
|
|
232
285
|
|
package/src/internal/auth.ts
CHANGED
|
@@ -13,9 +13,9 @@ import {
|
|
|
13
13
|
AndroidCheckinRequestSchema,
|
|
14
14
|
AndroidCheckinResponseSchema,
|
|
15
15
|
UploadDeviceConfigRequestSchema,
|
|
16
|
-
} from "../generated/GooglePlay_pb.
|
|
17
|
-
import { type Device } from "./device.
|
|
18
|
-
import { decodeResponse, decodeResponseFromResponseWrapper, encodeRequest } from "./http.
|
|
16
|
+
} from "../generated/GooglePlay_pb.ts";
|
|
17
|
+
import { type Device } from "./device.ts";
|
|
18
|
+
import { decodeResponse, decodeResponseFromResponseWrapper, encodeRequest } from "./http.ts";
|
|
19
19
|
|
|
20
20
|
/** @internal */
|
|
21
21
|
export const makeHttpClient: (
|
package/src/internal/http.ts
CHANGED
|
@@ -6,7 +6,7 @@ import * as Effect from "effect/Effect";
|
|
|
6
6
|
import * as Function from "effect/Function";
|
|
7
7
|
import * as Predicate from "effect/Predicate";
|
|
8
8
|
|
|
9
|
-
import { type PayloadSchema, ResponseWrapperSchema } from "../generated/GooglePlay_pb.
|
|
9
|
+
import { type PayloadSchema, ResponseWrapperSchema } from "../generated/GooglePlay_pb.ts";
|
|
10
10
|
|
|
11
11
|
/** @internal */
|
|
12
12
|
export const encodeRequest = Function.dual<
|