daeda-mcp 1.0.1 → 1.0.2

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,3 +1,4 @@
1
+ import { Worker } from "node:worker_threads";
1
2
  import { clearTable, setMetadata, batchInsertContacts, batchInsertCompanies, batchInsertDeals, batchInsertAssociations, } from "../db/sqlite.js";
2
3
  function findIdColumn(headers) {
3
4
  const idCandidates = [
@@ -42,8 +43,7 @@ async function loadCsvWithWorker(filePath, tableName, mapRow, insertBatch, onPro
42
43
  let idColumn = null;
43
44
  let totalInserted = 0;
44
45
  let pendingInserts = [];
45
- worker.onmessage = async (event) => {
46
- const msg = event.data;
46
+ worker.on("message", async (msg) => {
47
47
  try {
48
48
  switch (msg.type) {
49
49
  case "headers": {
@@ -95,11 +95,11 @@ async function loadCsvWithWorker(filePath, tableName, mapRow, insertBatch, onPro
95
95
  worker.terminate();
96
96
  reject(err);
97
97
  }
98
- };
99
- worker.onerror = (err) => {
98
+ });
99
+ worker.on("error", (err) => {
100
100
  worker.terminate();
101
101
  reject(new Error(`Worker error: ${err.message}`));
102
- };
102
+ });
103
103
  worker.postMessage({
104
104
  type: "start",
105
105
  filePath,
@@ -164,8 +164,7 @@ export async function loadAssociationsCsvFromFile(filePath, associationType, onP
164
164
  let associatedIdColumn = null;
165
165
  let totalInserted = 0;
166
166
  let pendingInserts = [];
167
- worker.onmessage = async (event) => {
168
- const msg = event.data;
167
+ worker.on("message", async (msg) => {
169
168
  try {
170
169
  switch (msg.type) {
171
170
  case "headers": {
@@ -236,11 +235,11 @@ export async function loadAssociationsCsvFromFile(filePath, associationType, onP
236
235
  worker.terminate();
237
236
  reject(err);
238
237
  }
239
- };
240
- worker.onerror = (err) => {
238
+ });
239
+ worker.on("error", (err) => {
241
240
  worker.terminate();
242
241
  reject(new Error(`Worker error: ${err.message}`));
243
- };
242
+ });
244
243
  worker.postMessage({
245
244
  type: "start",
246
245
  filePath,
@@ -1,8 +1,8 @@
1
1
  import { createReadStream } from "node:fs";
2
+ import { parentPort } from "node:worker_threads";
2
3
  import { parse } from "csv-parse";
3
4
  let cancelled = false;
4
- self.onmessage = async (event) => {
5
- const msg = event.data;
5
+ parentPort?.on("message", async (msg) => {
6
6
  if (msg.type === "cancel") {
7
7
  cancelled = true;
8
8
  return;
@@ -11,7 +11,7 @@ self.onmessage = async (event) => {
11
11
  cancelled = false;
12
12
  await processFile(msg.filePath, msg.batchSize ?? 5000);
13
13
  }
14
- };
14
+ });
15
15
  async function processFile(filePath, batchSize) {
16
16
  try {
17
17
  const parser = createReadStream(filePath).pipe(parse({
@@ -25,17 +25,17 @@ async function processFile(filePath, batchSize) {
25
25
  let headersSent = false;
26
26
  for await (const record of parser) {
27
27
  if (cancelled) {
28
- self.postMessage({ type: "done", totalCount: totalProcessed });
28
+ parentPort?.postMessage({ type: "done", totalCount: totalProcessed });
29
29
  return;
30
30
  }
31
31
  if (!headersSent) {
32
- self.postMessage({ type: "headers", headers: Object.keys(record) });
32
+ parentPort?.postMessage({ type: "headers", headers: Object.keys(record) });
33
33
  headersSent = true;
34
34
  }
35
35
  batch.push(record);
36
36
  if (batch.length >= batchSize) {
37
37
  totalProcessed += batch.length;
38
- self.postMessage({
38
+ parentPort?.postMessage({
39
39
  type: "batch",
40
40
  rows: batch,
41
41
  processedCount: totalProcessed,
@@ -45,16 +45,16 @@ async function processFile(filePath, batchSize) {
45
45
  }
46
46
  if (batch.length > 0) {
47
47
  totalProcessed += batch.length;
48
- self.postMessage({
48
+ parentPort?.postMessage({
49
49
  type: "batch",
50
50
  rows: batch,
51
51
  processedCount: totalProcessed,
52
52
  });
53
53
  }
54
- self.postMessage({ type: "done", totalCount: totalProcessed });
54
+ parentPort?.postMessage({ type: "done", totalCount: totalProcessed });
55
55
  }
56
56
  catch (err) {
57
57
  const errorMessage = err instanceof Error ? err.message : String(err);
58
- self.postMessage({ type: "error", error: errorMessage });
58
+ parentPort?.postMessage({ type: "error", error: errorMessage });
59
59
  }
60
60
  }
@@ -226,15 +226,15 @@ export async function downloadExportCsvToFile(token, downloadUrl, exportName) {
226
226
  }
227
227
  const writeStream = createWriteStream(outputPath);
228
228
  for (let i = 0; i < csvEntries.length; i++) {
229
- const csvContent = csvEntries[i].getData().toString("utf-8");
229
+ const csvBuffer = csvEntries[i].getData();
230
230
  if (i === 0) {
231
- writeStream.write(csvContent);
231
+ writeStream.write(csvBuffer);
232
232
  }
233
233
  else {
234
- const firstNewline = csvContent.indexOf("\n");
234
+ const firstNewline = csvBuffer.indexOf(0x0a); // 0x0a = '\n'
235
235
  if (firstNewline !== -1) {
236
236
  writeStream.write("\n");
237
- writeStream.write(csvContent.slice(firstNewline + 1));
237
+ writeStream.write(csvBuffer.subarray(firstNewline + 1));
238
238
  }
239
239
  }
240
240
  }
@@ -54,16 +54,16 @@ export async function startInitialization(force = false) {
54
54
  newState.status = "sending_requests";
55
55
  newState.startedAt = new Date().toISOString();
56
56
  writeInitState(newState);
57
- console.error("[init-manager] Starting export requests...");
57
+ console.error("[init-manager] Starting seeding first, then export requests...");
58
58
  try {
59
+ runSeeding(token).catch((err) => {
60
+ console.error("[init-manager] Seeding failed (non-fatal):", err);
61
+ });
59
62
  await fireAllExportRequests(token, newState);
60
63
  newState.status = "polling_exports";
61
64
  newState.seedingStatus = "pending";
62
65
  writeInitState(newState);
63
- console.error("[init-manager] All export requests sent, starting seeding and poll loop");
64
- runSeeding(token).catch((err) => {
65
- console.error("[init-manager] Seeding failed (non-fatal):", err);
66
- });
66
+ console.error("[init-manager] All export requests sent, starting poll loop");
67
67
  startPollLoop();
68
68
  }
69
69
  catch (err) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "daeda-mcp",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "MCP server for HubSpot CRM data sync",
5
5
  "license": "MIT",
6
6
  "repository": {