( dbManager: DatabaseManager, sessionId: string, payload: PushImportPayload )
| 429 | const SAFE_SESSION_ID_RE = /^[a-zA-Z0-9_@-][a-zA-Z0-9_@.-]*$/ |
| 430 | |
| 431 | export async function pushImport( |
| 432 | dbManager: DatabaseManager, |
| 433 | sessionId: string, |
| 434 | payload: PushImportPayload |
| 435 | ): Promise<PushImportOutcome> { |
| 436 | if (!SAFE_SESSION_ID_RE.test(sessionId) || sessionId.includes('..')) { |
| 437 | return { ok: false, reason: 'invalid_payload', message: 'sessionId contains invalid characters' } |
| 438 | } |
| 439 | |
| 440 | if (importInProgress.has(sessionId)) { |
| 441 | return { |
| 442 | ok: false, |
| 443 | reason: 'import_in_progress', |
| 444 | message: 'Another import is already in progress for this session', |
| 445 | } |
| 446 | } |
| 447 | |
| 448 | const dbPath = dbManager.getDbPath(sessionId) |
| 449 | const isNew = !fs.existsSync(dbPath) |
| 450 | |
| 451 | const validationError = validatePayload(payload, isNew) |
| 452 | if (validationError) { |
| 453 | return { ok: false, reason: 'invalid_payload', message: validationError } |
| 454 | } |
| 455 | |
| 456 | importInProgress.add(sessionId) |
| 457 | try { |
| 458 | if (isNew) { |
| 459 | const db = dbManager.openRawSessionDatabase(sessionId, { create: true }) |
| 460 | try { |
| 461 | const { writtenCount, duplicateCount, membersAdded } = fullImport( |
| 462 | db, |
| 463 | payload.meta!, |
| 464 | payload.members ?? [], |
| 465 | payload.messages! |
| 466 | ) |
| 467 | const session = queryStats(db) |
| 468 | dbManager.raiseCurrentChatDbCompatibilityGate() |
| 469 | return { |
| 470 | ok: true, |
| 471 | result: { |
| 472 | sessionId, |
| 473 | created: true, |
| 474 | batch: { receivedCount: payload.messages!.length, writtenCount, duplicateCount }, |
| 475 | session, |
| 476 | updates: { metaUpdated: true, membersAdded, membersUpdated: 0 }, |
| 477 | }, |
| 478 | } |
| 479 | } finally { |
| 480 | db.close() |
| 481 | } |
| 482 | } |
| 483 | |
| 484 | const db = dbManager.openRawSessionDatabase(sessionId, { readonly: false }) |
| 485 | try { |
| 486 | const { writtenCount, duplicateCount, metaUpdated, membersAdded, membersUpdated } = incrementalImport(db, payload) |
| 487 | const session = queryStats(db) |
| 488 | dbManager.raiseCurrentChatDbCompatibilityGate() |
no test coverage detected