litescrape-sdk 0.1.0

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.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +283 -0
  3. package/dist/cjs/batch.d.ts +12 -0
  4. package/dist/cjs/batch.d.ts.map +1 -0
  5. package/dist/cjs/batch.js +131 -0
  6. package/dist/cjs/batch.js.map +1 -0
  7. package/dist/cjs/cache.d.ts +21 -0
  8. package/dist/cjs/cache.d.ts.map +1 -0
  9. package/dist/cjs/cache.js +112 -0
  10. package/dist/cjs/cache.js.map +1 -0
  11. package/dist/cjs/client.d.ts +38 -0
  12. package/dist/cjs/client.d.ts.map +1 -0
  13. package/dist/cjs/client.js +143 -0
  14. package/dist/cjs/client.js.map +1 -0
  15. package/dist/cjs/errors.d.ts +53 -0
  16. package/dist/cjs/errors.d.ts.map +1 -0
  17. package/dist/cjs/errors.js +121 -0
  18. package/dist/cjs/errors.js.map +1 -0
  19. package/dist/cjs/index.d.ts +8 -0
  20. package/dist/cjs/index.d.ts.map +1 -0
  21. package/dist/cjs/index.js +40 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/models.d.ts +1735 -0
  24. package/dist/cjs/models.d.ts.map +1 -0
  25. package/dist/cjs/models.js +389 -0
  26. package/dist/cjs/models.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/result.d.ts +23 -0
  29. package/dist/cjs/result.d.ts.map +1 -0
  30. package/dist/cjs/result.js +49 -0
  31. package/dist/cjs/result.js.map +1 -0
  32. package/dist/cjs/runtime.d.ts +53 -0
  33. package/dist/cjs/runtime.d.ts.map +1 -0
  34. package/dist/cjs/runtime.js +237 -0
  35. package/dist/cjs/runtime.js.map +1 -0
  36. package/dist/cjs/stores.d.ts +143 -0
  37. package/dist/cjs/stores.d.ts.map +1 -0
  38. package/dist/cjs/stores.js +194 -0
  39. package/dist/cjs/stores.js.map +1 -0
  40. package/dist/cjs/validation.d.ts +65 -0
  41. package/dist/cjs/validation.d.ts.map +1 -0
  42. package/dist/cjs/validation.js +122 -0
  43. package/dist/cjs/validation.js.map +1 -0
  44. package/dist/cjs/version.d.ts +2 -0
  45. package/dist/cjs/version.d.ts.map +1 -0
  46. package/dist/cjs/version.js +5 -0
  47. package/dist/cjs/version.js.map +1 -0
  48. package/dist/esm/batch.d.ts +12 -0
  49. package/dist/esm/batch.d.ts.map +1 -0
  50. package/dist/esm/batch.js +128 -0
  51. package/dist/esm/batch.js.map +1 -0
  52. package/dist/esm/cache.d.ts +21 -0
  53. package/dist/esm/cache.d.ts.map +1 -0
  54. package/dist/esm/cache.js +106 -0
  55. package/dist/esm/cache.js.map +1 -0
  56. package/dist/esm/client.d.ts +38 -0
  57. package/dist/esm/client.d.ts.map +1 -0
  58. package/dist/esm/client.js +138 -0
  59. package/dist/esm/client.js.map +1 -0
  60. package/dist/esm/errors.d.ts +53 -0
  61. package/dist/esm/errors.d.ts.map +1 -0
  62. package/dist/esm/errors.js +106 -0
  63. package/dist/esm/errors.js.map +1 -0
  64. package/dist/esm/index.d.ts +8 -0
  65. package/dist/esm/index.d.ts.map +1 -0
  66. package/dist/esm/index.js +6 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/models.d.ts +1735 -0
  69. package/dist/esm/models.d.ts.map +1 -0
  70. package/dist/esm/models.js +384 -0
  71. package/dist/esm/models.js.map +1 -0
  72. package/dist/esm/result.d.ts +23 -0
  73. package/dist/esm/result.d.ts.map +1 -0
  74. package/dist/esm/result.js +45 -0
  75. package/dist/esm/result.js.map +1 -0
  76. package/dist/esm/runtime.d.ts +53 -0
  77. package/dist/esm/runtime.d.ts.map +1 -0
  78. package/dist/esm/runtime.js +226 -0
  79. package/dist/esm/runtime.js.map +1 -0
  80. package/dist/esm/stores.d.ts +143 -0
  81. package/dist/esm/stores.d.ts.map +1 -0
  82. package/dist/esm/stores.js +190 -0
  83. package/dist/esm/stores.js.map +1 -0
  84. package/dist/esm/validation.d.ts +65 -0
  85. package/dist/esm/validation.d.ts.map +1 -0
  86. package/dist/esm/validation.js +109 -0
  87. package/dist/esm/validation.js.map +1 -0
  88. package/dist/esm/version.d.ts +2 -0
  89. package/dist/esm/version.d.ts.map +1 -0
  90. package/dist/esm/version.js +2 -0
  91. package/dist/esm/version.js.map +1 -0
  92. package/package.json +74 -0
  93. package/src/batch.ts +158 -0
  94. package/src/cache.ts +123 -0
  95. package/src/client.ts +199 -0
  96. package/src/errors.ts +120 -0
  97. package/src/index.ts +17 -0
  98. package/src/models.ts +570 -0
  99. package/src/package.json +3 -0
  100. package/src/result.ts +49 -0
  101. package/src/runtime.ts +255 -0
  102. package/src/stores.ts +206 -0
  103. package/src/validation.ts +140 -0
  104. package/src/version.ts +1 -0
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ export declare const optional: <S extends z.ZodType>(schema: S) => z.ZodOptional<z.ZodNullable<S>>;
3
+ export declare const text: z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBigInt]>, z.ZodTransform<string, string | number | bigint>>;
4
+ export declare const number: z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodPipe<z.ZodBoolean, z.ZodTransform<number, boolean>>]>, z.ZodNumber>;
5
+ export declare const integer: z.ZodPipe<z.ZodPipe<z.ZodUnion<readonly [z.ZodNumber, z.ZodPipe<z.ZodString, z.ZodTransform<number, string>>, z.ZodPipe<z.ZodBoolean, z.ZodTransform<number, boolean>>]>, z.ZodNumber>, z.ZodNumber>;
6
+ export declare const boolean: z.ZodPipe<z.ZodUnion<readonly [z.ZodBoolean, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodPipe<z.ZodString, z.ZodEnum<{
7
+ 0: "0";
8
+ 1: "1";
9
+ f: "f";
10
+ false: "false";
11
+ n: "n";
12
+ no: "no";
13
+ off: "off";
14
+ on: "on";
15
+ t: "t";
16
+ true: "true";
17
+ y: "y";
18
+ yes: "yes";
19
+ }>>]>, z.ZodTransform<boolean, "0" | "1" | "f" | "false" | "n" | "no" | "off" | "on" | "t" | "true" | "y" | "yes" | 0 | 1 | boolean>>;
20
+ export declare const flag: z.ZodPipe<z.ZodUnion<readonly [z.ZodEnum<{
21
+ 0: "0";
22
+ 1: "1";
23
+ }>, z.ZodLiteral<0>, z.ZodLiteral<1>, z.ZodBoolean]>, z.ZodTransform<"0" | "1", "0" | "1" | 0 | 1 | boolean>>;
24
+ export declare const strictBoolean: z.ZodUnion<readonly [z.ZodBoolean, z.ZodEnum<{
25
+ false: "false";
26
+ true: "true";
27
+ }>]>;
28
+ export declare const timeoutSeconds: z.ZodNumber;
29
+ export declare const device: z.ZodEnum<{
30
+ desktop: "desktop";
31
+ mobile: "mobile";
32
+ tablet: "tablet";
33
+ }>;
34
+ type Params = Record<string, unknown>;
35
+ export type Rule = (params: Params, context: z.RefinementCtx) => void;
36
+ export declare const issue: (context: z.RefinementCtx, message: string, path?: string[]) => void;
37
+ export declare const has: (params: Params, field: string) => boolean;
38
+ export declare const requireAny: (...fields: string[]) => Rule;
39
+ export declare const exactlyOne: (...fields: string[]) => Rule;
40
+ export declare const atMostOne: (...fields: string[]) => Rule;
41
+ export declare const paired: (a: string, b: string) => Rule;
42
+ export declare const requires: (field: string, dependency: string) => Rule;
43
+ /** Validated, immutable request. Construct an endpoint class or pass a plain object to scrape. */
44
+ export declare class ScrapeRequest<E extends string = string> {
45
+ #private;
46
+ readonly endpoint: E;
47
+ readonly timeout?: number | null;
48
+ constructor(path: string, params: object & {
49
+ endpoint: E;
50
+ }, prototype?: object);
51
+ get path(): string;
52
+ queryParams(): Record<string, string>;
53
+ query_params(): Record<string, string>;
54
+ /** Copy a validated request with a default deadline without revalidating its cursor context. */
55
+ withTimeout(timeout: number): this;
56
+ }
57
+ export interface RequestClass<E extends string, Input, Output> {
58
+ new (params: Input): ScrapeRequest<E> & Readonly<Output>;
59
+ readonly endpoint: E;
60
+ readonly path: string;
61
+ readonly parameters: readonly string[];
62
+ }
63
+ export declare function defineRequest<E extends string, Shape extends z.ZodRawShape>(endpoint: E, path: string, shape: Shape, rules?: Rule[]): RequestClass<E, z.input<z.ZodObject<Shape>>, z.output<z.ZodObject<Shape>>>;
64
+ export {};
65
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,CAAC,CAAC,OAAO,UAAU,CAAC,oCAAqB,CAAC;AAC7E,eAAO,MAAM,IAAI,2HAA2E,CAAC;AAC7F,eAAO,MAAM,MAAM,8KAUS,CAAC;AAC7B,eAAO,MAAM,OAAO,sMAAgC,CAAC;AACrD,eAAO,MAAM,OAAO;;;;;;;;;;;;;qIAUkE,CAAC;AACvF,eAAO,MAAM,IAAI;;;6GAE0F,CAAC;AAC5G,eAAO,MAAM,aAAa;;;IAAoD,CAAC;AAC/E,eAAO,MAAM,cAAc,aAAoC,CAAC;AAChE,eAAO,MAAM,MAAM;;;;EAA0C,CAAC;AAE9D,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACtC,MAAM,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,KAAK,IAAI,CAAC;AACtE,eAAO,MAAM,KAAK,YAAa,CAAC,CAAC,aAAa,WAAW,MAAM,SAAQ,MAAM,EAAE,SAC1B,CAAC;AACtD,eAAO,MAAM,GAAG,WAAY,MAAM,SAAS,MAAM,YAA0D,CAAC;AAC5G,eAAO,MAAM,UAAU,cACT,MAAM,EAAE,KAAG,IAGtB,CAAC;AACJ,eAAO,MAAM,UAAU,cACT,MAAM,EAAE,KAAG,IAItB,CAAC;AACJ,eAAO,MAAM,SAAS,cACR,MAAM,EAAE,KAAG,IAItB,CAAC;AACJ,eAAO,MAAM,MAAM,MACb,MAAM,KAAK,MAAM,KAAG,IAGvB,CAAC;AACJ,eAAO,MAAM,QAAQ,UACX,MAAM,cAAc,MAAM,KAAG,IAGpC,CAAC;AAEJ,kGAAkG;AAClG,qBAAa,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;;IAClD,SAAiB,QAAQ,EAAE,CAAC,CAAC;IAC7B,SAAiB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGzC,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,CAAC,CAAA;KAAE,EAAE,SAAS,CAAC,EAAE,MAAM,EAK7E;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAMpC;IAED,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAErC;IAED,gGAAgG;IAChG,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjC;CACF;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM;IAC3D,KAAK,MAAM,EAAE,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAED,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,SAAS,CAAC,CAAC,WAAW,EACzE,QAAQ,EAAE,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,KAAK,EACZ,KAAK,GAAE,IAAI,EAAO,GACjB,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAuB5E"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScrapeRequest = exports.requires = exports.paired = exports.atMostOne = exports.exactlyOne = exports.requireAny = exports.has = exports.issue = exports.device = exports.timeoutSeconds = exports.strictBoolean = exports.flag = exports.boolean = exports.integer = exports.number = exports.text = exports.optional = void 0;
4
+ exports.defineRequest = defineRequest;
5
+ const zod_1 = require("zod");
6
+ const errors_js_1 = require("./errors.js");
7
+ const optional = (schema) => schema.nullish();
8
+ exports.optional = optional;
9
+ exports.text = zod_1.z.union([zod_1.z.string(), zod_1.z.number().finite(), zod_1.z.bigint()]).transform(String);
10
+ exports.number = zod_1.z
11
+ .union([
12
+ zod_1.z.number(),
13
+ zod_1.z
14
+ .string()
15
+ .trim()
16
+ .regex(/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$/)
17
+ .transform(Number),
18
+ zod_1.z.boolean().transform(Number),
19
+ ])
20
+ .pipe(zod_1.z.number().finite());
21
+ exports.integer = exports.number.pipe(zod_1.z.number().int());
22
+ exports.boolean = zod_1.z
23
+ .union([
24
+ zod_1.z.boolean(),
25
+ zod_1.z.literal(0),
26
+ zod_1.z.literal(1),
27
+ zod_1.z
28
+ .string()
29
+ .toLowerCase()
30
+ .pipe(zod_1.z.enum(["0", "1", "true", "false", "yes", "no", "on", "off", "t", "f", "y", "n"])),
31
+ ])
32
+ .transform((value) => [true, 1, "1", "true", "yes", "on", "t", "y"].includes(value));
33
+ exports.flag = zod_1.z
34
+ .union([zod_1.z.enum(["0", "1"]), zod_1.z.literal(0), zod_1.z.literal(1), zod_1.z.boolean()])
35
+ .transform((value) => (value === true || value === 1 || value === "1" ? "1" : "0"));
36
+ exports.strictBoolean = zod_1.z.union([zod_1.z.boolean(), zod_1.z.enum(["true", "false"])]);
37
+ exports.timeoutSeconds = zod_1.z.number().finite().gt(0).max(90);
38
+ exports.device = zod_1.z.enum(["desktop", "tablet", "mobile"]);
39
+ const issue = (context, message, path = []) => context.addIssue({ code: "custom", message, path });
40
+ exports.issue = issue;
41
+ const has = (params, field) => params[field] !== null && params[field] !== undefined;
42
+ exports.has = has;
43
+ const requireAny = (...fields) => (p, c) => {
44
+ if (!fields.some((f) => (0, exports.has)(p, f)))
45
+ (0, exports.issue)(c, `one of ${fields.join(", ")} is required`);
46
+ };
47
+ exports.requireAny = requireAny;
48
+ const exactlyOne = (...fields) => (p, c) => {
49
+ if (fields.filter((f) => (0, exports.has)(p, f)).length !== 1)
50
+ (0, exports.issue)(c, `exactly one of ${fields.join(", ")} is required`);
51
+ };
52
+ exports.exactlyOne = exactlyOne;
53
+ const atMostOne = (...fields) => (p, c) => {
54
+ const found = fields.filter((f) => (0, exports.has)(p, f));
55
+ if (found.length > 1)
56
+ (0, exports.issue)(c, `${found.join(" and ")} cannot be combined`);
57
+ };
58
+ exports.atMostOne = atMostOne;
59
+ const paired = (a, b) => (p, c) => {
60
+ if ((0, exports.has)(p, a) !== (0, exports.has)(p, b))
61
+ (0, exports.issue)(c, `${a} and ${b} must be given together`);
62
+ };
63
+ exports.paired = paired;
64
+ const requires = (field, dependency) => (p, c) => {
65
+ if ((0, exports.has)(p, field) && !(0, exports.has)(p, dependency))
66
+ (0, exports.issue)(c, `${field} requires ${dependency}`);
67
+ };
68
+ exports.requires = requires;
69
+ /** Validated, immutable request. Construct an endpoint class or pass a plain object to scrape. */
70
+ class ScrapeRequest {
71
+ #path;
72
+ constructor(path, params, prototype) {
73
+ this.#path = path;
74
+ Object.assign(this, params);
75
+ if (prototype)
76
+ Object.setPrototypeOf(this, prototype);
77
+ Object.freeze(this);
78
+ }
79
+ get path() {
80
+ return this.#path;
81
+ }
82
+ queryParams() {
83
+ return Object.fromEntries(Object.entries(this)
84
+ .filter(([key, value]) => key !== "endpoint" && value != null)
85
+ .map(([key, value]) => [key, String(value)]));
86
+ }
87
+ query_params() {
88
+ return this.queryParams();
89
+ }
90
+ /** Copy a validated request with a default deadline without revalidating its cursor context. */
91
+ withTimeout(timeout) {
92
+ const checked = exports.timeoutSeconds.parse(timeout);
93
+ return new ScrapeRequest(this.path, { ...this, timeout: checked }, Object.getPrototypeOf(this));
94
+ }
95
+ }
96
+ exports.ScrapeRequest = ScrapeRequest;
97
+ function defineRequest(endpoint, path, shape, rules = []) {
98
+ const schema = zod_1.z.strictObject(shape).superRefine((params, ctx) => {
99
+ for (const rule of rules)
100
+ rule(params, ctx);
101
+ });
102
+ class Request extends ScrapeRequest {
103
+ static endpoint = endpoint;
104
+ static path = path;
105
+ static parameters = Object.freeze(Object.keys(shape));
106
+ constructor(params) {
107
+ const result = schema.safeParse(params);
108
+ if (!result.success)
109
+ throw new errors_js_1.ValidationError([
110
+ [
111
+ 0,
112
+ result.error.issues
113
+ .map((i) => `${i.path.join(".")}${i.path.length ? ": " : ""}${i.message}`)
114
+ .join("; "),
115
+ ],
116
+ ]);
117
+ super(path, { ...result.data, endpoint });
118
+ }
119
+ }
120
+ return Request;
121
+ }
122
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VERSION = void 0;
4
+ exports.VERSION = "0.1.0";
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { AnyRequest } from "./models.js";
2
+ import { Result } from "./result.js";
3
+ import { type RuntimeOptions } from "./runtime.js";
4
+ interface BatchOptions extends RuntimeOptions {
5
+ concurrency?: number;
6
+ useCache: boolean;
7
+ cachePath?: string;
8
+ onResult: (result: Result) => void;
9
+ }
10
+ export declare function runBatch(items: readonly AnyRequest[], options: BatchOptions): Promise<Result[]>;
11
+ export {};
12
+ //# sourceMappingURL=batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/batch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAOL,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAEtB,UAAU,YAAa,SAAQ,cAAc;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAGD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuIrG"}
@@ -0,0 +1,128 @@
1
+ import { APIError, TransportError, apiError, isObject } from "./errors.js";
2
+ import { JobCache, cacheKeys, newId } from "./cache.js";
3
+ import { Result } from "./result.js";
4
+ import { Semaphore, backoff, each, requestWithRetries, sleep, } from "./runtime.js";
5
+ export async function runBatch(items, options) {
6
+ options.signal?.throwIfAborted();
7
+ const cache = new JobCache(options.cachePath);
8
+ const keys = cacheKeys(items, options.apiKey, options.baseUrl);
9
+ const limit = options.concurrency ?? 32;
10
+ const semaphores = [new Semaphore(limit)];
11
+ const started = performance.now();
12
+ const batchKey = newId();
13
+ const indices = items.map((_, i) => i);
14
+ const results = new Array(items.length);
15
+ try {
16
+ const entries = cache.prepareMany(keys, options.useCache, batchKey, items.length);
17
+ const pollOnce = (jobId) => requestWithRetries(`/api/batch/jobs/${encodeURIComponent(jobId)}`, { ...options, semaphores });
18
+ const replace = (index) => cache.prepareMany([keys[index]], false, batchKey, items.length)[0];
19
+ const submit = async (index, replaceExpired = false) => {
20
+ let entry = replaceExpired ? replace(index) : entries[index];
21
+ if (entry.job_id) {
22
+ const outcome = await pollOnce(entry.job_id);
23
+ // Only positive evidence of expiry/missing jobs permits a fresh reservation.
24
+ if ((!outcome.error && outcome.data?.state !== "expired") ||
25
+ (outcome.error && ![404, 410].includes(outcome.statusCode ?? 0)))
26
+ return { entry, outcome };
27
+ entry = replace(index);
28
+ }
29
+ const outcome = await requestWithRetries(items[index].path + "/async", {
30
+ ...options,
31
+ semaphores,
32
+ method: "POST",
33
+ body: items[index].queryParams(),
34
+ acceptedStatuses: [200, 202],
35
+ headers: {
36
+ "Idempotency-Key": entry.submission,
37
+ "X-Litescrape-Batch-ID": entry.batch_key,
38
+ "X-Litescrape-Batch-Size": String(entry.batch_size),
39
+ },
40
+ });
41
+ if (!outcome.error) {
42
+ const job = outcome.data;
43
+ if (typeof job.job_id !== "string" || !job.job_id)
44
+ outcome.error = new TransportError("Batch submission returned no job ID.", { retryable: true });
45
+ else {
46
+ entry.job_id = job.job_id;
47
+ cache.save(keys[index], entry.submission, job.job_id, job.expires_at);
48
+ if (job.state === "expired" && options.useCache && !replaceExpired)
49
+ return submit(index, true);
50
+ }
51
+ }
52
+ return { entry, outcome };
53
+ };
54
+ const submissions = new Array(items.length);
55
+ await each(indices, limit, async (index) => {
56
+ submissions[index] = await submit(index);
57
+ });
58
+ const resolve = (index, { entry, outcome }) => {
59
+ if (!outcome.error) {
60
+ const job = outcome.data;
61
+ if (typeof job.job_id !== "string" || !job.job_id || job.job_id !== entry.job_id) {
62
+ outcome.error = new TransportError("Batch job returned an invalid job ID.", { retryable: false });
63
+ }
64
+ else if (job.state === "succeeded" || job.state === "failed") {
65
+ const status = job.status_code;
66
+ const payload = job.response;
67
+ if (typeof status !== "number" ||
68
+ !Number.isInteger(status) ||
69
+ status < 100 ||
70
+ status > 599 ||
71
+ !isObject(payload) ||
72
+ (job.state === "succeeded") !== (status === 200)) {
73
+ outcome.error = new TransportError("Batch job returned an invalid response.", {
74
+ retryable: false,
75
+ });
76
+ }
77
+ else {
78
+ cache.save(keys[index], entry.submission, job.job_id, job.expires_at);
79
+ return new Result(index, items[index], {
80
+ data: status === 200 ? payload : null,
81
+ error: status === 200 ? null : apiError(status, payload),
82
+ statusCode: status,
83
+ requestId: job.job_id,
84
+ attempts: outcome.attempts,
85
+ }, (performance.now() - started) / 1000, job.job_id);
86
+ }
87
+ }
88
+ else if (job.state === "expired") {
89
+ outcome.error = new APIError("The retained batch response expired.", {
90
+ statusCode: 410,
91
+ errorCode: "job_expired",
92
+ requestId: entry.job_id ?? "",
93
+ });
94
+ outcome.statusCode = 410;
95
+ }
96
+ else if (job.state === "queued" || job.state === "running")
97
+ return null;
98
+ else
99
+ outcome.error = new TransportError("Batch job returned an unknown state.", { retryable: false });
100
+ }
101
+ return new Result(index, items[index], { ...outcome, data: null, requestId: entry.job_id ?? outcome.requestId }, (performance.now() - started) / 1000, entry.job_id ?? "");
102
+ };
103
+ let pending = indices;
104
+ let polls = 0;
105
+ while (pending.length) {
106
+ await each(pending, limit, async (index) => {
107
+ let result = resolve(index, submissions[index]);
108
+ if (!result) {
109
+ const entry = submissions[index].entry;
110
+ submissions[index] = { entry, outcome: await pollOnce(entry.job_id) };
111
+ result = resolve(index, submissions[index]);
112
+ }
113
+ if (result) {
114
+ results[index] = result;
115
+ options.onResult(result);
116
+ }
117
+ });
118
+ pending = pending.filter((index) => !results[index]);
119
+ if (pending.length)
120
+ await sleep(backoff(++polls), options.signal);
121
+ }
122
+ return results;
123
+ }
124
+ finally {
125
+ cache.close();
126
+ }
127
+ }
128
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { AnyRequest } from "./models.js";
2
+ export interface CacheEntry {
3
+ submission: string;
4
+ job_id: string | null;
5
+ batch_key: string;
6
+ batch_size: number;
7
+ }
8
+ export declare const newId: () => string;
9
+ /** Fingerprints include the key, origin, all parameters, and duplicate occurrence. */
10
+ export declare function cacheKeys(items: readonly AnyRequest[], apiKey: string, baseUrl: string): string[];
11
+ /** SQLite FULL commits persist the entire workload before its first POST. */
12
+ export declare class JobCache {
13
+ readonly path: string;
14
+ private readonly db;
15
+ constructor(path?: string);
16
+ private transaction;
17
+ prepareMany(keys: readonly string[], useCache: boolean, batchKey: string, batchSize: number): CacheEntry[];
18
+ save(key: string, submission: string, jobId: string, expiresAt?: unknown): void;
19
+ close(): void;
20
+ }
21
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AACD,eAAO,MAAM,KAAK,QAAO,MAA0C,CAAC;AAGpE,sFAAsF;AACtF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAejG;AAED,6EAA6E;AAC7E,qBAAa,QAAQ;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAe;IAElC,YAAY,IAAI,CAAC,EAAE,MAAM,EAyBxB;IAED,OAAO,CAAC,WAAW;IAYnB,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE,CAgCzG;IAED,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAK9E;IAED,KAAK,IAAI,IAAI,CAEZ;CACF"}
@@ -0,0 +1,106 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { chmodSync, mkdirSync } from "node:fs";
3
+ import { homedir } from "node:os";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { DatabaseSync } from "node:sqlite";
6
+ export const newId = () => randomUUID().replaceAll("-", "");
7
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
8
+ /** Fingerprints include the key, origin, all parameters, and duplicate occurrence. */
9
+ export function cacheKeys(items, apiKey, baseUrl) {
10
+ const identity = hash(apiKey);
11
+ const occurrences = new Map();
12
+ return items.map((item) => {
13
+ const params = item.queryParams();
14
+ const sorted = Object.fromEntries(Object.keys(params)
15
+ .sort()
16
+ .map((key) => [key, params[key]]));
17
+ const canonical = JSON.stringify([identity, baseUrl, item.path, sorted]);
18
+ const occurrence = occurrences.get(canonical) ?? 0;
19
+ occurrences.set(canonical, occurrence + 1);
20
+ return hash(`${canonical}:${occurrence}`);
21
+ });
22
+ }
23
+ /** SQLite FULL commits persist the entire workload before its first POST. */
24
+ export class JobCache {
25
+ path;
26
+ db;
27
+ constructor(path) {
28
+ this.path = resolve(path || process.env.LITESCRAPE_JOB_CACHE || join(homedir(), ".cache", "litescrape", "jobs-ts.sqlite3"));
29
+ mkdirSync(dirname(this.path), { recursive: true, mode: 0o700 });
30
+ this.db = new DatabaseSync(this.path);
31
+ try {
32
+ if (process.platform !== "win32")
33
+ chmodSync(this.path, 0o600);
34
+ this.db.exec(`PRAGMA busy_timeout=30000; PRAGMA journal_mode=WAL; PRAGMA synchronous=FULL;
35
+ CREATE TABLE IF NOT EXISTS jobs (
36
+ cache_key TEXT PRIMARY KEY, submission TEXT NOT NULL, job_id TEXT,
37
+ expires_at TEXT, updated_at REAL NOT NULL
38
+ );`);
39
+ this.transaction(() => {
40
+ const columns = this.db
41
+ .prepare("PRAGMA table_info(jobs)")
42
+ .all()
43
+ .map((row) => row.name);
44
+ if (!columns.includes("batch_key"))
45
+ this.db.exec("ALTER TABLE jobs ADD COLUMN batch_key TEXT");
46
+ if (!columns.includes("batch_size"))
47
+ this.db.exec("ALTER TABLE jobs ADD COLUMN batch_size INTEGER");
48
+ });
49
+ }
50
+ catch (error) {
51
+ this.db.close();
52
+ throw error;
53
+ }
54
+ }
55
+ transaction(operation) {
56
+ this.db.exec("BEGIN IMMEDIATE");
57
+ try {
58
+ const result = operation();
59
+ this.db.exec("COMMIT");
60
+ return result;
61
+ }
62
+ catch (error) {
63
+ this.db.exec("ROLLBACK");
64
+ throw error;
65
+ }
66
+ }
67
+ prepareMany(keys, useCache, batchKey, batchSize) {
68
+ return this.transaction(() => keys.map((key) => {
69
+ const row = this.db
70
+ .prepare("SELECT submission,job_id,batch_key,batch_size FROM jobs WHERE cache_key=?")
71
+ .get(key);
72
+ if (useCache && row) {
73
+ if (!row.batch_key) {
74
+ row.batch_key = batchKey;
75
+ row.batch_size = batchSize;
76
+ this.db
77
+ .prepare("UPDATE jobs SET batch_key=?,batch_size=? WHERE cache_key=?")
78
+ .run(batchKey, batchSize, key);
79
+ }
80
+ return row;
81
+ }
82
+ const entry = {
83
+ submission: newId(),
84
+ job_id: null,
85
+ batch_key: batchKey,
86
+ batch_size: batchSize,
87
+ };
88
+ this.db
89
+ .prepare(`INSERT INTO jobs(cache_key,submission,updated_at,batch_key,batch_size) VALUES (?,?,?,?,?)
90
+ ON CONFLICT(cache_key) DO UPDATE SET submission=excluded.submission,job_id=NULL,expires_at=NULL,
91
+ updated_at=excluded.updated_at,batch_key=excluded.batch_key,batch_size=excluded.batch_size`)
92
+ .run(key, entry.submission, Date.now() / 1000, batchKey, batchSize);
93
+ return entry;
94
+ }));
95
+ }
96
+ save(key, submission, jobId, expiresAt) {
97
+ // A concurrent fresh run can replace a slot; its submission must not be overwritten.
98
+ this.db
99
+ .prepare("UPDATE jobs SET job_id=?,expires_at=?,updated_at=? WHERE cache_key=? AND submission=?")
100
+ .run(jobId, typeof expiresAt === "string" ? expiresAt : null, Date.now() / 1000, key, submission);
101
+ }
102
+ close() {
103
+ this.db.close();
104
+ }
105
+ }
106
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type KeyStatus, type RequestItem } from "./models.js";
2
+ import { Result } from "./result.js";
3
+ import { type Fetch } from "./runtime.js";
4
+ export interface ClientOptions {
5
+ /** Defaults to LITESCRAPE_API_KEY. */
6
+ apiKey?: string;
7
+ /** Defaults to LITESCRAPE_API_URL or https://api.litescrape.com. */
8
+ baseUrl?: string;
9
+ /** Total transport attempts, including the first. Default: 5. */
10
+ attempts?: number;
11
+ /** HTTP transport timeout in seconds per attempt. Default: 120. */
12
+ timeout?: number;
13
+ /** Cancels local work; accepted durable jobs keep running on the server. */
14
+ signal?: AbortSignal;
15
+ /** Optional fetch implementation for custom transports and testing. */
16
+ fetch?: Fetch;
17
+ }
18
+ export interface ScrapeOptions extends ClientOptions {
19
+ /** Lowers the key's synchronous concurrency cap; batch requests default to 32. */
20
+ concurrency?: number;
21
+ /** Server deadline in seconds, >0 and <=90. An item's timeout overrides this. */
22
+ requestTimeout?: number;
23
+ batched?: boolean;
24
+ /** Resume saved durable jobs; requires batched: true. Default: false. */
25
+ useCache?: boolean;
26
+ /** Defaults to LITESCRAPE_JOB_CACHE or ~/.cache/litescrape/jobs-ts.sqlite3. */
27
+ cachePath?: string;
28
+ /** Called once per result in completion order. Returned results stay in input order. */
29
+ onProgress?: (completed: number, total: number, result: Result) => void;
30
+ }
31
+ /** Read the key's balance and limits. This endpoint is not billed. */
32
+ export declare function keyStatus(options?: ClientOptions): Promise<KeyStatus>;
33
+ /** Validate all inputs first, then return one Result per input, in input order. */
34
+ export declare function scrape(requests: readonly RequestItem[], options?: ScrapeOptions): Promise<Result[]>;
35
+ export declare const ascrape: typeof scrape;
36
+ export declare const key_status: typeof keyStatus;
37
+ export declare const akey_status: typeof keyStatus;
38
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAML,KAAK,KAAK,EAEX,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACzE;AAqDD,sEAAsE;AACtE,wBAAsB,SAAS,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,SAAS,CAAC,CAI/E;AAED,mFAAmF;AACnF,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CA4EnB;AAGD,eAAO,MAAM,OAAO,eAAS,CAAC;AAC9B,eAAO,MAAM,UAAU,kBAAY,CAAC;AACpC,eAAO,MAAM,WAAW,kBAAY,CAAC"}