@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.
@@ -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.js";
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.js";
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, import("@effect/platform/Error").PlatformError | import("effect/ParseResult").ParseError | HttpClientError.HttpClientError, FileSystem.FileSystem>;
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.js").DeliveryResponse, HttpClientError.HttpClientError, HttpClient.HttpClient>;
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
- size: bigint;
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
- name: string;
82
- size: bigint;
83
- url: string;
79
+ size: number | bigint;
84
80
  integrity: {
85
81
  sha1: string;
82
+ } | {
83
+ sha256: string;
86
84
  };
87
- })[]], import("@effect/platform/Error").PlatformError | Error | HttpClientError.HttpClientError, FileSystem.FileSystem | HttpClient.HttpClient | import("effect/Scope").Scope>;
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;AAGzE,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;AAItC,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,uLAK7B,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;;;;;;;;;;;;;;;;;;;;;;;;8KA2FnB,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"}
@@ -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.fail(new Error("No delivery data available"));
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
- yield* Effect.logDebug(`main APK of ${mainDeliveryData.downloadSize}bytes from ${mainDeliveryData.downloadUrl} with integrity ${mainDeliveryData.sha256}(sha256) downloaded to ${file}`);
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: mainDeliveryData.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
- yield* Effect.logDebug(`split ${split.name} of ${split.downloadSize}bytes from ${split.downloadUrl} with integrity ${split.sha256}(sha256) downloaded to ${file}`);
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: split.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
- yield* Effect.logDebug(`expansion file ${name} of ${expansion.size}bytes from ${expansion.downloadUrl} with integrity ${expansion.sha1}(sha1) downloaded to ${file}`);
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: expansion.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","fail","Error","main","gen","file","makeTempFileScoped","suffix","stream","downloadUrl","run","sink","logDebug","downloadSize","sha256","name","size","integrity","splits","splitDeliveryData","split","expansions","additionalFile","expansion","typeStr","fileType","sha1","all"],"sources":["../src/GooglePlayApi.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
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":"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","ignoreList":[]}
@@ -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;AAAA;AAE9E;AACAR,MAAM,CAACS,EAAE,CAAC,eAAe,CAAC,CAAC,WACvBC,OAA4C,EAC5CC,WAAwB,EACxBC,IAA4C,EAC5CC,OAA0D;EAE1D,MAAMC,WAAW,GAAGH,WAAW,CAACI,IAAI;EACpC,OAAOf,MAAM,CAACgB,mBAAmB,CAAC,aAAa,EAAEF,WAAW,CAAC;EAE7D,MAAMG,KAAK,GAAG,OAAOjB,MAAM,CAACkB,GAAG,CAAC;IAC5BA,GAAG,EAAEA,CAAA,KACDtB,QAAQ,CAACuB,QAAQ,CACbR,WAAW,EACXf,QAAQ,CAACwB,MAAM,CAACT,WAAW,EAAEC,IAAI,CAAC,EAClCC,OAAO,IAAI;MAAEQ,kBAAkB,EAAE;IAAI,CAAE,CAC1C;IACLC,KAAK,EAAGC,KAAK,IACT,IAAI1B,eAAe,CAAC2B,YAAY,CAAC;MAC7BD,KAAK;MACLb,OAAO;MACPe,MAAM,EAAE,QAAQ;MAChBd,WAAW,EAAE,oCAAoCG,WAAW;KAC/D;GACR,CAAC;EAEF,MAAMY,SAAS,GAAG5B,iBAAiB,CAAC6B,cAAc,CAACV,KAAK,EAAE,wBAAwB,CAAC;EACnF,OAAOS,SAAS,CAAChB,OAAO,CAAC;AAC7B,CAAC,CAAC,CACL;AAED;AACA,OAAO,MAAMkB,cAAc,gBAAG3B,QAAQ,CAACI,IAAI;AAevC;AACCC,UAAU,IAAKJ,SAAS,CAACK,WAAW,CAACD,UAAU,CAAC,CAAC,CAAC,EAAEP,kBAAkB,CAACS,MAAM,CAAC;AAAA;AAE/E;AACAR,MAAM,CAACS,EAAE,CAAC,gBAAgB,CAAC,CAAC,WACxBoB,QAA+C,EAC/CC,mBAAyB,EACzBjB,OAAyD;EAEzD,MAAMC,WAAW,GAAGgB,mBAAmB,CAACf,IAAI;EAC5C,OAAOf,MAAM,CAACgB,mBAAmB,CAAC,aAAa,EAAEF,WAAW,CAAC;EAC7D,MAAMiB,WAAW,GAAG,OAAOF,QAAQ,CAACE,WAAW;EAE/C,MAAMC,OAAO,GAAG,OAAOhC,MAAM,CAACkB,GAAG,CAAC;IAC9BA,GAAG,EAAEA,CAAA,KACDtB,QAAQ,CAACqC,UAAU,CACfH,mBAAmB,EACnB,IAAII,UAAU,CAACH,WAAW,CAAC,EAC3BlB,OAAO,IAAI;MAAEsB,iBAAiB,EAAE;IAAI,CAAE,CACzC;IACLb,KAAK,EAAGC,KAAK,IACT,IAAI1B,eAAe,CAACuC,aAAa,CAAC;MAC9Bb,KAAK;MACLM,QAAQ;MACRJ,MAAM,EAAE,QAAQ;MAChBf,OAAO,EAAEmB,QAAQ,CAACnB,OAAO;MACzBC,WAAW,EAAE,oCAAoCG,WAAW;KAC/D;GACR,CAAC;EAEF,IAAIZ,SAAS,CAACmC,WAAW,CAACL,OAAO,CAAC,EAAE;IAChC,OAAO,OAAO,IAAInC,eAAe,CAACuC,aAAa,CAAC;MAC5CP,QAAQ;MACRJ,MAAM,EAAE,QAAQ;MAChBf,OAAO,EAAEmB,QAAQ,CAACnB,OAAO;MACzBC,WAAW,EAAE,mBAAmBG,WAAW;KAC9C,CAAC;EACN;EAEA,OAAOkB,OAA0D;AACrE,CAAC,CAAC,CACL;AAED;AACA,OAAO,MAAMM,iCAAiC,gBAAGrC,QAAQ,CAACI,IAAI;AAiC1D;AACCC,UAAU,IAAKJ,SAAS,CAACK,WAAW,CAACD,UAAU,CAAC,CAAC,CAAC,EAAEP,kBAAkB,CAACS,MAAM,CAAC;AAAA;AAE/E;AACAR,MAAM,CAACS,EAAE,CAAC,gBAAgB,CAAC,CAAC,WAMxBoB,QAA+C,EAC/CU,cAA8B,EAC9B1B,OAAyD;EAGzD,MAAM2B,eAAe,GAAG,OAAOZ,cAAc,CAACC,QAAQ,EAAE1B,qBAAqB,EAAEU,OAAO,CAAC;EAEvF,IAAIX,SAAS,CAACuC,cAAc,CAACD,eAAe,CAACE,QAAQ,EAAEC,mBAAmB,CAAC,EAAE;IACzE,OAAO,OAAO,IAAI9C,eAAe,CAACuC,aAAa,CAAC;MAC5CP,QAAQ;MACRJ,MAAM,EAAE,QAAQ;MAChBf,OAAO,EAAEmB,QAAQ,CAACnB,OAAO;MACzBC,WAAW,EAAE6B,eAAe,CAACE,QAAQ,CAACC;KACzC,CAAC;EACN;EAEA,MAAMC,SAAS,GAAGJ,eAAe,CAACK,OAAO,GAAGN,cAAc,CAAC;EAC3D,IAAIrC,SAAS,CAACmC,WAAW,CAACO,SAAS,CAAC,EAAE;IAClC,OAAO,OAAO,IAAI/C,eAAe,CAACuC,aAAa,CAAC;MAC5CP,QAAQ;MACRJ,MAAM,EAAE,QAAQ;MAChBf,OAAO,EAAEmB,QAAQ,CAACnB,OAAO;MACzBC,WAAW,EAAE,0CAA0C4B,cAAc;KACxE,CAAC;EACN;EAEA,OAAOK,SAAgB;AAC3B,CAAC,CAAC,CACL","ignoreList":[]}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@efffrida/gplayapi",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Google play api",
5
5
  "keywords": [
6
6
  "frida.re",
@@ -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.js";
28
- import { makeHttpClient } from "./internal/auth.js";
29
- import { Device } from "./internal/device.js";
30
- import { decodeResponseFromResponseWrapper, encodeRequest } from "./internal/http.js";
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.js";
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.fail(new Error("No delivery data available"));
173
+ return yield* Effect.dieMessage("No delivery data available");
160
174
  }
161
175
 
162
- type Result = {
163
- url: string;
164
- name: string;
165
- file: string;
166
- size: number | bigint;
167
- integrity: { sha1: string } | { sha256: string };
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(stream, fileSystem.sink(file));
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 ${mainDeliveryData.sha256}(sha256) downloaded to ${file}`
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: mainDeliveryData.sha256 },
186
- } satisfies Result;
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(stream, fileSystem.sink(file));
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 ${split.sha256}(sha256) downloaded to ${file}`
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: split.sha256 },
206
- } satisfies Result;
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(stream, fileSystem.sink(file));
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 ${expansion.sha1}(sha1) downloaded to ${file}`
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: expansion.sha1 },
229
- } satisfies Result;
281
+ integrity: { sha1: integrity },
282
+ };
230
283
  })
231
284
  );
232
285
 
@@ -13,9 +13,9 @@ import {
13
13
  AndroidCheckinRequestSchema,
14
14
  AndroidCheckinResponseSchema,
15
15
  UploadDeviceConfigRequestSchema,
16
- } from "../generated/GooglePlay_pb.js";
17
- import { type Device } from "./device.js";
18
- import { decodeResponse, decodeResponseFromResponseWrapper, encodeRequest } from "./http.js";
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: (
@@ -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.js";
9
+ import { type PayloadSchema, ResponseWrapperSchema } from "../generated/GooglePlay_pb.ts";
10
10
 
11
11
  /** @internal */
12
12
  export const encodeRequest = Function.dual<