@hadoku/jobplatform-worker 2.32.38 → 2.32.40

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.
@@ -1 +1 @@
1
- {"version":3,"file":"defaultProfile.d.ts","sourceRoot":"","sources":["../src/defaultProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACpD;AAED,eAAO,MAAM,eAAe,EAAE,kBAS7B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;kEACkE;AAClE,eAAO,MAAM,yBAAyB,EAAE,cAAc,EAUrD,CAAC"}
1
+ {"version":3,"file":"defaultProfile.d.ts","sourceRoot":"","sources":["../src/defaultProfile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;CACpD;AAED,eAAO,MAAM,eAAe,EAAE,kBAS7B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACrB;AAED;kEACkE;AAClE,eAAO,MAAM,yBAAyB,EAAE,cAAc,EAYrD,CAAC"}
package/dist/index.js CHANGED
@@ -2725,20 +2725,34 @@ app$4.openapi(ingestRoute, async (c) => {
2725
2725
  const accepted = inserted.filter(Boolean).length;
2726
2726
  const skipped = jobs.length - accepted;
2727
2727
  const seen = jobs.filter((_, i) => !inserted[i]);
2728
- const seenUrls = seen.map((j) => j.url);
2729
- const seenStmts = [];
2730
- const strippedStmts = [];
2731
- for (let i = 0; i < seenUrls.length; i += 90) {
2732
- const chunk = seenUrls.slice(i, i + 90);
2728
+ const SEEN_CHUNK = 45;
2729
+ const storedReads = [];
2730
+ for (let i = 0; i < seen.length; i += SEEN_CHUNK) {
2731
+ const chunk = seen.slice(i, i + SEEN_CHUNK);
2733
2732
  const inList = chunk.map(() => "?").join(",");
2734
- seenStmts.push(
2735
- db.prepare(`UPDATE jobs SET last_seen_at = ? WHERE url IN (${inList})`).bind(now, ...chunk)
2733
+ storedReads.push(
2734
+ db.prepare(
2735
+ `SELECT id, url, description = '' AS blank FROM jobs
2736
+ WHERE url IN (${inList}) OR id IN (${inList})`
2737
+ ).bind(...chunk.map((j) => j.url), ...chunk.map((j) => j.id))
2736
2738
  );
2737
- strippedStmts.push(
2738
- db.prepare(`SELECT url FROM jobs WHERE url IN (${inList}) AND description = ''`).bind(...chunk)
2739
+ }
2740
+ startTime(c, "seen");
2741
+ const stored = storedReads.length ? (await db.batch(storedReads)).flatMap(
2742
+ (r) => r.results
2743
+ ) : [];
2744
+ const byUrl = new Map(stored.map((r) => [r.url, r]));
2745
+ const byId = new Map(stored.map((r) => [r.id, r]));
2746
+ const writes = [];
2747
+ const sameUrl = seen.filter((j) => byUrl.has(j.url)).map((j) => j.url);
2748
+ for (let i = 0; i < sameUrl.length; i += 90) {
2749
+ const chunk = sameUrl.slice(i, i + 90);
2750
+ const inList = chunk.map(() => "?").join(",");
2751
+ writes.push(
2752
+ db.prepare(`UPDATE jobs SET last_seen_at = ? WHERE url IN (${inList})`).bind(now, ...chunk)
2739
2753
  );
2740
2754
  if (board_slug) {
2741
- seenStmts.push(
2755
+ writes.push(
2742
2756
  db.prepare(
2743
2757
  `UPDATE jobs SET slug = ?, slug_source = 'scraped'
2744
2758
  WHERE url IN (${inList})
@@ -2747,21 +2761,24 @@ app$4.openapi(ingestRoute, async (c) => {
2747
2761
  );
2748
2762
  }
2749
2763
  }
2750
- startTime(c, "seen");
2751
- if (seenStmts.length) await db.batch(seenStmts);
2752
- endTime(c, "seen");
2753
- startTime(c, "restore");
2754
- if (strippedStmts.length) {
2755
- const found = await db.batch(strippedStmts);
2756
- const stripped = new Set(found.flatMap((r) => r.results.map((row) => row.url)));
2757
- const restores = seen.filter((j) => stripped.has(j.url) && j.description !== "").map(
2758
- (j) => db.prepare(`UPDATE jobs SET description = ? WHERE url = ? AND description = ''`).bind(j.description, j.url)
2759
- );
2760
- for (let i = 0; i < restores.length; i += INGEST_BATCH_CHUNK) {
2761
- await db.batch(restores.slice(i, i + INGEST_BATCH_CHUNK));
2764
+ for (const j of seen) {
2765
+ const row = byId.get(j.id);
2766
+ if (!row || row.url === j.url) continue;
2767
+ writes.push(db.prepare("UPDATE jobs SET last_seen_at = ? WHERE id = ?").bind(now, row.id));
2768
+ writes.push(db.prepare("UPDATE OR IGNORE jobs SET url = ? WHERE id = ?").bind(j.url, row.id));
2769
+ }
2770
+ for (const j of seen) {
2771
+ const row = byUrl.get(j.url) ?? byId.get(j.id);
2772
+ if (row?.blank && j.description !== "") {
2773
+ writes.push(
2774
+ db.prepare(`UPDATE jobs SET description = ? WHERE id = ? AND description = ''`).bind(j.description, row.id)
2775
+ );
2762
2776
  }
2763
2777
  }
2764
- endTime(c, "restore");
2778
+ for (let i = 0; i < writes.length; i += INGEST_BATCH_CHUNK) {
2779
+ await db.batch(writes.slice(i, i + INGEST_BATCH_CHUNK));
2780
+ }
2781
+ endTime(c, "seen");
2765
2782
  if (accepted > 0) {
2766
2783
  startTime(c, "rank");
2767
2784
  await rankNewJobs(db);
@@ -3313,9 +3330,11 @@ const DEFAULT_PROFILE_COMPANIES = [
3313
3330
  { ats: "greenhouse", slug: "waymo", display_name: "Waymo" },
3314
3331
  { ats: "greenhouse", slug: "scaleai", display_name: "Scale AI" },
3315
3332
  { ats: "ashby", slug: "openai", display_name: "OpenAI" },
3316
- { ats: "lever", slug: "anyscale", display_name: "Anyscale" },
3317
- { ats: "lever", slug: "mistral", display_name: "Mistral" },
3318
- { ats: "lever", slug: "plaid", display_name: "Plaid" }
3333
+ // Anyscale and Plaid left Lever for Ashby, and Mistral left all three
3334
+ // ATS; the old Lever slugs 404ed and seeded every new profile with dead
3335
+ // boards (found 2026-11-09, still seeded on 2026-11-02).
3336
+ { ats: "ashby", slug: "anyscale", display_name: "Anyscale" },
3337
+ { ats: "ashby", slug: "plaid", display_name: "Plaid" }
3319
3338
  ];
3320
3339
  const DEFAULT_BASE_URL = "https://scraper.hadoku.me";
3321
3340
  class ScraperClientError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/routes/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAiB9E,UAAU,YAAY;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,EAAE,iBAAiB,CAAA;KAAE,CAAC;CAC9C;AAs7BD,eAAO,MAAM,YAAY,oCAAM,CAAC"}
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/routes/ingest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAiB9E,UAAU,YAAY;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QAAE,WAAW,EAAE,iBAAiB,CAAA;KAAE,CAAC;CAC9C;AAq9BD,eAAO,MAAM,YAAY,oCAAM,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@hadoku/jobplatform-worker",
3
- "version": "2.32.38",
4
- "gitHead": "4f79b4c6dc42dbdc2063fd7911c625e4a754b007",
3
+ "version": "2.32.40",
4
+ "gitHead": "f775d93c3a0dd33f7763577b8d84e5f16b973328",
5
5
  "description": "Job listings aggregation and tracking dashboard - Worker package",
6
6
  "license": "MIT",
7
7
  "type": "module",