macbid-ts-api 1.0.0-beta.0 → 1.0.0-beta.3
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/MacBid.d.ts +10 -1
- package/MacBid.d.ts.map +1 -1
- package/MacBid.js +75 -5
- package/MacBid.js.map +1 -1
- package/MacBid.ts +85 -5
- package/package.json +1 -1
package/MacBid.d.ts
CHANGED
|
@@ -64,7 +64,8 @@ export declare class MacBid {
|
|
|
64
64
|
API_ROOT: string;
|
|
65
65
|
private macbid_session_headers;
|
|
66
66
|
private auth_info;
|
|
67
|
-
|
|
67
|
+
private tokenFilePath?;
|
|
68
|
+
constructor(auth_info: AuthInfo, tokenFilePath?: string);
|
|
68
69
|
authenticate: () => Promise<void>;
|
|
69
70
|
get: (path: string) => Promise<MacBidApiResponse>;
|
|
70
71
|
post: (path: string, options?: RequestInit) => Promise<MacBidApiResponse>;
|
|
@@ -100,6 +101,14 @@ export declare class MacBid {
|
|
|
100
101
|
* Returns the logged in user's favorites, and all of their (visible) attributes.
|
|
101
102
|
*/
|
|
102
103
|
get_watchlist: () => Promise<WatchlistFull[]>;
|
|
104
|
+
/**
|
|
105
|
+
* Save tokens to file for persistence across restarts
|
|
106
|
+
*/
|
|
107
|
+
private saveTokens;
|
|
108
|
+
/**
|
|
109
|
+
* Load tokens from file
|
|
110
|
+
*/
|
|
111
|
+
static loadTokens: (tokenFilePath: string) => Promise<Partial<AuthInfo> | null>;
|
|
103
112
|
}
|
|
104
113
|
export default MacBid;
|
|
105
114
|
//# sourceMappingURL=MacBid.d.ts.map
|
package/MacBid.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MacBid.d.ts","sourceRoot":"","sources":["MacBid.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"MacBid.d.ts","sourceRoot":"","sources":["MacBid.ts"],"names":[],"mappings":"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"}
|
package/MacBid.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fetch from "node-fetch";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
2
3
|
export var AuctionType;
|
|
3
4
|
(function (AuctionType) {
|
|
4
5
|
AuctionType["Pallet"] = "pallet";
|
|
@@ -17,24 +18,48 @@ export class MacBid {
|
|
|
17
18
|
"Content-Type": "application/json",
|
|
18
19
|
};
|
|
19
20
|
auth_info;
|
|
20
|
-
|
|
21
|
+
tokenFilePath;
|
|
22
|
+
constructor(auth_info, tokenFilePath) {
|
|
21
23
|
this.auth_info = auth_info;
|
|
24
|
+
this.tokenFilePath = tokenFilePath;
|
|
22
25
|
this.authenticate();
|
|
23
26
|
}
|
|
24
27
|
authenticate = async () => {
|
|
25
28
|
if (this.auth_info) {
|
|
29
|
+
// If we have a token, use it (will be auto-refreshed if expired)
|
|
26
30
|
if (this.auth_info.token) {
|
|
27
31
|
this.macbid_session_headers["Authorization"] = this.auth_info
|
|
28
32
|
.token;
|
|
33
|
+
console.log("Using existing access token");
|
|
34
|
+
// Token will be auto-refreshed by ensureValidToken if needed
|
|
35
|
+
return;
|
|
29
36
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
// If we have a refresh token but no access token, try to refresh first
|
|
38
|
+
if (this.auth_info.refresh_token) {
|
|
39
|
+
if (this.isRefreshTokenExpired()) {
|
|
40
|
+
console.log("Refresh token has expired, need to login");
|
|
33
41
|
}
|
|
34
42
|
else {
|
|
35
|
-
|
|
43
|
+
console.log("No access token, attempting to refresh using refresh token");
|
|
44
|
+
try {
|
|
45
|
+
await this.refreshToken();
|
|
46
|
+
console.log("Successfully refreshed token");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// If refresh fails, fall through to login
|
|
51
|
+
console.warn("Failed to refresh token, attempting login:", error);
|
|
52
|
+
}
|
|
36
53
|
}
|
|
37
54
|
}
|
|
55
|
+
// No valid tokens, need to login
|
|
56
|
+
if (this.auth_info.email && this.auth_info.password) {
|
|
57
|
+
console.log("No valid tokens found, attempting login");
|
|
58
|
+
await this.login(this.auth_info.email, this.auth_info.password);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw new Error("Invalid auth_info");
|
|
62
|
+
}
|
|
38
63
|
}
|
|
39
64
|
};
|
|
40
65
|
get = async (path) => {
|
|
@@ -121,6 +146,7 @@ export class MacBid {
|
|
|
121
146
|
this.auth_info.token_expiration = new Date(expires * 1000);
|
|
122
147
|
this.auth_info.refresh_token = refresh_token;
|
|
123
148
|
this.auth_info.refresh_token_expiration = new Date(expiration_refresh * 1000);
|
|
149
|
+
await this.saveTokens();
|
|
124
150
|
return true;
|
|
125
151
|
}
|
|
126
152
|
}
|
|
@@ -196,6 +222,7 @@ export class MacBid {
|
|
|
196
222
|
if (expiration_refresh) {
|
|
197
223
|
this.auth_info.refresh_token_expiration = new Date(expiration_refresh * 1000);
|
|
198
224
|
}
|
|
225
|
+
await this.saveTokens();
|
|
199
226
|
return true;
|
|
200
227
|
}
|
|
201
228
|
else {
|
|
@@ -218,6 +245,49 @@ export class MacBid {
|
|
|
218
245
|
const res = await this.get(`/auctions/customer/${this.auth_info["user_id"]}/active-auctions`);
|
|
219
246
|
return (await res.json())["watchlist_full"];
|
|
220
247
|
};
|
|
248
|
+
/**
|
|
249
|
+
* Save tokens to file for persistence across restarts
|
|
250
|
+
*/
|
|
251
|
+
saveTokens = async () => {
|
|
252
|
+
if (!this.tokenFilePath) {
|
|
253
|
+
console.log("No token file path provided, skipping token save");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
try {
|
|
257
|
+
const tokenData = {
|
|
258
|
+
token: this.auth_info.token,
|
|
259
|
+
refresh_token: this.auth_info.refresh_token,
|
|
260
|
+
token_expiration: this.auth_info.token_expiration?.toISOString(),
|
|
261
|
+
refresh_token_expiration: this.auth_info.refresh_token_expiration?.toISOString(),
|
|
262
|
+
user_id: this.auth_info.user_id,
|
|
263
|
+
};
|
|
264
|
+
await fs.writeFile(this.tokenFilePath, JSON.stringify(tokenData, null, 2), "utf-8");
|
|
265
|
+
console.log("Tokens saved to file:", this.tokenFilePath);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
console.warn("Failed to save tokens:", error);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
/**
|
|
272
|
+
* Load tokens from file
|
|
273
|
+
*/
|
|
274
|
+
static loadTokens = async (tokenFilePath) => {
|
|
275
|
+
try {
|
|
276
|
+
const data = await fs.readFile(tokenFilePath, "utf-8");
|
|
277
|
+
const tokenData = JSON.parse(data);
|
|
278
|
+
return {
|
|
279
|
+
token: tokenData.token,
|
|
280
|
+
refresh_token: tokenData.refresh_token,
|
|
281
|
+
token_expiration: tokenData.token_expiration ? new Date(tokenData.token_expiration) : undefined,
|
|
282
|
+
refresh_token_expiration: tokenData.refresh_token_expiration ? new Date(tokenData.refresh_token_expiration) : undefined,
|
|
283
|
+
user_id: tokenData.user_id,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
// File doesn't exist or is invalid, return null
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
221
291
|
}
|
|
222
292
|
export default MacBid;
|
|
223
293
|
//# sourceMappingURL=MacBid.js.map
|
package/MacBid.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MacBid.js","sourceRoot":"","sources":["MacBid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"MacBid.js","sourceRoot":"","sources":["MacBid.ts"],"names":[],"mappings":"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"}
|
package/MacBid.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import fetch, { Response } from "node-fetch";
|
|
2
|
+
import { promises as fs } from "node:fs";
|
|
2
3
|
|
|
3
4
|
export interface AuthInfo {
|
|
4
5
|
email?: string;
|
|
@@ -73,24 +74,49 @@ export class MacBid {
|
|
|
73
74
|
"Content-Type": "application/json",
|
|
74
75
|
};
|
|
75
76
|
private auth_info: AuthInfo;
|
|
77
|
+
private tokenFilePath?: string;
|
|
76
78
|
|
|
77
|
-
constructor(auth_info: AuthInfo) {
|
|
79
|
+
constructor(auth_info: AuthInfo, tokenFilePath?: string) {
|
|
78
80
|
this.auth_info = auth_info;
|
|
81
|
+
this.tokenFilePath = tokenFilePath;
|
|
79
82
|
this.authenticate();
|
|
80
83
|
}
|
|
81
84
|
|
|
82
85
|
public authenticate = async () => {
|
|
83
86
|
if (this.auth_info) {
|
|
87
|
+
// If we have a token, use it (will be auto-refreshed if expired)
|
|
84
88
|
if (this.auth_info.token) {
|
|
85
89
|
this.macbid_session_headers["Authorization"] = this.auth_info
|
|
86
90
|
.token as string;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
console.log("Using existing access token");
|
|
92
|
+
// Token will be auto-refreshed by ensureValidToken if needed
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// If we have a refresh token but no access token, try to refresh first
|
|
97
|
+
if (this.auth_info.refresh_token) {
|
|
98
|
+
if (this.isRefreshTokenExpired()) {
|
|
99
|
+
console.log("Refresh token has expired, need to login");
|
|
90
100
|
} else {
|
|
91
|
-
|
|
101
|
+
console.log("No access token, attempting to refresh using refresh token");
|
|
102
|
+
try {
|
|
103
|
+
await this.refreshToken();
|
|
104
|
+
console.log("Successfully refreshed token");
|
|
105
|
+
return;
|
|
106
|
+
} catch (error) {
|
|
107
|
+
// If refresh fails, fall through to login
|
|
108
|
+
console.warn("Failed to refresh token, attempting login:", error);
|
|
109
|
+
}
|
|
92
110
|
}
|
|
93
111
|
}
|
|
112
|
+
|
|
113
|
+
// No valid tokens, need to login
|
|
114
|
+
if (this.auth_info.email && this.auth_info.password) {
|
|
115
|
+
console.log("No valid tokens found, attempting login");
|
|
116
|
+
await this.login(this.auth_info.email, this.auth_info.password);
|
|
117
|
+
} else {
|
|
118
|
+
throw new Error("Invalid auth_info");
|
|
119
|
+
}
|
|
94
120
|
}
|
|
95
121
|
};
|
|
96
122
|
|
|
@@ -199,6 +225,7 @@ export class MacBid {
|
|
|
199
225
|
this.auth_info.token_expiration = new Date(expires * 1000);
|
|
200
226
|
this.auth_info.refresh_token = refresh_token;
|
|
201
227
|
this.auth_info.refresh_token_expiration = new Date(expiration_refresh * 1000);
|
|
228
|
+
await this.saveTokens();
|
|
202
229
|
return true;
|
|
203
230
|
}
|
|
204
231
|
}
|
|
@@ -292,6 +319,7 @@ export class MacBid {
|
|
|
292
319
|
this.auth_info.refresh_token_expiration = new Date(expiration_refresh * 1000);
|
|
293
320
|
}
|
|
294
321
|
|
|
322
|
+
await this.saveTokens();
|
|
295
323
|
return true;
|
|
296
324
|
} else {
|
|
297
325
|
throw new Error("Failed to refresh token: no access token in response");
|
|
@@ -318,6 +346,58 @@ export class MacBid {
|
|
|
318
346
|
|
|
319
347
|
return (await res.json())["watchlist_full"] as WatchlistFull[];
|
|
320
348
|
};
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Save tokens to file for persistence across restarts
|
|
352
|
+
*/
|
|
353
|
+
private saveTokens = async (): Promise<void> => {
|
|
354
|
+
if (!this.tokenFilePath) {
|
|
355
|
+
console.log("No token file path provided, skipping token save");
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
try {
|
|
360
|
+
const tokenData = {
|
|
361
|
+
token: this.auth_info.token,
|
|
362
|
+
refresh_token: this.auth_info.refresh_token,
|
|
363
|
+
token_expiration: this.auth_info.token_expiration?.toISOString(),
|
|
364
|
+
refresh_token_expiration: this.auth_info.refresh_token_expiration?.toISOString(),
|
|
365
|
+
user_id: this.auth_info.user_id,
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
await fs.writeFile(this.tokenFilePath, JSON.stringify(tokenData, null, 2), "utf-8");
|
|
369
|
+
console.log("Tokens saved to file:", this.tokenFilePath);
|
|
370
|
+
} catch (error) {
|
|
371
|
+
console.warn("Failed to save tokens:", error);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Load tokens from file
|
|
377
|
+
*/
|
|
378
|
+
public static loadTokens = async (tokenFilePath: string): Promise<Partial<AuthInfo> | null> => {
|
|
379
|
+
try {
|
|
380
|
+
const data = await fs.readFile(tokenFilePath, "utf-8");
|
|
381
|
+
const tokenData = JSON.parse(data) as {
|
|
382
|
+
token?: string;
|
|
383
|
+
refresh_token?: string;
|
|
384
|
+
token_expiration?: string;
|
|
385
|
+
refresh_token_expiration?: string;
|
|
386
|
+
user_id?: string;
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
return {
|
|
390
|
+
token: tokenData.token,
|
|
391
|
+
refresh_token: tokenData.refresh_token,
|
|
392
|
+
token_expiration: tokenData.token_expiration ? new Date(tokenData.token_expiration) : undefined,
|
|
393
|
+
refresh_token_expiration: tokenData.refresh_token_expiration ? new Date(tokenData.refresh_token_expiration) : undefined,
|
|
394
|
+
user_id: tokenData.user_id,
|
|
395
|
+
};
|
|
396
|
+
} catch (error) {
|
|
397
|
+
// File doesn't exist or is invalid, return null
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
};
|
|
321
401
|
}
|
|
322
402
|
|
|
323
403
|
export default MacBid;
|