@lbr77/anisette-js 0.1.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.
- package/dist/anisette.d.ts +44 -0
- package/dist/anisette.d.ts.map +1 -0
- package/dist/anisette.js +208 -0
- package/dist/anisette.js.map +1 -0
- package/dist/anisette_rs.js +5782 -0
- package/dist/anisette_rs.node.js +5452 -0
- package/dist/browser.d.ts +10 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +18 -0
- package/dist/browser.js.map +1 -0
- package/dist/device.d.ts +14 -0
- package/dist/device.d.ts.map +1 -0
- package/dist/device.js +54 -0
- package/dist/device.js.map +1 -0
- package/dist/http.d.ts +9 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +18 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/library.d.ts +12 -0
- package/dist/library.d.ts.map +1 -0
- package/dist/library.js +30 -0
- package/dist/library.js.map +1 -0
- package/dist/provisioning.d.ts +14 -0
- package/dist/provisioning.d.ts.map +1 -0
- package/dist/provisioning.js +128 -0
- package/dist/provisioning.js.map +1 -0
- package/dist/types.d.ts +44 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/unified-wasm-loader.d.ts +47 -0
- package/dist/unified-wasm-loader.d.ts.map +1 -0
- package/dist/unified-wasm-loader.js +77 -0
- package/dist/unified-wasm-loader.js.map +1 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +84 -0
- package/dist/utils.js.map +1 -0
- package/dist/wasm-bridge.d.ts +69 -0
- package/dist/wasm-bridge.d.ts.map +1 -0
- package/dist/wasm-bridge.js +256 -0
- package/dist/wasm-bridge.js.map +1 -0
- package/dist/wasm-loader.d.ts +40 -0
- package/dist/wasm-loader.d.ts.map +1 -0
- package/dist/wasm-loader.js +75 -0
- package/dist/wasm-loader.js.map +1 -0
- package/package.json +38 -0
- package/src/anisette_rs.js +5782 -0
- package/src/anisette_rs.node.js +5452 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AnisetteHeaders, InitOptions } from "./types.js";
|
|
2
|
+
import type { HttpClient } from "./http.js";
|
|
3
|
+
import { Device } from "./device.js";
|
|
4
|
+
export interface AnisetteOptions {
|
|
5
|
+
/** Override the HTTP client (useful for testing or custom proxy) */
|
|
6
|
+
httpClient?: HttpClient;
|
|
7
|
+
/** DSID to use when requesting OTP (default: -2) */
|
|
8
|
+
dsid?: bigint;
|
|
9
|
+
/** Options passed to WASM init */
|
|
10
|
+
init?: InitOptions;
|
|
11
|
+
}
|
|
12
|
+
export declare class Anisette {
|
|
13
|
+
private bridge;
|
|
14
|
+
private device;
|
|
15
|
+
private provisioning;
|
|
16
|
+
private dsid;
|
|
17
|
+
private provisioningPath;
|
|
18
|
+
private libraryPath;
|
|
19
|
+
private libs;
|
|
20
|
+
private wasmModule;
|
|
21
|
+
private identifier;
|
|
22
|
+
private httpClient;
|
|
23
|
+
private constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Initialize from the two Android .so library files.
|
|
26
|
+
* @param storeservicescore - bytes of libstoreservicescore.so
|
|
27
|
+
* @param coreadi - bytes of libCoreADI.so
|
|
28
|
+
*/
|
|
29
|
+
static fromSo(storeservicescore: Uint8Array, coreadi: Uint8Array, wasmModule: any, options?: AnisetteOptions): Promise<Anisette>;
|
|
30
|
+
private static _init;
|
|
31
|
+
/** Whether the device is currently provisioned. */
|
|
32
|
+
get isProvisioned(): boolean;
|
|
33
|
+
/** Run the provisioning flow against Apple servers. */
|
|
34
|
+
provision(): Promise<void>;
|
|
35
|
+
/** Read adi.pb from the WASM VFS for persistence. */
|
|
36
|
+
getAdiPb(): Uint8Array;
|
|
37
|
+
/** Generate Anisette headers. Throws if not provisioned. */
|
|
38
|
+
getData(): Promise<AnisetteHeaders>;
|
|
39
|
+
/** Serialize device.json bytes for persistence. */
|
|
40
|
+
getDeviceJson(): Uint8Array;
|
|
41
|
+
/** Expose the device for inspection. */
|
|
42
|
+
getDevice(): Device;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=anisette.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anisette.d.ts","sourceRoot":"","sources":["../src/anisette.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAerC,MAAM,WAAW,eAAe;IAC9B,oEAAoE;IACpE,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,IAAI,CAAe;IAE3B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAyB;IAE3C,OAAO;IA2BP;;;;OAIG;WACU,MAAM,CACjB,iBAAiB,EAAE,UAAU,EAC7B,OAAO,EAAE,UAAU,EAEnB,UAAU,EAAE,GAAG,EACf,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,QAAQ,CAAC;mBAMC,KAAK;IAwD1B,mDAAmD;IACnD,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,uDAAuD;IACjD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,qDAAqD;IACrD,QAAQ,IAAI,UAAU;IAItB,4DAA4D;IACtD,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAoDzC,mDAAmD;IACnD,aAAa,IAAI,UAAU;IAI3B,wCAAwC;IACxC,SAAS,IAAI,MAAM;CAGpB"}
|
package/dist/anisette.js
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
// Main Anisette class — the public-facing API
|
|
2
|
+
import { WasmBridge } from "./wasm-bridge.js";
|
|
3
|
+
import { Device } from "./device.js";
|
|
4
|
+
import { LibraryStore } from "./library.js";
|
|
5
|
+
import { ProvisioningSession } from "./provisioning.js";
|
|
6
|
+
import { toBase64, toAppleClientTime, detectLocale, encodeUtf8, decodeUtf8, } from "./utils.js";
|
|
7
|
+
const DEFAULT_DSID = BigInt(-2);
|
|
8
|
+
const DEFAULT_LIBRARY_PATH = "./anisette/";
|
|
9
|
+
const MD_RINFO = "17106176";
|
|
10
|
+
export class Anisette {
|
|
11
|
+
bridge;
|
|
12
|
+
device;
|
|
13
|
+
provisioning;
|
|
14
|
+
dsid;
|
|
15
|
+
provisioningPath;
|
|
16
|
+
libraryPath;
|
|
17
|
+
libs;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
+
wasmModule;
|
|
20
|
+
identifier;
|
|
21
|
+
httpClient;
|
|
22
|
+
constructor(bridge, device, provisioning, dsid, provisioningPath, libraryPath, libs,
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
wasmModule, identifier, httpClient) {
|
|
25
|
+
this.bridge = bridge;
|
|
26
|
+
this.device = device;
|
|
27
|
+
this.provisioning = provisioning;
|
|
28
|
+
this.dsid = dsid;
|
|
29
|
+
this.provisioningPath = provisioningPath;
|
|
30
|
+
this.libraryPath = libraryPath;
|
|
31
|
+
this.libs = libs;
|
|
32
|
+
this.wasmModule = wasmModule;
|
|
33
|
+
this.identifier = identifier;
|
|
34
|
+
this.httpClient = httpClient;
|
|
35
|
+
}
|
|
36
|
+
// ---- factory methods ----
|
|
37
|
+
/**
|
|
38
|
+
* Initialize from the two Android .so library files.
|
|
39
|
+
* @param storeservicescore - bytes of libstoreservicescore.so
|
|
40
|
+
* @param coreadi - bytes of libCoreADI.so
|
|
41
|
+
*/
|
|
42
|
+
static async fromSo(storeservicescore, coreadi,
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
wasmModule, options = {}) {
|
|
45
|
+
const libs = LibraryStore.fromBlobs(storeservicescore, coreadi);
|
|
46
|
+
return Anisette._init(libs, wasmModule, options);
|
|
47
|
+
}
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
static async _init(libs,
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
wasmModule, options) {
|
|
52
|
+
const bridge = new WasmBridge(wasmModule);
|
|
53
|
+
const initOpts = options.init ?? {};
|
|
54
|
+
const libraryPath = normalizeAdiPath(initOpts.libraryPath ?? DEFAULT_LIBRARY_PATH);
|
|
55
|
+
const provisioningPath = normalizeAdiPath(initOpts.provisioningPath ?? libraryPath);
|
|
56
|
+
const dsid = options.dsid ?? DEFAULT_DSID;
|
|
57
|
+
// Mount + load persisted IDBFS first so file state is stable before init.
|
|
58
|
+
mountIdbfsPaths(bridge, libraryPath, provisioningPath);
|
|
59
|
+
try {
|
|
60
|
+
await bridge.syncIdbfsFromStorage();
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Ignore errors - might be first run with no existing data
|
|
64
|
+
}
|
|
65
|
+
// Load device config from explicit bytes first, then from persisted VFS.
|
|
66
|
+
const savedDeviceJson = parseDeviceJsonBytes(initOpts.deviceJsonBytes) ??
|
|
67
|
+
readDeviceJsonFromVfs(bridge, joinPath(libraryPath, "device.json"));
|
|
68
|
+
const device = Device.fromJson(savedDeviceJson, initOpts.deviceConfig);
|
|
69
|
+
const identifier = initOpts.identifier ?? device.adiIdentifier;
|
|
70
|
+
// Restore explicit adi.pb into VFS if provided.
|
|
71
|
+
if (initOpts.adiPb) {
|
|
72
|
+
bridge.writeVirtualFile(joinPath(provisioningPath, "adi.pb"), initOpts.adiPb);
|
|
73
|
+
}
|
|
74
|
+
// Keep VFS device.json consistent with the active in-memory device.
|
|
75
|
+
const deviceJsonBytes = initOpts.deviceJsonBytes ?? encodeUtf8(JSON.stringify(device.toJson(), null, 2));
|
|
76
|
+
bridge.writeVirtualFile(joinPath(libraryPath, "device.json"), deviceJsonBytes);
|
|
77
|
+
// Initialize WASM ADI
|
|
78
|
+
bridge.initFromBlobs(libs.storeservicescore, libs.coreadi, libraryPath, provisioningPath, identifier);
|
|
79
|
+
const provisioning = new ProvisioningSession(bridge, device, options.httpClient);
|
|
80
|
+
return new Anisette(bridge, device, provisioning, dsid, provisioningPath, libraryPath, libs, wasmModule, identifier, options.httpClient);
|
|
81
|
+
}
|
|
82
|
+
// ---- public API ----
|
|
83
|
+
/** Whether the device is currently provisioned. */
|
|
84
|
+
get isProvisioned() {
|
|
85
|
+
return this.bridge.isMachineProvisioned(this.dsid);
|
|
86
|
+
}
|
|
87
|
+
/** Run the provisioning flow against Apple servers. */
|
|
88
|
+
async provision() {
|
|
89
|
+
await this.provisioning.provision(this.dsid);
|
|
90
|
+
// Sync provisioning state to IndexedDB (browser only)
|
|
91
|
+
if (this.bridge.isIdbfsAvailable()) {
|
|
92
|
+
try {
|
|
93
|
+
await this.bridge.syncIdbfsToStorage();
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
console.error("[anisette] Failed to sync to IDBFS:", err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Read adi.pb from the WASM VFS for persistence. */
|
|
101
|
+
getAdiPb() {
|
|
102
|
+
return this.bridge.readVirtualFile(joinPath(this.provisioningPath, "adi.pb"));
|
|
103
|
+
}
|
|
104
|
+
/** Generate Anisette headers. Throws if not provisioned. */
|
|
105
|
+
async getData() {
|
|
106
|
+
// Reinit WASM state before each call to avoid emulator corruption on repeated use
|
|
107
|
+
const adiPb = readOptionalFile(this.bridge, joinPath(this.provisioningPath, "adi.pb"));
|
|
108
|
+
const deviceJsonBytes = encodeUtf8(JSON.stringify(this.device.toJson(), null, 2));
|
|
109
|
+
this.bridge = new WasmBridge(this.wasmModule);
|
|
110
|
+
// Mount + load persisted IDBFS in browser environment
|
|
111
|
+
if (this.bridge.isIdbfsAvailable()) {
|
|
112
|
+
mountIdbfsPaths(this.bridge, this.libraryPath, this.provisioningPath);
|
|
113
|
+
try {
|
|
114
|
+
await this.bridge.syncIdbfsFromStorage();
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// Ignore errors - might be first run or no existing data
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if (adiPb) {
|
|
121
|
+
this.bridge.writeVirtualFile(joinPath(this.provisioningPath, "adi.pb"), adiPb);
|
|
122
|
+
}
|
|
123
|
+
this.bridge.writeVirtualFile(joinPath(this.libraryPath, "device.json"), deviceJsonBytes);
|
|
124
|
+
this.bridge.initFromBlobs(this.libs.storeservicescore, this.libs.coreadi, this.libraryPath, this.provisioningPath, this.identifier);
|
|
125
|
+
this.provisioning = new ProvisioningSession(this.bridge, this.device, this.httpClient);
|
|
126
|
+
const { otp, machineId } = this.bridge.requestOtp(this.dsid);
|
|
127
|
+
const now = new Date();
|
|
128
|
+
const tzOffset = -now.getTimezoneOffset();
|
|
129
|
+
const tzSign = tzOffset >= 0 ? "+" : "-";
|
|
130
|
+
const tzHours = String(Math.floor(Math.abs(tzOffset) / 60)).padStart(2, "0");
|
|
131
|
+
const tzMins = String(Math.abs(tzOffset) % 60).padStart(2, "0");
|
|
132
|
+
const timezone = `${tzSign}${tzHours}${tzMins}`;
|
|
133
|
+
return {
|
|
134
|
+
"X-Apple-I-Client-Time": toAppleClientTime(now),
|
|
135
|
+
"X-Apple-I-MD": toBase64(otp),
|
|
136
|
+
"X-Apple-I-MD-LU": this.device.localUserUuid,
|
|
137
|
+
"X-Apple-I-MD-M": toBase64(machineId),
|
|
138
|
+
"X-Apple-I-MD-RINFO": MD_RINFO,
|
|
139
|
+
"X-Apple-I-SRL-NO": "0",
|
|
140
|
+
"X-Apple-I-TimeZone": timezone,
|
|
141
|
+
"X-Apple-Locale": detectLocale(),
|
|
142
|
+
"X-MMe-Client-Info": this.device.serverFriendlyDescription,
|
|
143
|
+
"X-Mme-Device-Id": this.device.uniqueDeviceIdentifier,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** Serialize device.json bytes for persistence. */
|
|
147
|
+
getDeviceJson() {
|
|
148
|
+
return encodeUtf8(JSON.stringify(this.device.toJson(), null, 2));
|
|
149
|
+
}
|
|
150
|
+
/** Expose the device for inspection. */
|
|
151
|
+
getDevice() {
|
|
152
|
+
return this.device;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function joinPath(base, file) {
|
|
156
|
+
const b = base.endsWith("/") ? base : `${base}/`;
|
|
157
|
+
return `${b}${file}`;
|
|
158
|
+
}
|
|
159
|
+
function normalizeAdiPath(path) {
|
|
160
|
+
const trimmed = path.trim().replace(/\\/g, "/");
|
|
161
|
+
if (!trimmed || trimmed === "." || trimmed === "./" || trimmed === "/") {
|
|
162
|
+
return "./";
|
|
163
|
+
}
|
|
164
|
+
const noTrail = trimmed.replace(/\/+$/, "");
|
|
165
|
+
if (!noTrail || noTrail === ".") {
|
|
166
|
+
return "./";
|
|
167
|
+
}
|
|
168
|
+
if (noTrail.startsWith("./") || noTrail.startsWith("../")) {
|
|
169
|
+
return `${noTrail}/`;
|
|
170
|
+
}
|
|
171
|
+
if (noTrail.startsWith("/")) {
|
|
172
|
+
return `.${noTrail}/`;
|
|
173
|
+
}
|
|
174
|
+
return `./${noTrail}/`;
|
|
175
|
+
}
|
|
176
|
+
function mountIdbfsPaths(bridge, libraryPath, provisioningPath) {
|
|
177
|
+
const paths = new Set([libraryPath, provisioningPath]);
|
|
178
|
+
for (const path of paths) {
|
|
179
|
+
bridge.initIdbfs(path);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function readOptionalFile(bridge, path) {
|
|
183
|
+
try {
|
|
184
|
+
return bridge.readVirtualFile(path);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function parseDeviceJsonBytes(bytes) {
|
|
191
|
+
if (!bytes) {
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
return JSON.parse(decodeUtf8(bytes));
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function readDeviceJsonFromVfs(bridge, path) {
|
|
202
|
+
const bytes = readOptionalFile(bridge, path);
|
|
203
|
+
if (!bytes) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
return parseDeviceJsonBytes(bytes);
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=anisette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anisette.js","sourceRoot":"","sources":["../src/anisette.ts"],"names":[],"mappings":"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"}
|