sliftutils 1.1.4 → 1.1.41
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/.claude/settings.local.json +7 -0
- package/.cursor/rules/api-calls.mdc +16 -0
- package/.cursor/rules/coding-styles.mdc +50 -0
- package/.cursor/rules/components.mdc +44 -0
- package/.cursor/rules/disk-collection.mdc +31 -0
- package/.cursor/rules/general-guidelines.mdc +11 -0
- package/.cursor/rules/mobx-state.mdc +33 -0
- package/.cursor/rules/styling-css.mdc +99 -0
- package/CLAUDE.md +211 -0
- package/builders/hotReload.ts +23 -20
- package/builders/setup.ts +2 -2
- package/dist/test.ts.cache +13 -0
- package/index.d.ts +167 -14
- package/misc/apiKeys.d.ts +1 -0
- package/misc/apiKeys.tsx +7 -3
- package/misc/dist/apiKeys.tsx.cache +145 -0
- package/misc/dist/openrouter.ts.cache +119 -0
- package/misc/dist/yaml.ts.cache +45 -0
- package/misc/dist/yamlBase.ts.cache +2406 -0
- package/misc/getSecret.d.ts +1 -0
- package/misc/getSecret.ts +7 -0
- package/misc/https/httpsCerts.d.ts +17 -0
- package/misc/https/httpsCerts.ts +4 -4
- package/misc/openrouter.d.ts +1 -0
- package/misc/openrouter.ts +32 -4
- package/misc/zip.d.ts +2 -12
- package/misc/zip.ts +2 -97
- package/package.json +4 -3
- package/render-utils/InputLabel.d.ts +1 -2
- package/render-utils/InputLabel.tsx +1 -1
- package/render-utils/autoMeasure.d.ts +1 -0
- package/render-utils/autoMeasure.ts +43 -0
- package/render-utils/dist/Input.tsx.cache +319 -0
- package/render-utils/dist/InputLabel.tsx.cache +220 -0
- package/render-utils/dist/modal.tsx.cache +69 -0
- package/render-utils/dist/observer.tsx.cache +6 -3
- package/render-utils/modal.tsx +1 -1
- package/storage/DiskCollection.d.ts +17 -0
- package/storage/DiskCollection.ts +57 -5
- package/storage/FileFolderAPI.d.ts +3 -0
- package/storage/FileFolderAPI.tsx +104 -36
- package/storage/IStorage.d.ts +4 -0
- package/storage/IStorage.ts +3 -0
- package/storage/IndexedDBFileFolderAPI.ts +6 -0
- package/storage/PrivateFileSystemStorage.d.ts +4 -0
- package/storage/PrivateFileSystemStorage.ts +11 -0
- package/storage/StorageObservable.d.ts +4 -0
- package/storage/StorageObservable.ts +27 -2
- package/storage/StorageObservableAsync.d.ts +2 -0
- package/storage/StorageObservableAsync.ts +20 -0
- package/storage/backblaze.d.ts +97 -0
- package/storage/backblaze.ts +915 -0
- package/test.ts +10 -0
- package/yarn.lock +139 -4
- package/.cursorrules +0 -251
package/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ declare module "sliftutils/misc/apiKeys" {
|
|
|
14
14
|
getAllKeys(): string[];
|
|
15
15
|
get(key: string): Promise<string> | undefined;
|
|
16
16
|
};
|
|
17
|
+
export declare function setAPIKey(key: string, value: string): void;
|
|
17
18
|
export declare class ManageAPIKeys extends preact.Component {
|
|
18
19
|
render(): string;
|
|
19
20
|
}
|
|
@@ -54,6 +55,7 @@ declare module "sliftutils/misc/getSecret" {
|
|
|
54
55
|
getAllKeys(): string[];
|
|
55
56
|
get(key: string): Promise<string> | undefined;
|
|
56
57
|
};
|
|
58
|
+
export declare function setSecret(key: string, value: string): void;
|
|
57
59
|
|
|
58
60
|
}
|
|
59
61
|
|
|
@@ -155,6 +157,11 @@ declare module "sliftutils/misc/https/dns" {
|
|
|
155
157
|
}
|
|
156
158
|
|
|
157
159
|
declare module "sliftutils/misc/https/httpsCerts" {
|
|
160
|
+
/// <reference path="node-forge-ed25519.d.ts" />
|
|
161
|
+
/// <reference path="../../storage/storage.d.ts" />
|
|
162
|
+
/// <reference types="node" />
|
|
163
|
+
/// <reference types="node" />
|
|
164
|
+
import * as forge from "node-forge";
|
|
158
165
|
/** NOTE: We also generate the domain *.domain */
|
|
159
166
|
export declare const getHTTPSCert: {
|
|
160
167
|
(key: string): Promise<{
|
|
@@ -173,6 +180,18 @@ declare module "sliftutils/misc/https/httpsCerts" {
|
|
|
173
180
|
cert: string;
|
|
174
181
|
}> | undefined;
|
|
175
182
|
};
|
|
183
|
+
export declare const getAccountKey: (domain: string) => Promise<string>;
|
|
184
|
+
export declare function parseCert(PEMorDER: string | Buffer): forge.pki.Certificate;
|
|
185
|
+
export declare function normalizeCertToPEM(PEMorDER: string | Buffer): string;
|
|
186
|
+
export declare function generateCert(config: {
|
|
187
|
+
accountKey: string;
|
|
188
|
+
domain: string;
|
|
189
|
+
altDomains?: string[];
|
|
190
|
+
}): Promise<{
|
|
191
|
+
domains: string[];
|
|
192
|
+
key: string;
|
|
193
|
+
cert: string;
|
|
194
|
+
}>;
|
|
176
195
|
|
|
177
196
|
}
|
|
178
197
|
|
|
@@ -228,6 +247,7 @@ declare module "sliftutils/misc/openrouter" {
|
|
|
228
247
|
}[];
|
|
229
248
|
export declare function getTotalCost(): number;
|
|
230
249
|
type OpenRouterOptions = {
|
|
250
|
+
apiKey?: string;
|
|
231
251
|
provider?: {
|
|
232
252
|
sort?: "throughput" | "price" | "latency";
|
|
233
253
|
order?: string[];
|
|
@@ -291,18 +311,8 @@ declare module "sliftutils/misc/yamlBase" {
|
|
|
291
311
|
}
|
|
292
312
|
|
|
293
313
|
declare module "sliftutils/misc/zip" {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
import { MaybePromise } from "socket-function/src/types";
|
|
297
|
-
export declare class Zip {
|
|
298
|
-
static gzip(buffer: Buffer, level?: number): Promise<Buffer>;
|
|
299
|
-
static gunzip(buffer: Buffer): MaybePromise<Buffer>;
|
|
300
|
-
static gunzipAsyncBase(buffer: Buffer): Promise<Buffer>;
|
|
301
|
-
static gunzipUntracked(buffer: Buffer): Promise<Buffer>;
|
|
302
|
-
static gunzipSync(buffer: Buffer): Buffer;
|
|
303
|
-
private static gunzipUntrackedSync;
|
|
304
|
-
static gunzipBatch(buffers: Buffer[]): Promise<Buffer[]>;
|
|
305
|
-
}
|
|
314
|
+
import { Zip } from "socket-function/src/Zip";
|
|
315
|
+
export { Zip };
|
|
306
316
|
|
|
307
317
|
}
|
|
308
318
|
|
|
@@ -452,7 +462,7 @@ declare module "sliftutils/render-utils/Input" {
|
|
|
452
462
|
|
|
453
463
|
declare module "sliftutils/render-utils/InputLabel" {
|
|
454
464
|
import preact from "preact";
|
|
455
|
-
type InputProps = (preact.JSX.HTMLAttributes<HTMLInputElement> & {
|
|
465
|
+
export type InputProps = (preact.JSX.HTMLAttributes<HTMLInputElement> & {
|
|
456
466
|
/** ONLY throttles onChangeValue */
|
|
457
467
|
throttle?: number;
|
|
458
468
|
flavor?: "large" | "small" | "none";
|
|
@@ -512,7 +522,6 @@ declare module "sliftutils/render-utils/InputLabel" {
|
|
|
512
522
|
}> {
|
|
513
523
|
render(): preact.JSX.Element;
|
|
514
524
|
}
|
|
515
|
-
export {};
|
|
516
525
|
|
|
517
526
|
}
|
|
518
527
|
|
|
@@ -690,6 +699,11 @@ declare module "sliftutils/render-utils/asyncObservable" {
|
|
|
690
699
|
|
|
691
700
|
}
|
|
692
701
|
|
|
702
|
+
declare module "sliftutils/render-utils/autoMeasure" {
|
|
703
|
+
export declare function runAutoMeasure(): void;
|
|
704
|
+
|
|
705
|
+
}
|
|
706
|
+
|
|
693
707
|
declare module "sliftutils/render-utils/colors" {
|
|
694
708
|
export declare const redButton: string;
|
|
695
709
|
export declare const yellowButton: string;
|
|
@@ -802,6 +816,8 @@ declare module "sliftutils/storage/DiskCollection" {
|
|
|
802
816
|
export declare class DiskCollection<T> implements IStorageSync<T> {
|
|
803
817
|
private collectionName;
|
|
804
818
|
private config?;
|
|
819
|
+
static getForceNoPrompt(): boolean;
|
|
820
|
+
static setForceNoPrompt(forceNoPrompt: boolean): void;
|
|
805
821
|
constructor(collectionName: string, config?: {
|
|
806
822
|
writeDelay?: number | undefined;
|
|
807
823
|
cbor?: boolean | undefined;
|
|
@@ -863,6 +879,21 @@ declare module "sliftutils/storage/DiskCollection" {
|
|
|
863
879
|
} | undefined>;
|
|
864
880
|
reset(): Promise<void>;
|
|
865
881
|
}
|
|
882
|
+
export declare class DiskCollectionRawSynced {
|
|
883
|
+
private collectionName;
|
|
884
|
+
constructor(collectionName: string);
|
|
885
|
+
initStorage(): Promise<IStorage<Buffer>>;
|
|
886
|
+
private synced;
|
|
887
|
+
get(key: string): Buffer | undefined;
|
|
888
|
+
getPromise(key: string): Promise<Buffer | undefined>;
|
|
889
|
+
set(key: string, value: Buffer): void;
|
|
890
|
+
getKeys(): Promise<string[]>;
|
|
891
|
+
getInfo(key: string): Promise<{
|
|
892
|
+
size: number;
|
|
893
|
+
lastModified: number;
|
|
894
|
+
} | undefined>;
|
|
895
|
+
reset(): Promise<void>;
|
|
896
|
+
}
|
|
866
897
|
export declare class DiskCollectionRawBrowser {
|
|
867
898
|
private collectionName;
|
|
868
899
|
constructor(collectionName: string);
|
|
@@ -918,6 +949,9 @@ declare module "sliftutils/storage/FileFolderAPI" {
|
|
|
918
949
|
size: number;
|
|
919
950
|
lastModified: number;
|
|
920
951
|
arrayBuffer(): Promise<ArrayBuffer>;
|
|
952
|
+
slice(start: number, end: number): {
|
|
953
|
+
arrayBuffer(): Promise<ArrayBuffer>;
|
|
954
|
+
};
|
|
921
955
|
}>;
|
|
922
956
|
createWritable(config?: {
|
|
923
957
|
keepExistingData?: boolean;
|
|
@@ -1015,6 +1049,10 @@ declare module "sliftutils/storage/IStorage" {
|
|
|
1015
1049
|
};
|
|
1016
1050
|
export type IStorageRaw = {
|
|
1017
1051
|
get(key: string): Promise<Buffer | undefined>;
|
|
1052
|
+
getRange(key: string, config: {
|
|
1053
|
+
start: number;
|
|
1054
|
+
end: number;
|
|
1055
|
+
}): Promise<Buffer | undefined>;
|
|
1018
1056
|
append(key: string, value: Buffer): Promise<void>;
|
|
1019
1057
|
set(key: string, value: Buffer): Promise<void>;
|
|
1020
1058
|
remove(key: string): Promise<void>;
|
|
@@ -1106,6 +1144,10 @@ declare module "sliftutils/storage/PrivateFileSystemStorage" {
|
|
|
1106
1144
|
private getFileHandle;
|
|
1107
1145
|
private fileExists;
|
|
1108
1146
|
get(key: string): Promise<Buffer | undefined>;
|
|
1147
|
+
getRange(key: string, config: {
|
|
1148
|
+
start: number;
|
|
1149
|
+
end: number;
|
|
1150
|
+
}): Promise<Buffer | undefined>;
|
|
1109
1151
|
set(key: string, value: Buffer): Promise<void>;
|
|
1110
1152
|
append(key: string, value: Buffer): Promise<void>;
|
|
1111
1153
|
remove(key: string): Promise<void>;
|
|
@@ -1121,6 +1163,9 @@ declare module "sliftutils/storage/PrivateFileSystemStorage" {
|
|
|
1121
1163
|
|
|
1122
1164
|
declare module "sliftutils/storage/StorageObservable" {
|
|
1123
1165
|
import { IStorage, IStorageSync } from "./IStorage";
|
|
1166
|
+
export declare const storagePendingAccesses: {
|
|
1167
|
+
value: number;
|
|
1168
|
+
};
|
|
1124
1169
|
export declare class StorageSync<T> implements IStorageSync<T> {
|
|
1125
1170
|
storage: IStorage<T>;
|
|
1126
1171
|
private config?;
|
|
@@ -1160,6 +1205,13 @@ declare module "sliftutils/storage/StorageObservable" {
|
|
|
1160
1205
|
reloadKey(key: string): void;
|
|
1161
1206
|
reset(): Promise<void>;
|
|
1162
1207
|
}
|
|
1208
|
+
export declare function waitUntilNextLoad(): Promise<void>;
|
|
1209
|
+
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
declare module "sliftutils/storage/StorageObservableAsync" {
|
|
1213
|
+
/** Reruns the code until all StorageSyncs accessed have loaded their values. Not efficient,although will usually be O(values accessed), just due to how loading works (it won't be quadratic). */
|
|
1214
|
+
export declare function rerunCodeUntilAllLoaded<T>(code: () => T): Promise<T>;
|
|
1163
1215
|
|
|
1164
1216
|
}
|
|
1165
1217
|
|
|
@@ -1219,6 +1271,107 @@ declare module "sliftutils/storage/TransactionStorage" {
|
|
|
1219
1271
|
|
|
1220
1272
|
}
|
|
1221
1273
|
|
|
1274
|
+
declare module "sliftutils/storage/backblaze" {
|
|
1275
|
+
/// <reference types="node" />
|
|
1276
|
+
/// <reference types="node" />
|
|
1277
|
+
export declare class ArchivesBackblaze {
|
|
1278
|
+
private config;
|
|
1279
|
+
constructor(config: {
|
|
1280
|
+
bucketName: string;
|
|
1281
|
+
public?: boolean;
|
|
1282
|
+
immutable?: boolean;
|
|
1283
|
+
cacheTime?: number;
|
|
1284
|
+
});
|
|
1285
|
+
private bucketName;
|
|
1286
|
+
private bucketId;
|
|
1287
|
+
private logging;
|
|
1288
|
+
enableLogging(): void;
|
|
1289
|
+
private log;
|
|
1290
|
+
getDebugName(): string;
|
|
1291
|
+
private getBucketAPI;
|
|
1292
|
+
private last503Reset;
|
|
1293
|
+
private apiRetryLogic;
|
|
1294
|
+
get(fileName: string, config?: {
|
|
1295
|
+
range?: {
|
|
1296
|
+
start: number;
|
|
1297
|
+
end: number;
|
|
1298
|
+
};
|
|
1299
|
+
retryCount?: number;
|
|
1300
|
+
}): Promise<Buffer | undefined>;
|
|
1301
|
+
set(fileName: string, data: Buffer): Promise<void>;
|
|
1302
|
+
del(fileName: string): Promise<void>;
|
|
1303
|
+
setLargeFile(config: {
|
|
1304
|
+
path: string;
|
|
1305
|
+
getNextData(): Promise<Buffer | undefined>;
|
|
1306
|
+
}): Promise<void>;
|
|
1307
|
+
getInfo(fileName: string): Promise<{
|
|
1308
|
+
writeTime: number;
|
|
1309
|
+
size: number;
|
|
1310
|
+
} | undefined>;
|
|
1311
|
+
find(prefix: string, config?: {
|
|
1312
|
+
shallow?: boolean;
|
|
1313
|
+
type: "files" | "folders";
|
|
1314
|
+
}): Promise<string[]>;
|
|
1315
|
+
findInfo(prefix: string, config?: {
|
|
1316
|
+
shallow?: boolean;
|
|
1317
|
+
type: "files" | "folders";
|
|
1318
|
+
}): Promise<{
|
|
1319
|
+
path: string;
|
|
1320
|
+
createTime: number;
|
|
1321
|
+
size: number;
|
|
1322
|
+
}[]>;
|
|
1323
|
+
assertPathValid(path: string): Promise<void>;
|
|
1324
|
+
getURL(path: string): Promise<string>;
|
|
1325
|
+
getDownloadAuthorization(config: {
|
|
1326
|
+
fileNamePrefix?: string;
|
|
1327
|
+
validDurationInSeconds: number;
|
|
1328
|
+
b2ContentDisposition?: string;
|
|
1329
|
+
b2ContentLanguage?: string;
|
|
1330
|
+
b2Expires?: string;
|
|
1331
|
+
b2CacheControl?: string;
|
|
1332
|
+
b2ContentEncoding?: string;
|
|
1333
|
+
b2ContentType?: string;
|
|
1334
|
+
}): Promise<{
|
|
1335
|
+
bucketId: string;
|
|
1336
|
+
fileNamePrefix: string;
|
|
1337
|
+
authorizationToken: string;
|
|
1338
|
+
}>;
|
|
1339
|
+
}
|
|
1340
|
+
export declare const getArchivesBackblaze: {
|
|
1341
|
+
(key: string): ArchivesBackblaze;
|
|
1342
|
+
clear(key: string): void;
|
|
1343
|
+
clearAll(): void;
|
|
1344
|
+
forceSet(key: string, value: ArchivesBackblaze): void;
|
|
1345
|
+
getAllKeys(): string[];
|
|
1346
|
+
get(key: string): ArchivesBackblaze | undefined;
|
|
1347
|
+
};
|
|
1348
|
+
export declare const getArchivesBackblazePrivateImmutable: {
|
|
1349
|
+
(key: string): ArchivesBackblaze;
|
|
1350
|
+
clear(key: string): void;
|
|
1351
|
+
clearAll(): void;
|
|
1352
|
+
forceSet(key: string, value: ArchivesBackblaze): void;
|
|
1353
|
+
getAllKeys(): string[];
|
|
1354
|
+
get(key: string): ArchivesBackblaze | undefined;
|
|
1355
|
+
};
|
|
1356
|
+
export declare const getArchivesBackblazePublicImmutable: {
|
|
1357
|
+
(key: string): ArchivesBackblaze;
|
|
1358
|
+
clear(key: string): void;
|
|
1359
|
+
clearAll(): void;
|
|
1360
|
+
forceSet(key: string, value: ArchivesBackblaze): void;
|
|
1361
|
+
getAllKeys(): string[];
|
|
1362
|
+
get(key: string): ArchivesBackblaze | undefined;
|
|
1363
|
+
};
|
|
1364
|
+
export declare const getArchivesBackblazePublic: {
|
|
1365
|
+
(key: string): ArchivesBackblaze;
|
|
1366
|
+
clear(key: string): void;
|
|
1367
|
+
clearAll(): void;
|
|
1368
|
+
forceSet(key: string, value: ArchivesBackblaze): void;
|
|
1369
|
+
getAllKeys(): string[];
|
|
1370
|
+
get(key: string): ArchivesBackblaze | undefined;
|
|
1371
|
+
};
|
|
1372
|
+
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1222
1375
|
declare module "sliftutils/storage/fileSystemPointer" {
|
|
1223
1376
|
export type FileSystemPointer = string;
|
|
1224
1377
|
export declare function storeFileSystemPointer(config: {
|
package/misc/apiKeys.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare const getAPIKey: {
|
|
|
10
10
|
getAllKeys(): string[];
|
|
11
11
|
get(key: string): Promise<string> | undefined;
|
|
12
12
|
};
|
|
13
|
+
export declare function setAPIKey(key: string, value: string): void;
|
|
13
14
|
export declare class ManageAPIKeys extends preact.Component {
|
|
14
15
|
render(): string;
|
|
15
16
|
}
|
package/misc/apiKeys.tsx
CHANGED
|
@@ -128,15 +128,19 @@ export const getAPIKey = cache(async function getAPIKey(key: string): Promise<st
|
|
|
128
128
|
try {
|
|
129
129
|
let value = await promise;
|
|
130
130
|
|
|
131
|
-
|
|
132
|
-
state.keys.push(key);
|
|
133
|
-
getStorage().setItem(getStorageKey("__keys"), JSON.stringify(state.keys));
|
|
131
|
+
setAPIKey(key, value);
|
|
134
132
|
return value;
|
|
135
133
|
} finally {
|
|
136
134
|
obj.close();
|
|
137
135
|
}
|
|
138
136
|
});
|
|
139
137
|
|
|
138
|
+
export function setAPIKey(key: string, value: string) {
|
|
139
|
+
getStorage().setItem(getStorageKey(key), value);
|
|
140
|
+
state.keys.push(key);
|
|
141
|
+
getStorage().setItem(getStorageKey("__keys"), JSON.stringify(state.keys));
|
|
142
|
+
}
|
|
143
|
+
|
|
140
144
|
@observer
|
|
141
145
|
export class ManageAPIKeys extends preact.Component {
|
|
142
146
|
render() {
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
12
|
+
//exports.ManageAPIKeys = exports.setAPIKey = exports.getAPIKey = exports.APIKeysControl = void 0;
|
|
13
|
+
const preact_1 = __importDefault(require("preact"));
|
|
14
|
+
const caching_1 = require("socket-function/src/caching");
|
|
15
|
+
const typesafecss_1 = require("typesafecss");
|
|
16
|
+
const fs_1 = __importDefault(require("fs"));
|
|
17
|
+
const os_1 = __importDefault(require("os"));
|
|
18
|
+
const mobx_1 = require("mobx");
|
|
19
|
+
const InputLabel_1 = require("../render-utils/InputLabel");
|
|
20
|
+
const modal_1 = require("../render-utils/modal");
|
|
21
|
+
const observer_1 = require("../render-utils/observer");
|
|
22
|
+
let DirectoryPrompter = class DirectoryPrompter extends preact_1.default.Component {
|
|
23
|
+
constructor() {
|
|
24
|
+
super(...arguments);
|
|
25
|
+
this.synced = (0, mobx_1.observable)({
|
|
26
|
+
value: "",
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
render() {
|
|
30
|
+
const { valueKey, onDone } = this.props;
|
|
31
|
+
const { value } = this.synced;
|
|
32
|
+
return (preact_1.default.createElement("div", { className: typesafecss_1.css.position("fixed").pos(0, 0).size("100vw", "100vh")
|
|
33
|
+
.zIndex(1)
|
|
34
|
+
.hsla(0, 0, 20, 0.5)
|
|
35
|
+
.center
|
|
36
|
+
.fontSize(40) },
|
|
37
|
+
preact_1.default.createElement(InputLabel_1.InputLabel, { label: valueKey, value: value, onChangeValue: value => this.synced.value = value }),
|
|
38
|
+
preact_1.default.createElement("button", { onClick: () => onDone(value) }, "Done")));
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
DirectoryPrompter = __decorate([
|
|
42
|
+
observer_1.observer
|
|
43
|
+
], DirectoryPrompter);
|
|
44
|
+
function getStorageKey(key) {
|
|
45
|
+
if ((0, typesafecss_1.isNode)())
|
|
46
|
+
return os_1.default.homedir() + "/" + key;
|
|
47
|
+
return `apiKeys.ts_${key}`;
|
|
48
|
+
}
|
|
49
|
+
let state = (0, mobx_1.observable)({
|
|
50
|
+
keys: [],
|
|
51
|
+
});
|
|
52
|
+
if (!(0, typesafecss_1.isNode)()) {
|
|
53
|
+
try {
|
|
54
|
+
let newKeys = JSON.parse(localStorage.getItem(getStorageKey("__keys")));
|
|
55
|
+
if (Array.isArray(newKeys)) {
|
|
56
|
+
state.keys = newKeys;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch (_a) { }
|
|
60
|
+
}
|
|
61
|
+
let APIKeysControl = class APIKeysControl extends preact_1.default.Component {
|
|
62
|
+
render() {
|
|
63
|
+
return (preact_1.default.createElement("label", { className: typesafecss_1.css.hbox(4) },
|
|
64
|
+
preact_1.default.createElement("span", null, "Keys:"),
|
|
65
|
+
preact_1.default.createElement("select", null, state.keys.map(key => preact_1.default.createElement("option", null, key))),
|
|
66
|
+
preact_1.default.createElement("button", { onClick: () => {
|
|
67
|
+
let key = state.keys[0];
|
|
68
|
+
state.keys = state.keys.filter(k => k !== key);
|
|
69
|
+
localStorage.setItem(getStorageKey("__keys"), JSON.stringify(state.keys));
|
|
70
|
+
localStorage.removeItem(getStorageKey(key));
|
|
71
|
+
} }, "Delete")));
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
exports.APIKeysControl = APIKeysControl;
|
|
75
|
+
exports.APIKeysControl = APIKeysControl = __decorate([
|
|
76
|
+
observer_1.observer
|
|
77
|
+
], APIKeysControl);
|
|
78
|
+
let getStorage = (0, caching_1.lazy)(() => {
|
|
79
|
+
if (!(0, typesafecss_1.isNode)())
|
|
80
|
+
return localStorage;
|
|
81
|
+
return {
|
|
82
|
+
getItem: (key) => {
|
|
83
|
+
if (!fs_1.default.existsSync(key))
|
|
84
|
+
return null;
|
|
85
|
+
return fs_1.default.readFileSync(key, "utf-8");
|
|
86
|
+
},
|
|
87
|
+
setItem: (key, value) => {
|
|
88
|
+
fs_1.default.writeFileSync(key, value);
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
exports.getAPIKey = (0, caching_1.cache)(async function getAPIKey(key) {
|
|
93
|
+
let innerKey = "key";
|
|
94
|
+
if ((0, typesafecss_1.isNode)()) {
|
|
95
|
+
if (key.includes(".json.")) {
|
|
96
|
+
let [baseKey, innerKeyPart] = key.split(".json.");
|
|
97
|
+
baseKey += ".json";
|
|
98
|
+
innerKey = innerKeyPart;
|
|
99
|
+
key = baseKey;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
let keyKey = getStorageKey(key);
|
|
103
|
+
let localStorageValue = getStorage().getItem(keyKey);
|
|
104
|
+
if (localStorageValue === null || localStorageValue === void 0 ? void 0 : localStorageValue.startsWith("{")) {
|
|
105
|
+
try {
|
|
106
|
+
localStorageValue = JSON.parse(localStorageValue)[innerKey];
|
|
107
|
+
}
|
|
108
|
+
catch (_a) { }
|
|
109
|
+
}
|
|
110
|
+
if (localStorageValue) {
|
|
111
|
+
return localStorageValue;
|
|
112
|
+
}
|
|
113
|
+
if ((0, typesafecss_1.isNode)())
|
|
114
|
+
throw new Error(`Add an api key to ${keyKey}`);
|
|
115
|
+
let onDone = (value) => { };
|
|
116
|
+
let promise = new Promise(resolve => {
|
|
117
|
+
onDone = resolve;
|
|
118
|
+
});
|
|
119
|
+
let obj = (0, modal_1.showModal)({ contents: preact_1.default.createElement(DirectoryPrompter, { valueKey: key, onDone: onDone }) });
|
|
120
|
+
try {
|
|
121
|
+
let value = await promise;
|
|
122
|
+
setAPIKey(key, value);
|
|
123
|
+
return value;
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
obj.close();
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
function setAPIKey(key, value) {
|
|
130
|
+
getStorage().setItem(getStorageKey(key), value);
|
|
131
|
+
state.keys.push(key);
|
|
132
|
+
getStorage().setItem(getStorageKey("__keys"), JSON.stringify(state.keys));
|
|
133
|
+
}
|
|
134
|
+
exports.setAPIKey = setAPIKey;
|
|
135
|
+
let ManageAPIKeys = class ManageAPIKeys extends preact_1.default.Component {
|
|
136
|
+
render() {
|
|
137
|
+
return "ManageAPIKeys";
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
exports.ManageAPIKeys = ManageAPIKeys;
|
|
141
|
+
exports.ManageAPIKeys = ManageAPIKeys = __decorate([
|
|
142
|
+
observer_1.observer
|
|
143
|
+
], ManageAPIKeys);
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpS2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwaUtleXMudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUM1Qix5REFBMEQ7QUFDMUQsNkNBQTBDO0FBQzFDLDRDQUFvQjtBQUNwQiw0Q0FBb0I7QUFDcEIsK0JBQWtDO0FBQ2xDLDJEQUF3RDtBQUN4RCxpREFBa0Q7QUFDbEQsdURBQW9EO0FBR3BELElBQU0saUJBQWlCLEdBQXZCLE1BQU0saUJBQWtCLFNBQVEsZ0JBQU0sQ0FBQyxTQUdyQztJQUhGOztRQUlJLFdBQU0sR0FBRyxJQUFBLGlCQUFVLEVBQUM7WUFDaEIsS0FBSyxFQUFFLEVBQUU7U0FDWixDQUFDLENBQUM7SUF1QlAsQ0FBQztJQXRCRyxNQUFNO1FBQ0YsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQzlCLE9BQU8sQ0FDSCx3Q0FBSyxTQUFTLEVBQ1YsaUJBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQztpQkFDakQsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDVCxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDO2lCQUNuQixNQUFNO2lCQUNOLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFFakIsK0JBQUMsdUJBQVUsSUFDUCxLQUFLLEVBQUUsUUFBUSxFQUNmLEtBQUssRUFBRSxLQUFLLEVBQ1osYUFBYSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUNuRDtZQUNGLDJDQUFRLE9BQU8sRUFBRSxH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QUFJLEdBQUcsR0FBRyxJQUFBLGlCQUFTLEVBQUMsRUFBRSxRQUFRLEVBQUUsK0JBQUMsaUJBQWlCLElBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLElBQUksQ0FBQztRQUNELElBQUksS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO1FBRTFCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdEIsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztZQUFTLENBQUM7UUFDUCxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEIsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDO0FBRUgsU0FBZ0IsU0FBUyxDQUFDLEdBQVcsRUFBRSxLQUFhO0lBQ2hELFVBQVUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckIsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFKRCw4QkFJQztBQUdNLElBQU0sYUFBYSxHQUFuQixNQUFNLGFBQWMsU0FBUSxnQkFBTSxDQUFDLFNBQVM7SUFDL0MsTUFBTTtRQUNGLE9BQU8sZUFBZSxDQUFDO0lBQzNCLENBQUM7Q0FDSixDQUFBO0FBSlksc0NBQWE7d0JBQWIsYUFBYTtJQUR6QixtQkFBUTtHQUNJLGFBQWEsQ0FJekIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcHJlYWN0IGZyb20gXCJwcmVhY3RcIjtcbmltcG9ydCB7IGNhY2hlLCBsYXp5IH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9zcmMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgY3NzLCBpc05vZGUgfSBmcm9tIFwidHlwZXNhZmVjc3NcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCB7IG9ic2VydmFibGUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHsgSW5wdXRMYWJlbCB9IGZyb20gXCIuLi9yZW5kZXItdXRpbHMvSW5wdXRMYWJlbFwiO1xuaW1wb3J0IHsgc2hvd01vZGFsIH0gZnJvbSBcIi4uL3JlbmRlci11dGlscy9tb2RhbFwiO1xuaW1wb3J0IHsgb2JzZXJ2ZXIgfSBmcm9tIFwiLi4vcmVuZGVyLXV0aWxzL29ic2VydmVyXCI7XG5cbkBvYnNlcnZlclxuY2xhc3MgRGlyZWN0b3J5UHJvbXB0ZXIgZXh0ZW5kcyBwcmVhY3QuQ29tcG9uZW50PHtcbiAgICB2YWx1ZUtleTogc3RyaW5nO1xuICAgIG9uRG9uZTogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG59PiB7XG4gICAgc3luY2VkID0gb2JzZXJ2YWJsZSh7XG4gICAgICAgIHZhbHVlOiBcIlwiLFxuICAgIH0pO1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZUtleSwgb25Eb25lIH0gPSB0aGlzLnByb3BzO1xuICAgICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLnN5bmNlZDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtcbiAgICAgICAgICAgICAgICBjc3MucG9zaXRpb24oXCJmaXhlZFwiKS5wb3MoMCwgMCkuc2l6ZShcIjEwMHZ3XCIsIFwiMTAwdmhcIilcbiAgICAgICAgICAgICAgICAgICAgLnpJbmRleCgxKVxuICAgICAgICAgICAgICAgICAgICAuaHNsYSgwLCAwLCAyMCwgMC41KVxuICAgICAgICAgICAgICAgICAgICAuY2VudGVyXG4gICAgICAgICAgICAgICAgICAgIC5mb250U2l6ZSg0MClcbiAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgPElucHV0TGFiZWxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e3ZhbHVlS2V5fVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlVmFsdWU9e3ZhbHVlID0+IHRoaXMuc3luY2VkLnZhbHVlID0gdmFsdWV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IG9uRG9uZSh2YWx1ZSl9PlxuICAgICAgICAgICAgICAgICAgICBEb25lXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cblxuZnVuY3Rpb24gZ2V0U3RvcmFnZUtleShrZXk6IHN0cmluZykge1xuICAgIGlmIChpc05vZGUoKSkgcmV0dXJuIG9zLmhvbWVkaXIoKSArIFwiL1wiICsga2V5O1xuICAgIHJldHVybiBgYXBpS2V5cy50c18ke2tleX1gO1xufVxuXG5sZXQgc3RhdGUgPSBvYnNlcnZhYmxlKHtcbiAgICBrZXlzOiBbXSBhcyBzdHJpbmdbXSxcbn0pO1xuaWYgKCFpc05vZGUoKSkge1xuICAgIHRyeSB7XG4gICAgICAgIGxldCBuZXdLZXlzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbShnZXRTdG9yYWdlS2V5KFwiX19rZXlzXCIpKSEpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdLZXlzKSkge1xuICAgICAgICAgICAgc3RhdGUua2V5cyA9IG5ld0tleXM7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIHsgfVxufVxuXG5Ab2JzZXJ2ZXJcbmV4cG9ydCBjbGFzcyBBUElLZXlzQ29udHJvbCBleHRlbmRzIHByZWFjdC5Db21wb25lbnQge1xuICAgIHJlbmRlcigpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9e2Nzcy5oYm94KDQpfT5cbiAgICAgICAgICAgICAgICA8c3Bhbj5LZXlzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICB7c3RhdGUua2V5cy5tYXAoa2V5ID0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPntrZXl9PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBrZXkgPSBzdGF0ZS5rZXlzWzBdO1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZS5rZXlzID0gc3RhdGUua2V5cy5maWx0ZXIoayA9PiBrICE9PSBrZXkpO1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShnZXRTdG9yYWdlS2V5KFwiX19rZXlzXCIpLCBKU09OLnN0cmluZ2lmeShzdGF0ZS5rZXlzKSk7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGdldFN0b3JhZ2VLZXkoa2V5KSk7XG4gICAgICAgICAgICAgICAgfX0+XG4gICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmxldCBnZXRTdG9yYWdlID0gbGF6eSgoKToge1xuICAgIGdldEl0ZW06IChrZXk6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBzZXRJdGVtOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHZvaWQ7XG59ID0+IHtcbiAgICBpZiAoIWlzTm9kZSgpKSByZXR1cm4gbG9jYWxTdG9yYWdlO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdldEl0ZW06IChrZXkpID0+IHtcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhrZXkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoa2V5LCBcInV0Zi04XCIpO1xuICAgICAgICB9LFxuICAgICAgICBzZXRJdGVtOiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhrZXksIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICB9O1xufSk7XG5cbmV4cG9ydCBjb25zdCBnZXRBUElLZXkgPSBjYWNoZShhc3luYyBmdW5jdGlvbiBnZXRBUElLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBpbm5lcktleSA9IFwia2V5XCI7XG4gICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgIGlmIChrZXkuaW5jbHVkZXMoXCIuanNvbi5cIikpIHtcbiAgICAgICAgICAgIGxldCBbYmFzZUtleSwgaW5uZXJLZXlQYXJ0XSA9IGtleS5zcGxpdChcIi5qc29uLlwiKTtcbiAgICAgICAgICAgIGJhc2VLZXkgKz0gXCIuanNvblwiO1xuICAgICAgICAgICAgaW5uZXJLZXkgPSBpbm5lcktleVBhcnQ7XG4gICAgICAgICAgICBrZXkgPSBiYXNlS2V5O1xuICAgICAgICB9XG4gICAgfVxuICAgIGxldCBrZXlLZXkgPSBnZXRTdG9yYWdlS2V5KGtleSk7XG4gICAgbGV0IGxvY2FsU3RvcmFnZVZhbHVlID0gZ2V0U3RvcmFnZSgpLmdldEl0ZW0oa2V5S2V5KTtcbiAgICBpZiAobG9jYWxTdG9yYWdlVmFsdWU/LnN0YXJ0c1dpdGgoXCJ7XCIpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2VWYWx1ZSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlVmFsdWUpW2lubmVyS2V5XTtcbiAgICAgICAgfSBjYXRjaCB7IH1cbiAgICB9XG4gICAgaWYgKGxvY2FsU3RvcmFnZVZhbHVlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2VWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSgpKSB0aHJvdyBuZXcgRXJyb3IoYEFkZCBhbiBhcGkga2V5IHRvICR7a2V5S2V5fWApO1xuXG4gICAgbGV0IG9uRG9uZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7IH07XG4gICAgbGV0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxzdHJpbmc+KHJlc29sdmUgPT4ge1xuICAgICAgICBvbkRvbmUgPSByZXNvbHZlO1xuICAgIH0pO1xuICAgIGxldCBvYmogPSBzaG93TW9kYWwoeyBjb250ZW50czogPERpcmVjdG9yeVByb21wdGVyIHZhbHVlS2V5PXtrZXl9IG9uRG9uZT17b25Eb25lfSAvPiB9KTtcbiAgICB0cnkge1xuICAgICAgICBsZXQgdmFsdWUgPSBhd2FpdCBwcm9taXNlO1xuXG4gICAgICAgIHNldEFQSUtleShrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIG9iai5jbG9zZSgpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QVBJS2V5KGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oZ2V0U3RvcmFnZUtleShrZXkpLCB2YWx1ZSk7XG4gICAgc3RhdGUua2V5cy5wdXNoKGtleSk7XG4gICAgZ2V0U3RvcmFnZSgpLnNldEl0ZW0oZ2V0U3RvcmFnZUtleShcIl9fa2V5c1wiKSwgSlNPTi5zdHJpbmdpZnkoc3RhdGUua2V5cykpO1xufVxuXG5Ab2JzZXJ2ZXJcbmV4cG9ydCBjbGFzcyBNYW5hZ2VBUElLZXlzIGV4dGVuZHMgcHJlYWN0LkNvbXBvbmVudCB7XG4gICAgcmVuZGVyKCkge1xuICAgICAgICByZXR1cm4gXCJNYW5hZ2VBUElLZXlzXCI7XG4gICAgfVxufSJdfQ==
|
|
145
|
+
/* _JS_SOURCE_HASH = "d6ef02866d39c57a55ce88d8e6b03ddc399584de91fdd66b6aab0198cbab4c70"; */
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
3
|
+
//exports.openRouterCallBase = exports.openRouterCall = exports.simpleAICallTyped = exports.simpleAICall = exports.yamlOpenRouterCall = exports.getTotalCost = void 0;
|
|
4
|
+
const yaml_1 = require("./yaml");
|
|
5
|
+
const batching_1 = require("socket-function/src/batching");
|
|
6
|
+
const format_1 = require("socket-function/src/formatting/format");
|
|
7
|
+
const apiKeys_1 = require("./apiKeys");
|
|
8
|
+
let totalCost = 0;
|
|
9
|
+
function getTotalCost() {
|
|
10
|
+
return totalCost;
|
|
11
|
+
}
|
|
12
|
+
exports.getTotalCost = getTotalCost;
|
|
13
|
+
/** IMPORTANT! Make sure to tell the AI to return yaml. */
|
|
14
|
+
async function yamlOpenRouterCall(config) {
|
|
15
|
+
var _a;
|
|
16
|
+
let { model, messages, retries = 3, options, onCost } = config;
|
|
17
|
+
try {
|
|
18
|
+
let response = await openRouterCall({ model, messages, options, onCost, retries: 0 });
|
|
19
|
+
let result = (0, yaml_1.parseYAML)(response);
|
|
20
|
+
(_a = config.validate) === null || _a === void 0 ? void 0 : _a.call(config, result);
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (retries > 0) {
|
|
25
|
+
return yamlOpenRouterCall({ model, messages, retries: retries - 1, onCost });
|
|
26
|
+
}
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.yamlOpenRouterCall = yamlOpenRouterCall;
|
|
31
|
+
async function simpleAICall(model, message) {
|
|
32
|
+
return await openRouterCallBase({
|
|
33
|
+
model,
|
|
34
|
+
messages: [{ role: "user", content: message }],
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
exports.simpleAICall = simpleAICall;
|
|
38
|
+
/** The message must request the result to be returned in YAML (we automatically parse this and return an object). */
|
|
39
|
+
async function simpleAICallTyped(model, message) {
|
|
40
|
+
return await yamlOpenRouterCall({
|
|
41
|
+
model,
|
|
42
|
+
messages: [{ role: "user", content: message }],
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
exports.simpleAICallTyped = simpleAICallTyped;
|
|
46
|
+
let pendingLog = undefined;
|
|
47
|
+
async function openRouterCall(config) {
|
|
48
|
+
return await openRouterCallBase(config);
|
|
49
|
+
}
|
|
50
|
+
exports.openRouterCall = openRouterCall;
|
|
51
|
+
async function openRouterCallBase(config) {
|
|
52
|
+
let { model, messages, options, onCost } = config;
|
|
53
|
+
let openrouterKey = (options === null || options === void 0 ? void 0 : options.apiKey) || await (0, apiKeys_1.getAPIKey)("openrouter.json");
|
|
54
|
+
console.log(`Calling ${model} with ${messages.length} messages`);
|
|
55
|
+
let time = Date.now();
|
|
56
|
+
let stillRunning = true;
|
|
57
|
+
// Spawn monitoring loop
|
|
58
|
+
void (async () => {
|
|
59
|
+
while (stillRunning) {
|
|
60
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
61
|
+
if (stillRunning) {
|
|
62
|
+
console.log("OpenRouter call still running...");
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
})();
|
|
66
|
+
try {
|
|
67
|
+
return await (0, batching_1.retryFunctional)(async () => {
|
|
68
|
+
let response = await fetch("https://openrouter.ai/api/v1/chat/completions", {
|
|
69
|
+
method: "POST",
|
|
70
|
+
headers: {
|
|
71
|
+
"Authorization": `Bearer ${openrouterKey}`,
|
|
72
|
+
"Content-Type": "application/json",
|
|
73
|
+
},
|
|
74
|
+
body: JSON.stringify({
|
|
75
|
+
model,
|
|
76
|
+
messages,
|
|
77
|
+
provider: {
|
|
78
|
+
sort: "throughput",
|
|
79
|
+
},
|
|
80
|
+
usage: { include: true },
|
|
81
|
+
...options,
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
84
|
+
// If it failed, throw
|
|
85
|
+
if (response.status !== 200) {
|
|
86
|
+
let responseText = await response.text();
|
|
87
|
+
throw new Error(`Failed to call OpenRouter: ${response.status} ${response.statusText} ${responseText}`);
|
|
88
|
+
}
|
|
89
|
+
let responseObj = await response.json();
|
|
90
|
+
let newCost = responseObj.usage.cost;
|
|
91
|
+
totalCost += newCost;
|
|
92
|
+
onCost === null || onCost === void 0 ? void 0 : onCost(newCost);
|
|
93
|
+
if (!pendingLog) {
|
|
94
|
+
pendingLog = {
|
|
95
|
+
count: 0,
|
|
96
|
+
duration: 0,
|
|
97
|
+
cost: 0,
|
|
98
|
+
};
|
|
99
|
+
setTimeout(() => {
|
|
100
|
+
let log = pendingLog;
|
|
101
|
+
if (!log)
|
|
102
|
+
return;
|
|
103
|
+
console.log(`Ran: ${log.count} calls at a total summed cost of ${(0, format_1.formatNumber)(1 / log.cost)}/USD`);
|
|
104
|
+
pendingLog = undefined;
|
|
105
|
+
}, 10000);
|
|
106
|
+
}
|
|
107
|
+
pendingLog.count++;
|
|
108
|
+
pendingLog.duration += Date.now() - time;
|
|
109
|
+
pendingLog.cost += newCost;
|
|
110
|
+
return responseObj.choices[0].message.content;
|
|
111
|
+
}, { maxRetries: config.retries || 3 })();
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
stillRunning = false;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
exports.openRouterCallBase = openRouterCallBase;
|
|
118
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbnJvdXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm9wZW5yb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQW1DO0FBQ25DLDJEQUErRDtBQUMvRCxrRUFBcUU7QUFDckUsdUNBQXNDO0FBZ0J0QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7QUFDbEIsU0FBZ0IsWUFBWTtJQUN4QixPQUFPLFNBQVMsQ0FBQztBQUNyQixDQUFDO0FBRkQsb0NBRUM7QUFXRCwwREFBMEQ7QUFDbkQsS0FBSyxVQUFVLGtCQUFrQixDQUFJLE1BTzNDOztJQUNHLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUMvRCxJQUFJLENBQUM7UUFDRCxJQUFJLFFBQVEsR0FBRyxNQUFNLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0RixJQUFJLE1BQU0sR0FBRyxJQUFBLGdCQUFTLEVBQUMsUUFBUSxDQUFNLENBQUM7UUFDdEMsTUFBQSxNQUFNLENBQUMsUUFBUSx1REFBRyxNQUFNLENBQUMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNiLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsT0FBTyxrQkFBa0IsQ0FBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDaEIsQ0FBQztBQUNMLENBQUM7QUFwQkQsZ0RBb0JDO0FBRU0sS0FBSyxVQUFVLFlBQVksQ0FBQyxLQUFhLEVBQUUsT0FBZTtJQUM3RCxPQUFPLE1BQU0sa0JBQWtCLENBQUM7UUFDNUIsS0FBSztRQUNMLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7S0FDakQsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUxELG9DQUtDO0FBQ0QscUhBQXFIO0FBQzlHLEtBQUssVUFBVSxpQkFBaUIsQ0FBSSxLQUFhLEVBQUUsT0FBZTtJQUNyRSxPQUFPLE1BQU0sa0JBQWtCLENBQUM7UUFDNUIsS0FBSztRQUNMLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7S0FDakQsQ0FBTSxDQUFDO0FBQ1osQ0FBQztBQUxELDhDQUtDO0FBRUQsSUFBSSxVQUFVLEdBSUUsU0FBUyxDQUFDO0FBRW5CLEtBQUssVUFBVSxjQUFjLENBQUMsTUFNcEM7SUFDRyxPQUFPLE1BQU0sa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQVJELHdDQVFDO0FBRU0sS0FBSyxVQUFVLGtCQUFrQixDQUFDLE1BTXhDO0lBQ0csSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQztJQUNsRCxJQUFJLGFBQWEsR0FBRyxDQUFBLE9BQU8sYUFBUCxPQUFPLHVCQUFQLE9BQU8sQ0FBRSxNQUFNLEtBQUksTUFBTSxJQUFBLG1CQUFTLEVBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMxRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsS0FBSyxTQUFTLFFBQVEsQ0FBQyxNQUFNLFdBQVcsQ0FBQyxDQUFDO0lBQ2pFLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7SUFFeEIsd0JBQXdCO0lBQ3hCLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtRQUNiLE9BQU8sWUFBWSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUNwRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFTCxJQUFJLENBQUM7UUFDRCxPQUFPLE1BQU0sSUFBQSwwQkFBZSxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ3BDLElBQUksUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLCtDQUErQyxFQUFFO2dCQUN4RSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUU7b0JBQ0wsZUFBZSxFQUFFLFVBQVUsYUFBYSxFQUFFO29CQUMxQyxjQUFjLEVBQUUsa0JBQWtCO2lCQUNyQztnQkFDRCxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztvQkFDakIsS0FBSztvQkFDTCxRQUFRO29CQUNSLFFBQVEsRUFBRTt3QkFDTixJQUFJLEVBQUUsWUFBWTtxQkFDckI7b0JBQ0QsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRTtvQkFDeEIsR0FBRyxPQUFPO2lCQUNiLENBQUM7YUFDTCxDQUFDLENBQUM7WUFFSCxzQkFBc0I7WUFDdEIsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUMxQixJQUFJLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsVUFBVSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7WUFDNUcsQ0FBQztZQUNELElBQUksV0FBVyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFTcEMsQ0FBQztZQUNGLElBQUksT0FBTyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3JDLFNBQVMsSUFBSSxPQUFPLENBQUM7WUFDckIsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDZCxVQUFVLEdBQUc7b0JBQ1QsS0FBSyxFQUFFLENBQUM7b0JBQ1IsUUFBUSxFQUFFLENBQUM7b0JBQ1gsSUFBSSxFQUFFLENBQUM7aUJBQ1YsQ0FBQztnQkFDRixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksR0FBRyxHQUFHLFVBQVUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLEdBQUc7d0JBQUUsT0FBTztvQkFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxLQUFLLG9DQUFvQyxJQUFBLHFCQUFZLEVBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7b0JBQ25HLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQzNCLENBQUMsRUFBRSxLQUFNLENBQUMsQ0FBQztZQUNmLENBQUM7WUFDRCxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbkIsVUFBVSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ3pDLFVBQVUsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDO1lBQzNCLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBaUIsQ0FBQztRQUM1RCxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQztZQUFTLENBQUM7UUFDUCxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7QUFDTCxDQUFDO0FBakZELGdEQWlGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBhcnNlWUFNTCB9IGZyb20gXCIuL3lhbWxcIjtcbmltcG9ydCB7IHJldHJ5RnVuY3Rpb25hbCB9IGZyb20gXCJzb2NrZXQtZnVuY3Rpb24vc3JjL2JhdGNoaW5nXCI7XG5pbXBvcnQgeyBmb3JtYXROdW1iZXIgfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL3NyYy9mb3JtYXR0aW5nL2Zvcm1hdFwiO1xuaW1wb3J0IHsgZ2V0QVBJS2V5IH0gZnJvbSBcIi4vYXBpS2V5c1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlSGlzdG9yeSA9IHtcbiAgICByb2xlOiBcInN5c3RlbVwiIHwgXCJ1c2VyXCIgfCBcImFzc2lzdGFudFwiO1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbn1bXTtcbmV4cG9ydCB0eXBlIE1lc3NhZ2VIaXN0b3J5MiA9IHtcbiAgICByb2xlOiBcInN5c3RlbVwiIHwgXCJ1c2VyXCIgfCBcImFzc2lzdGFudFwiO1xuICAgIGNvbnRlbnQ6IHN0cmluZyB8IHtcbiAgICAgICAgdHlwZTogXCJpbWFnZV91cmxcIjtcbiAgICAgICAgaW1hZ2VfdXJsOiB7XG4gICAgICAgICAgICB1cmw6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICB9W107XG59W107XG5cbmxldCB0b3RhbENvc3QgPSAwO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvdGFsQ29zdCgpIHtcbiAgICByZXR1cm4gdG90YWxDb3N0O1xufVxudHlwZSBPcGVuUm91dGVyT3B0aW9ucyA9IHtcbiAgICAvLyBJZiBub3QgcHJvdmlkZWQsIHdlJ2xsIHBvcCB1cCBhIG1vZGFsIHRvIGFzayB0aGUgdXNlciBmb3IgaXQsIE9yLCBpZiB3ZSdyZSBvbiB0aGUgc2VydmVyLCB3ZSdsbCB0cnkgdG8gcmVhZCBpdCBmcm9tIHRoZSB1c2VyIGZvbGRlci5cbiAgICBhcGlLZXk/OiBzdHJpbmc7XG4gICAgcHJvdmlkZXI/OiB7XG4gICAgICAgIHNvcnQ/OiBcInRocm91Z2hwdXRcIiB8IFwicHJpY2VcIiB8IFwibGF0ZW5jeVwiLFxuICAgICAgICAvLyBodHRwczovL29wZW5yb3V0ZXIuYWkvZG9jcy9mZWF0dXJlcy9wcm92aWRlci1yb3V0aW5nI29yZGVyaW5nLXNwZWNpZmljLXByb3ZpZGVyc1xuICAgICAgICBvcmRlcj86IHN0cmluZ1tdLFxuICAgIH1cbiAgICByZWFzb25pbmdFZmZvcnQ/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiLFxufTtcbi8qKiBJTVBPUlRBTlQhIE1ha2Ugc3VyZSB0byB0ZWxsIHRoZSBBSSB0byByZXR1cm4geWFtbC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB5YW1sT3BlblJvdXRlckNhbGw8VD4oY29uZmlnOiB7XG4gICAgbW9kZWw6IHN0cmluZztcbiAgICBtZXNzYWdlczogTWVzc2FnZUhpc3Rvcnk7XG4gICAgcmV0cmllcz86IG51bWJlcjtcbiAgICBvcHRpb25zPzogT3BlblJvdXRlck9wdGlvbnM7XG4gICAgb25Db3N0PzogKGNvc3Q6IG51bWJlcikgPT4gdm9pZDtcbiAgICB2YWxpZGF0ZT86IChyZXNwb25zZTogVCkgPT4gdm9pZDtcbn0pOiBQcm9taXNlPFQ+IHtcbiAgICBsZXQgeyBtb2RlbCwgbWVzc2FnZXMsIHJldHJpZXMgPSAzLCBvcHRpb25zLCBvbkNvc3QgfSA9IGNvbmZpZztcbiAgICB0cnkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBhd2FpdCBvcGVuUm91dGVyQ2FsbCh7IG1vZGVsLCBtZXNzYWdlcywgb3B0aW9ucywgb25Db3N0LCByZXRyaWVzOiAwIH0pO1xuICAgICAgICBsZXQgcmVzdWx0ID0gcGFyc2VZQU1MKHJlc3BvbnNlKSBhcyBUO1xuICAgICAgICBjb25maWcudmFsaWRhdGU/LihyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChyZXRyaWVzID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHlhbWxPcGVuUm91dGVyQ2FsbDxUPih7IG1vZGVsLCBtZXNzYWdlcywgcmV0cmllczogcmV0cmllcyAtIDEsIG9uQ29zdCB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaW1wbGVBSUNhbGwobW9kZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgb3BlblJvdXRlckNhbGxCYXNlKHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIG1lc3NhZ2VzOiBbeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogbWVzc2FnZSB9XSxcbiAgICB9KTtcbn1cbi8qKiBUaGUgbWVzc2FnZSBtdXN0IHJlcXVlc3QgdGhlIHJlc3VsdCB0byBiZSByZXR1cm5lZCBpbiBZQU1MICh3ZSBhdXRvbWF0aWNhbGx5IHBhcnNlIHRoaXMgYW5kIHJldHVybiBhbiBvYmplY3QpLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpbXBsZUFJQ2FsbFR5cGVkPFQ+KG1vZGVsOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBhd2FpdCB5YW1sT3BlblJvdXRlckNhbGwoe1xuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiBtZXNzYWdlIH1dLFxuICAgIH0pIGFzIFQ7XG59XG5cbmxldCBwZW5kaW5nTG9nOiB7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICBkdXJhdGlvbjogbnVtYmVyO1xuICAgIGNvc3Q6IG51bWJlcjtcbn0gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuUm91dGVyQ2FsbChjb25maWc6IHtcbiAgICBtb2RlbDogc3RyaW5nO1xuICAgIG1lc3NhZ2VzOiBNZXNzYWdlSGlzdG9yeTtcbiAgICBvcHRpb25zPzogT3BlblJvdXRlck9wdGlvbnM7XG4gICAgb25Db3N0PzogKGNvc3Q6IG51bWJlcikgPT4gdm9pZDtcbiAgICByZXRyaWVzPzogbnVtYmVyO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIGF3YWl0IG9wZW5Sb3V0ZXJDYWxsQmFzZShjb25maWcpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblJvdXRlckNhbGxCYXNlKGNvbmZpZzoge1xuICAgIG1vZGVsOiBzdHJpbmc7XG4gICAgbWVzc2FnZXM6IE1lc3NhZ2VIaXN0b3J5MjtcbiAgICBvcHRpb25zPzogT3BlblJvdXRlck9wdGlvbnM7XG4gICAgb25Db3N0PzogKGNvc3Q6IG51bWJlcikgPT4gdm9pZDtcbiAgICByZXRyaWVzPzogbnVtYmVyO1xufSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHsgbW9kZWwsIG1lc3NhZ2VzLCBvcHRpb25zLCBvbkNvc3QgfSA9IGNvbmZpZztcbiAgICBsZXQgb3BlbnJvdXRlcktleSA9IG9wdGlvbnM/LmFwaUtleSB8fCBhd2FpdCBnZXRBUElLZXkoXCJvcGVucm91dGVyLmpzb25cIik7XG4gICAgY29uc29sZS5sb2coYENhbGxpbmcgJHttb2RlbH0gd2l0aCAke21lc3NhZ2VzLmxlbmd0aH0gbWVzc2FnZXNgKTtcbiAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgbGV0IHN0aWxsUnVubmluZyA9IHRydWU7XG5cbiAgICAvLyBTcGF3biBtb25pdG9yaW5nIGxvb3BcbiAgICB2b2lkIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlIChzdGlsbFJ1bm5pbmcpIHtcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSk7XG4gICAgICAgICAgICBpZiAoc3RpbGxSdW5uaW5nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJPcGVuUm91dGVyIGNhbGwgc3RpbGwgcnVubmluZy4uLlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmV0cnlGdW5jdGlvbmFsKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGxldCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFwiaHR0cHM6Ly9vcGVucm91dGVyLmFpL2FwaS92MS9jaGF0L2NvbXBsZXRpb25zXCIsIHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IGBCZWFyZXIgJHtvcGVucm91dGVyS2V5fWAsXG4gICAgICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzb3J0OiBcInRocm91Z2hwdXRcIixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdXNhZ2U6IHsgaW5jbHVkZTogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIGl0IGZhaWxlZCwgdGhyb3dcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXNwb25zZVRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY2FsbCBPcGVuUm91dGVyOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSAke3Jlc3BvbnNlVGV4dH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKSBhcyB7XG4gICAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICAgICAgY29zdDogbnVtYmVyO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgY2hvaWNlczoge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVtdO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuZXdDb3N0ID0gcmVzcG9uc2VPYmoudXNhZ2UuY29zdDtcbiAgICAgICAgICAgIHRvdGFsQ29zdCArPSBuZXdDb3N0O1xuICAgICAgICAgICAgb25Db3N0Py4obmV3Q29zdCk7XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmdMb2cpIHtcbiAgICAgICAgICAgICAgICBwZW5kaW5nTG9nID0ge1xuICAgICAgICAgICAgICAgICAgICBjb3VudDogMCxcbiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDAsXG4gICAgICAgICAgICAgICAgICAgIGNvc3Q6IDAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxvZyA9IHBlbmRpbmdMb2c7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbG9nKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBSYW46ICR7bG9nLmNvdW50fSBjYWxscyBhdCBhIHRvdGFsIHN1bW1lZCBjb3N0IG9mICR7Zm9ybWF0TnVtYmVyKDEgLyBsb2cuY29zdCl9L1VTRGApO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTG9nID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0sIDEwXzAwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwZW5kaW5nTG9nLmNvdW50Kys7XG4gICAgICAgICAgICBwZW5kaW5nTG9nLmR1cmF0aW9uICs9IERhdGUubm93KCkgLSB0aW1lO1xuICAgICAgICAgICAgcGVuZGluZ0xvZy5jb3N0ICs9IG5ld0Nvc3Q7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmouY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnQgYXMgc3RyaW5nO1xuICAgICAgICB9LCB7IG1heFJldHJpZXM6IGNvbmZpZy5yZXRyaWVzIHx8IDMgfSkoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgICBzdGlsbFJ1bm5pbmcgPSBmYWxzZTtcbiAgICB9XG59XG4iXX0=
|
|
119
|
+
/* _JS_SOURCE_HASH = "29f9508fae589e294847d9f6787f804824093b8193621bf6749e0cde3607329d"; */
|