pixivflow 2.12.2 → 2.13.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 (131) hide show
  1. package/README.md +12 -4
  2. package/dist/commands/DoctorCommand.d.ts +20 -0
  3. package/dist/commands/DoctorCommand.d.ts.map +1 -0
  4. package/dist/commands/DoctorCommand.js +107 -0
  5. package/dist/commands/DoctorCommand.js.map +1 -0
  6. package/dist/commands/ReconcileCommand.d.ts +24 -0
  7. package/dist/commands/ReconcileCommand.d.ts.map +1 -0
  8. package/dist/commands/ReconcileCommand.js +70 -0
  9. package/dist/commands/ReconcileCommand.js.map +1 -0
  10. package/dist/commands/SchedulerCommand.d.ts.map +1 -1
  11. package/dist/commands/SchedulerCommand.js +5 -0
  12. package/dist/commands/SchedulerCommand.js.map +1 -1
  13. package/dist/commands/SchedulerRunOnceCommand.d.ts.map +1 -1
  14. package/dist/commands/SchedulerRunOnceCommand.js +6 -0
  15. package/dist/commands/SchedulerRunOnceCommand.js.map +1 -1
  16. package/dist/commands/index.d.ts +3 -1
  17. package/dist/commands/index.d.ts.map +1 -1
  18. package/dist/commands/index.js +7 -1
  19. package/dist/commands/index.js.map +1 -1
  20. package/dist/commands/scheduler-runtime.d.ts +10 -1
  21. package/dist/commands/scheduler-runtime.d.ts.map +1 -1
  22. package/dist/commands/scheduler-runtime.js +169 -47
  23. package/dist/commands/scheduler-runtime.js.map +1 -1
  24. package/dist/config/types.d.ts +10 -1
  25. package/dist/config/types.d.ts.map +1 -1
  26. package/dist/delivery/DeliveryAck.d.ts +70 -0
  27. package/dist/delivery/DeliveryAck.d.ts.map +1 -0
  28. package/dist/delivery/DeliveryAck.js +72 -0
  29. package/dist/delivery/DeliveryAck.js.map +1 -0
  30. package/dist/delivery/DeliveryDispatcher.js +1 -1
  31. package/dist/delivery/DeliveryDispatcher.js.map +1 -1
  32. package/dist/delivery/DeliveryService.d.ts +74 -0
  33. package/dist/delivery/DeliveryService.d.ts.map +1 -0
  34. package/dist/delivery/DeliveryService.js +207 -0
  35. package/dist/delivery/DeliveryService.js.map +1 -0
  36. package/dist/delivery/HttpMultipartDelivery.d.ts +10 -1
  37. package/dist/delivery/HttpMultipartDelivery.d.ts.map +1 -1
  38. package/dist/delivery/HttpMultipartDelivery.js +40 -65
  39. package/dist/delivery/HttpMultipartDelivery.js.map +1 -1
  40. package/dist/delivery/LegacyOutboxMigration.d.ts +21 -0
  41. package/dist/delivery/LegacyOutboxMigration.d.ts.map +1 -0
  42. package/dist/delivery/LegacyOutboxMigration.js +125 -0
  43. package/dist/delivery/LegacyOutboxMigration.js.map +1 -0
  44. package/dist/delivery/OutboxWorker.d.ts +69 -0
  45. package/dist/delivery/OutboxWorker.d.ts.map +1 -0
  46. package/dist/delivery/OutboxWorker.js +194 -0
  47. package/dist/delivery/OutboxWorker.js.map +1 -0
  48. package/dist/delivery/types.d.ts +11 -0
  49. package/dist/delivery/types.d.ts.map +1 -1
  50. package/dist/download/DownloadManager.d.ts +17 -12
  51. package/dist/download/DownloadManager.d.ts.map +1 -1
  52. package/dist/download/DownloadManager.js +31 -53
  53. package/dist/download/DownloadManager.js.map +1 -1
  54. package/dist/download/NovelDownloader.d.ts +3 -1
  55. package/dist/download/NovelDownloader.d.ts.map +1 -1
  56. package/dist/download/NovelDownloader.js +30 -2
  57. package/dist/download/NovelDownloader.js.map +1 -1
  58. package/dist/download/handlers/IllustrationTargetHandler.d.ts +18 -8
  59. package/dist/download/handlers/IllustrationTargetHandler.d.ts.map +1 -1
  60. package/dist/download/handlers/IllustrationTargetHandler.js +100 -74
  61. package/dist/download/handlers/IllustrationTargetHandler.js.map +1 -1
  62. package/dist/download/handlers/NovelTargetHandler.d.ts +8 -8
  63. package/dist/download/handlers/NovelTargetHandler.d.ts.map +1 -1
  64. package/dist/download/handlers/NovelTargetHandler.js +64 -83
  65. package/dist/download/handlers/NovelTargetHandler.js.map +1 -1
  66. package/dist/download/plan/DownloadPlanner.d.ts +6 -1
  67. package/dist/download/plan/DownloadPlanner.d.ts.map +1 -1
  68. package/dist/download/plan/DownloadPlanner.js +28 -5
  69. package/dist/download/plan/DownloadPlanner.js.map +1 -1
  70. package/dist/notification/NotificationPolicy.d.ts +38 -0
  71. package/dist/notification/NotificationPolicy.d.ts.map +1 -0
  72. package/dist/notification/NotificationPolicy.js +89 -0
  73. package/dist/notification/NotificationPolicy.js.map +1 -0
  74. package/dist/package.json +1 -1
  75. package/dist/pixiv/PixivClient.d.ts +4 -0
  76. package/dist/pixiv/PixivClient.d.ts.map +1 -1
  77. package/dist/pixiv/PixivClient.js +15 -2
  78. package/dist/pixiv/PixivClient.js.map +1 -1
  79. package/dist/pixiv/RateLimitCoordinator.d.ts +30 -0
  80. package/dist/pixiv/RateLimitCoordinator.d.ts.map +1 -0
  81. package/dist/pixiv/RateLimitCoordinator.js +66 -0
  82. package/dist/pixiv/RateLimitCoordinator.js.map +1 -0
  83. package/dist/pixiv/client/PixivApiCore.d.ts +5 -0
  84. package/dist/pixiv/client/PixivApiCore.d.ts.map +1 -1
  85. package/dist/pixiv/client/PixivApiCore.js +31 -9
  86. package/dist/pixiv/client/PixivApiCore.js.map +1 -1
  87. package/dist/scheduler/ScheduleTriggerServer.d.ts +7 -0
  88. package/dist/scheduler/ScheduleTriggerServer.d.ts.map +1 -1
  89. package/dist/scheduler/ScheduleTriggerServer.js +17 -0
  90. package/dist/scheduler/ScheduleTriggerServer.js.map +1 -1
  91. package/dist/scheduler/SlotCoordinator.d.ts +15 -0
  92. package/dist/scheduler/SlotCoordinator.d.ts.map +1 -1
  93. package/dist/scheduler/SlotCoordinator.js +74 -0
  94. package/dist/scheduler/SlotCoordinator.js.map +1 -1
  95. package/dist/scheduler/SlotStateMachine.d.ts +32 -0
  96. package/dist/scheduler/SlotStateMachine.d.ts.map +1 -0
  97. package/dist/scheduler/SlotStateMachine.js +65 -0
  98. package/dist/scheduler/SlotStateMachine.js.map +1 -0
  99. package/dist/scheduler/TargetOutcome.d.ts +63 -0
  100. package/dist/scheduler/TargetOutcome.d.ts.map +1 -0
  101. package/dist/scheduler/TargetOutcome.js +28 -0
  102. package/dist/scheduler/TargetOutcome.js.map +1 -0
  103. package/dist/storage/Database.d.ts +16 -0
  104. package/dist/storage/Database.d.ts.map +1 -1
  105. package/dist/storage/Database.js +29 -0
  106. package/dist/storage/Database.js.map +1 -1
  107. package/dist/storage/DatabaseMigration.d.ts.map +1 -1
  108. package/dist/storage/DatabaseMigration.js +66 -0
  109. package/dist/storage/DatabaseMigration.js.map +1 -1
  110. package/dist/storage/repositories/DeliveryRepository.d.ts +73 -0
  111. package/dist/storage/repositories/DeliveryRepository.d.ts.map +1 -0
  112. package/dist/storage/repositories/DeliveryRepository.js +148 -0
  113. package/dist/storage/repositories/DeliveryRepository.js.map +1 -0
  114. package/dist/storage/repositories/MetadataRepository.d.ts +27 -0
  115. package/dist/storage/repositories/MetadataRepository.d.ts.map +1 -0
  116. package/dist/storage/repositories/MetadataRepository.js +58 -0
  117. package/dist/storage/repositories/MetadataRepository.js.map +1 -0
  118. package/dist/storage/repositories/OutboxRepository.d.ts +70 -0
  119. package/dist/storage/repositories/OutboxRepository.d.ts.map +1 -0
  120. package/dist/storage/repositories/OutboxRepository.js +187 -0
  121. package/dist/storage/repositories/OutboxRepository.js.map +1 -0
  122. package/dist/storage/repositories/SlotRepository.d.ts +26 -1
  123. package/dist/storage/repositories/SlotRepository.d.ts.map +1 -1
  124. package/dist/storage/repositories/SlotRepository.js +76 -2
  125. package/dist/storage/repositories/SlotRepository.js.map +1 -1
  126. package/dist/webui/package.json +1 -1
  127. package/package.json +1 -1
  128. package/dist/delivery/DeliveryOutbox.d.ts +0 -43
  129. package/dist/delivery/DeliveryOutbox.d.ts.map +0 -1
  130. package/dist/delivery/DeliveryOutbox.js +0 -293
  131. package/dist/delivery/DeliveryOutbox.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.legacyOutboxDir = legacyOutboxDir;
4
+ exports.migrateLegacyOutbox = migrateLegacyOutbox;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_path_1 = require("node:path");
7
+ const logger_1 = require("../logger");
8
+ function legacyOutboxDir(databasePath) {
9
+ return (0, node_path_1.join)((0, node_path_1.dirname)(databasePath), 'delivery-outbox');
10
+ }
11
+ function migrateLegacyOutbox(database, outboxDir = legacyOutboxDir(database.getDatabasePath())) {
12
+ const result = { scanned: 0, imported: 0, delivered: 0, skipped: 0, failed: 0 };
13
+ if (!(0, node_fs_1.existsSync)(outboxDir))
14
+ return result;
15
+ const files = (0, node_fs_1.readdirSync)(outboxDir).filter((f) => f.endsWith('.json'));
16
+ const archiveDir = (0, node_path_1.join)(outboxDir, 'migrated');
17
+ for (const file of files) {
18
+ result.scanned++;
19
+ const full = (0, node_path_1.join)(outboxDir, file);
20
+ let manifest;
21
+ try {
22
+ manifest = JSON.parse((0, node_fs_1.readFileSync)(full, 'utf8'));
23
+ }
24
+ catch (error) {
25
+ logger_1.logger.warn('Legacy outbox manifest unreadable; leaving in place', {
26
+ file,
27
+ error: error instanceof Error ? error.message : String(error),
28
+ });
29
+ result.failed++;
30
+ continue;
31
+ }
32
+ try {
33
+ const kind = manifest.kind ?? (manifest.notification ? 'notification' : 'delivery');
34
+ const target = manifest.deliveryTarget ?? 'default';
35
+ if (kind === 'notification') {
36
+ const key = manifest.notification?.idempotencyKey ?? `legacy-notify:${manifest.id ?? file}`;
37
+ if (manifest.status === 'delivered') {
38
+ result.delivered++;
39
+ }
40
+ else {
41
+ database.outbox.enqueue({
42
+ kind: 'notification',
43
+ deliveryTarget: target,
44
+ idempotencyKey: key,
45
+ payload: { text: manifest.notification?.text ?? '' },
46
+ });
47
+ result.imported++;
48
+ }
49
+ }
50
+ else {
51
+ const artifact = manifest.artifact;
52
+ if (!artifact) {
53
+ result.skipped++;
54
+ }
55
+ else if (manifest.status === 'delivered') {
56
+ // Backfill the ledger fact so delivery dedupe survives the migration.
57
+ const key = `legacy-delivery:${target}:${artifact.type}:${artifact.pixivId}:${manifest.id ?? file}`;
58
+ if (!database.deliveries.isDelivered(target, artifact.type, String(artifact.pixivId))) {
59
+ database.deliveries.backfill({
60
+ id: require('node:crypto').randomUUID(),
61
+ deliveryTarget: target,
62
+ workType: artifact.type,
63
+ pixivId: String(artifact.pixivId),
64
+ idempotencyKey: key,
65
+ remoteStatus: 'legacy_delivered',
66
+ });
67
+ }
68
+ result.delivered++;
69
+ }
70
+ else {
71
+ const idemKey = `legacy-delivery:${target}:${artifact.type}:${artifact.pixivId}:${manifest.id ?? file}`;
72
+ // Create the ledger intent + outbox row atomically.
73
+ const { row, created } = database.deliveries.insertIntent({
74
+ id: require('node:crypto').randomUUID(),
75
+ deliveryTarget: target,
76
+ workType: artifact.type,
77
+ pixivId: String(artifact.pixivId),
78
+ idempotencyKey: idemKey,
79
+ });
80
+ if (created) {
81
+ const due = manifest.nextAttemptAt ? Date.parse(manifest.nextAttemptAt) : Date.now();
82
+ database.outbox.enqueue({
83
+ kind: 'delivery',
84
+ deliveryTarget: target,
85
+ idempotencyKey: `outbox:${idemKey}`,
86
+ deliveryId: row.id,
87
+ dueAt: Number.isFinite(due) ? due : Date.now(),
88
+ payload: {
89
+ files: artifact.files,
90
+ cleanupFiles: artifact.cleanupFiles ?? [],
91
+ fields: manifest.request?.fields ?? null,
92
+ context: {
93
+ title: artifact.title,
94
+ pixivId: artifact.pixivId,
95
+ type: artifact.type,
96
+ workTags: artifact.tags,
97
+ ...(manifest.request?.context ?? {}),
98
+ },
99
+ },
100
+ });
101
+ result.imported++;
102
+ }
103
+ else {
104
+ result.skipped++;
105
+ }
106
+ }
107
+ }
108
+ // Commit succeeded (better-sqlite3 is synchronous): archive the manifest.
109
+ (0, node_fs_1.mkdirSync)(archiveDir, { recursive: true });
110
+ (0, node_fs_1.renameSync)(full, (0, node_path_1.join)(archiveDir, file));
111
+ }
112
+ catch (error) {
113
+ result.failed++;
114
+ logger_1.logger.warn('Legacy outbox manifest migration failed; will retry next start', {
115
+ file,
116
+ error: error instanceof Error ? error.message : String(error),
117
+ });
118
+ }
119
+ }
120
+ if (result.imported > 0 || result.delivered > 0) {
121
+ logger_1.logger.info('Legacy JSON outbox migrated to SQLite', result);
122
+ }
123
+ return result;
124
+ }
125
+ //# sourceMappingURL=LegacyOutboxMigration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegacyOutboxMigration.js","sourceRoot":"","sources":["../../src/delivery/LegacyOutboxMigration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Database } from '../storage/Database';
2
+ import { OutboxRow } from '../storage/repositories/OutboxRepository';
3
+ import { DeliveryDispatcher } from './DeliveryDispatcher';
4
+ import { DeliveryAck } from './DeliveryAck';
5
+ export interface OutboxWorkerOptions {
6
+ /** How often to scan for due rows. */
7
+ pollIntervalMs?: number;
8
+ /** Row lease duration while one attempt is in flight. */
9
+ leaseMs?: number;
10
+ /** Rows claimed per scan. */
11
+ batchSize?: number;
12
+ retryBaseMs?: number;
13
+ retryMaxMs?: number;
14
+ /** Fired when a delivery reaches a terminal business state (for the Slot ledger). */
15
+ onDeliveryTerminal?: (deliveryId: string, ack: DeliveryAck, payload: DeliveryPayload) => void;
16
+ /** Fired when a delivery is permanently dead (for notifications/doctor). */
17
+ onDead?: (row: OutboxRow, error: string) => void;
18
+ }
19
+ /** Delivery side-effect payload (frozen at enqueue time). */
20
+ export interface DeliveryPayload {
21
+ files: string[];
22
+ /** Sidecars + cached media removed after confirmed delivery (cache mode). */
23
+ cleanupFiles?: string[];
24
+ deleteAfterDelivery?: boolean;
25
+ fields?: Record<string, unknown>;
26
+ context: Record<string, unknown>;
27
+ }
28
+ /** Notification side-effect payload. */
29
+ export interface NotificationPayload {
30
+ text: string;
31
+ }
32
+ /** Exponential backoff with jitter, capped. */
33
+ export declare function backoffDelayMs(attempt: number, base: number, max: number): number;
34
+ /**
35
+ * Independently pumps the SQLite outbox so deliveries and notifications retry
36
+ * promptly instead of piggy-backing on the next scheduled download run.
37
+ * Survives crashes: an in-flight row keeps an expiring lease; a restart claims
38
+ * it once the lease is stale and retries the SAME idempotent intent.
39
+ */
40
+ export declare class OutboxWorker {
41
+ private readonly database;
42
+ private readonly dispatcher;
43
+ private timer;
44
+ private running;
45
+ private stopped;
46
+ private readonly owner;
47
+ private readonly pollIntervalMs;
48
+ private readonly leaseMs;
49
+ private readonly batchSize;
50
+ private readonly retryBaseMs;
51
+ private readonly retryMaxMs;
52
+ constructor(database: Database, dispatcher: DeliveryDispatcher, options?: OutboxWorkerOptions);
53
+ private onDeliveryTerminal;
54
+ private onDead;
55
+ start(): void;
56
+ stop(): void;
57
+ /** Drain all currently-due rows once (used by CLI / watchdog wake). */
58
+ drainOnce(maxRounds?: number): Promise<{
59
+ processed: number;
60
+ done: number;
61
+ retried: number;
62
+ dead: number;
63
+ }>;
64
+ private pump;
65
+ private process;
66
+ private handleDeliveryAck;
67
+ private cleanup;
68
+ }
69
+ //# sourceMappingURL=OutboxWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutboxWorker.d.ts","sourceRoot":"","sources":["../../src/delivery/OutboxWorker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAgB,MAAM,0CAA0C,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9F,4EAA4E;IAC5E,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKjF;AAED;;;;;GAKG;AACH,qBAAa,YAAY;IAYrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAZ7B,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuD;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,kBAAkB,EAC/C,OAAO,GAAE,mBAAwB;IAWnC,OAAO,CAAC,kBAAkB,CAAwD;IAClF,OAAO,CAAC,MAAM,CAA4C;IAE1D,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAQZ,uEAAuE;IACjE,SAAS,CAAC,SAAS,SAAK,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;YAmB9F,IAAI;YAmBJ,OAAO;YAyCP,iBAAiB;YA+BjB,OAAO;CAWtB"}
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OutboxWorker = void 0;
4
+ exports.backoffDelayMs = backoffDelayMs;
5
+ const node_crypto_1 = require("node:crypto");
6
+ const promises_1 = require("node:fs/promises");
7
+ const logger_1 = require("../logger");
8
+ /** Exponential backoff with jitter, capped. */
9
+ function backoffDelayMs(attempt, base, max) {
10
+ const exp = base * 2 ** Math.min(Math.max(0, attempt - 1), 18);
11
+ const capped = Math.min(max, exp);
12
+ // Full jitter: 0.5..1.0 of the delay spreads synchronized workers/retries.
13
+ return Math.round(capped * (0.5 + Math.random() * 0.5));
14
+ }
15
+ /**
16
+ * Independently pumps the SQLite outbox so deliveries and notifications retry
17
+ * promptly instead of piggy-backing on the next scheduled download run.
18
+ * Survives crashes: an in-flight row keeps an expiring lease; a restart claims
19
+ * it once the lease is stale and retries the SAME idempotent intent.
20
+ */
21
+ class OutboxWorker {
22
+ database;
23
+ dispatcher;
24
+ timer = null;
25
+ running = false;
26
+ stopped = false;
27
+ owner = `worker-${process.pid}-${(0, node_crypto_1.randomUUID)().slice(0, 8)}`;
28
+ pollIntervalMs;
29
+ leaseMs;
30
+ batchSize;
31
+ retryBaseMs;
32
+ retryMaxMs;
33
+ constructor(database, dispatcher, options = {}) {
34
+ this.database = database;
35
+ this.dispatcher = dispatcher;
36
+ this.pollIntervalMs = options.pollIntervalMs ?? 10_000;
37
+ this.leaseMs = options.leaseMs ?? 120_000;
38
+ this.batchSize = options.batchSize ?? 4;
39
+ this.retryBaseMs = options.retryBaseMs ?? 30_000;
40
+ this.retryMaxMs = options.retryMaxMs ?? 6 * 60 * 60_000;
41
+ if (options.onDeliveryTerminal)
42
+ this.onDeliveryTerminal = options.onDeliveryTerminal;
43
+ if (options.onDead)
44
+ this.onDead = options.onDead;
45
+ }
46
+ onDeliveryTerminal = undefined;
47
+ onDead = undefined;
48
+ start() {
49
+ if (this.timer)
50
+ return;
51
+ logger_1.logger.info('Outbox worker started', { pollMs: this.pollIntervalMs, owner: this.owner });
52
+ // Pump immediately on start so a crash-resume drains without waiting.
53
+ void this.pump();
54
+ this.timer = setInterval(() => void this.pump(), this.pollIntervalMs);
55
+ // Don't keep the event loop alive solely for the pump during shutdown.
56
+ this.timer.unref?.();
57
+ }
58
+ stop() {
59
+ this.stopped = true;
60
+ if (this.timer) {
61
+ clearInterval(this.timer);
62
+ this.timer = null;
63
+ }
64
+ }
65
+ /** Drain all currently-due rows once (used by CLI / watchdog wake). */
66
+ async drainOnce(maxRounds = 50) {
67
+ let processed = 0;
68
+ let done = 0;
69
+ let retried = 0;
70
+ let dead = 0;
71
+ for (let round = 0; round < maxRounds; round++) {
72
+ const rows = this.database.outbox.claimDue(this.owner, this.leaseMs, this.batchSize);
73
+ if (rows.length === 0)
74
+ break;
75
+ for (const row of rows) {
76
+ processed++;
77
+ const result = await this.process(row);
78
+ if (result === 'done')
79
+ done++;
80
+ else if (result === 'dead')
81
+ dead++;
82
+ else
83
+ retried++;
84
+ }
85
+ }
86
+ return { processed, done, retried, dead };
87
+ }
88
+ async pump() {
89
+ if (this.running || this.stopped)
90
+ return;
91
+ this.running = true;
92
+ try {
93
+ const rows = this.database.outbox.claimDue(this.owner, this.leaseMs, this.batchSize);
94
+ for (const row of rows) {
95
+ if (this.stopped) {
96
+ this.database.outbox.release(row.id);
97
+ continue;
98
+ }
99
+ await this.process(row);
100
+ }
101
+ }
102
+ catch (error) {
103
+ logger_1.logger.warn('Outbox pump failed', { error: error instanceof Error ? error.message : String(error) });
104
+ }
105
+ finally {
106
+ this.running = false;
107
+ }
108
+ }
109
+ async process(row) {
110
+ try {
111
+ if (row.kind === 'notification') {
112
+ const payload = JSON.parse(row.payloadJson);
113
+ await this.dispatcher.notify(row.deliveryTarget, {
114
+ text: payload.text,
115
+ idempotencyKey: row.idempotencyKey ?? row.id,
116
+ });
117
+ }
118
+ else {
119
+ const payload = JSON.parse(row.payloadJson);
120
+ const result = await this.dispatcher.deliver(row.deliveryTarget, {
121
+ files: payload.files,
122
+ fields: payload.fields,
123
+ context: payload.context,
124
+ });
125
+ const ack = result.ack ?? {
126
+ kind: result.status && result.status >= 200 && result.status < 300 ? 'accepted' : 'retryable_failure',
127
+ error: `no ack (HTTP ${result.status})`,
128
+ };
129
+ await this.handleDeliveryAck(row, ack, payload);
130
+ }
131
+ this.database.outbox.markDone(row.id);
132
+ return 'done';
133
+ }
134
+ catch (error) {
135
+ // Transport-level error (fetch threw): retryable.
136
+ const message = error instanceof Error ? error.message : String(error);
137
+ const delay = backoffDelayMs(row.attempts + 1, this.retryBaseMs, this.retryMaxMs);
138
+ const status = this.database.outbox.markRetry(row.id, Date.now() + delay, message);
139
+ if (status === 'dead') {
140
+ logger_1.logger.error('Outbox item dead after max attempts', { outboxId: row.id, kind: row.kind, error: message });
141
+ this.onDead?.(row, message);
142
+ if (row.deliveryId) {
143
+ this.database.deliveries.recordAck(row.deliveryId, { status: 'failed', error: message });
144
+ }
145
+ }
146
+ else {
147
+ logger_1.logger.warn('Outbox item will retry', { outboxId: row.id, kind: row.kind, attempt: row.attempts + 1, delayMs: delay });
148
+ }
149
+ return status;
150
+ }
151
+ }
152
+ async handleDeliveryAck(row, ack, payload) {
153
+ if (!row.deliveryId)
154
+ return;
155
+ switch (ack.kind) {
156
+ case 'accepted':
157
+ case 'idempotent_replay':
158
+ this.database.deliveries.recordAck(row.deliveryId, {
159
+ status: 'delivered',
160
+ remoteId: ack.remoteId,
161
+ remoteStatus: ack.remoteStatus ?? (ack.kind === 'idempotent_replay' ? 'idempotent_replay' : 'accepted'),
162
+ });
163
+ this.onDeliveryTerminal?.(row.deliveryId, ack, payload);
164
+ await this.cleanup(payload);
165
+ break;
166
+ case 'duplicate_existing':
167
+ this.database.deliveries.recordAck(row.deliveryId, {
168
+ status: 'duplicate',
169
+ remoteId: ack.remoteId,
170
+ remoteStatus: ack.remoteStatus ?? 'duplicate_existing',
171
+ reuseReason: 'historical_duplicate',
172
+ });
173
+ this.onDeliveryTerminal?.(row.deliveryId, ack, payload);
174
+ break;
175
+ case 'permanent_failure':
176
+ // Deterministic rejection: still retry a couple times to survive a
177
+ // misconfigured blip, the outbox max-attempts then dead-letters it.
178
+ throw new Error(`permanent delivery failure: ${ack.error}`);
179
+ case 'retryable_failure':
180
+ throw new Error(`retryable delivery failure: ${ack.error}`);
181
+ }
182
+ }
183
+ async cleanup(payload) {
184
+ if (payload.deleteAfterDelivery === false)
185
+ return;
186
+ const files = [...(payload.files ?? []), ...(payload.cleanupFiles ?? [])];
187
+ await Promise.all([...new Set(files)].map((file) => (0, promises_1.unlink)(file).catch((error) => {
188
+ if (error.code !== 'ENOENT')
189
+ logger_1.logger.debug('cache cleanup failed', { file, error: error.message });
190
+ })));
191
+ }
192
+ }
193
+ exports.OutboxWorker = OutboxWorker;
194
+ //# sourceMappingURL=OutboxWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutboxWorker.js","sourceRoot":"","sources":["../../src/delivery/OutboxWorker.ts"],"names":[],"mappings":"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"}
@@ -58,6 +58,13 @@ export interface DeliveryContext {
58
58
  occurrenceAt?: string;
59
59
  /** Why the run started: cron | http | manual | catchup. */
60
60
  triggerSource?: string;
61
+ /**
62
+ * Occurrence-scoped intent key (e.g. pixivflow:<target>:<type>:<id>:<slot>:<targetId>).
63
+ * Sent downstream as idempotency_key so an ACK-loss retry carrying the SAME
64
+ * key converges to one remote record (idempotent_replay), distinct from a
65
+ * historical duplicate of the same work from a different occurrence.
66
+ */
67
+ idempotencyKey?: string;
61
68
  /** Schedule slot provenance for review-source labelling (external/scheduled runs). */
62
69
  slotId?: string;
63
70
  slotName?: string;
@@ -68,9 +75,12 @@ export interface DeliveryRequest {
68
75
  fields?: Record<string, DeliveryFieldValue>;
69
76
  context: DeliveryContext;
70
77
  }
78
+ import type { DeliveryAck } from './DeliveryAck';
71
79
  export interface DeliveryResult {
72
80
  status?: number;
73
81
  body?: unknown;
82
+ /** Normalized business acknowledgement (present on delivery attempts). */
83
+ ack?: DeliveryAck;
74
84
  }
75
85
  export interface DeliveryNotificationRequest {
76
86
  text: string;
@@ -78,6 +88,7 @@ export interface DeliveryNotificationRequest {
78
88
  }
79
89
  export interface DeliveryProvider {
80
90
  deliver(request: DeliveryRequest): Promise<DeliveryResult>;
91
+ /** One notification attempt; the durable outbox owns retries. */
81
92
  notify?(request: DeliveryNotificationRequest): Promise<DeliveryResult>;
82
93
  }
83
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/delivery/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,OAAO,CAAC;AAExD,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3D,MAAM,CAAC,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACxE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/delivery/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,OAAO,CAAC;AAExD,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,oDAAoD;IACpD,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,gBAAgB,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0EAA0E;IAC1E,GAAG,CAAC,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3D,iEAAiE;IACjE,MAAM,CAAC,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACxE"}
@@ -3,6 +3,8 @@ import { IDownloadManager } from '../interfaces/IDownloadManager';
3
3
  import { IPixivClient } from '../interfaces/IPixivClient';
4
4
  import { IDatabase } from '../interfaces/IDatabase';
5
5
  import { IFileService } from '../interfaces/IFileService';
6
+ import { DeliveryService } from '../delivery/DeliveryService';
7
+ import { TargetOutcome } from '../scheduler/TargetOutcome';
6
8
  /**
7
9
  * Download Manager with Concurrency Control
8
10
  *
@@ -41,18 +43,22 @@ export declare class DownloadManager implements IDownloadManager {
41
43
  private readonly novelHandler;
42
44
  private cancelled;
43
45
  private cancelReason;
44
- private readonly deliveryOutbox;
45
- /** Per-target outcome hook (used by the Slot ledger to record cell results). */
46
+ private readonly deliveryService;
47
+ /** Per-target TYPED outcome hook (the Slot ledger maps it to cell transitions). */
46
48
  private onTargetOutcome;
47
- /** Fired when a work is locked for delivery (fresh or outbox replay). */
48
- private onWorkLocked;
49
- /** Register a callback fired after each target with the error if it failed. */
50
- setTargetOutcomeHook(fn: (target: TargetConfig, error?: string) => void): void;
51
- /** Register a callback fired when a Pixiv work is selected and locked for a target. */
52
- setWorkLockedHook(fn: (artifact: {
53
- pixivId: string;
54
- type: string;
55
- }, target: TargetConfig) => void): void;
49
+ /** Register a callback fired after each target with its explicit business outcome. */
50
+ setTargetOutcomeHook(fn: (target: TargetConfig, outcome: TargetOutcome) => void): void;
51
+ /** Expose delivery service for handlers (preflight + intent creation). */
52
+ get deliveries(): DeliveryService;
53
+ /** Slot context propagated to delivery templates/outcomes for scheduled runs. */
54
+ slotContext?: {
55
+ slotId: string;
56
+ scheduleId: string;
57
+ occurrenceAtIso: string;
58
+ triggerSource: string;
59
+ slotName: string;
60
+ slotDate: string;
61
+ };
56
62
  /**
57
63
  * Request cooperative cancellation of the current run. In-flight item
58
64
  * finishes; no further targets/items are started. runAllTargets() will
@@ -66,6 +72,5 @@ export declare class DownloadManager implements IDownloadManager {
66
72
  runAllTargets(): Promise<void>;
67
73
  private dispatchTarget;
68
74
  private updateProgress;
69
- private buildProxyUrl;
70
75
  }
71
76
  //# sourceMappingURL=DownloadManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DownloadManager.d.ts","sourceRoot":"","sources":["../../src/download/DownloadManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAiB1D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAiDpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAnD9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4B;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAGlD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,gFAAgF;IAChF,OAAO,CAAC,eAAe,CAAiE;IACxF,yEAAyE;IACzE,OAAO,CAAC,YAAY,CAA8F;IAElH,+EAA+E;IACxE,oBAAoB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIrF,uFAAuF;IAChF,iBAAiB,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAI/G;;;;OAIG;IACI,MAAM,CAAC,MAAM,GAAE,MAAoB,GAAG,IAAI;IAQ1C,WAAW,IAAI,OAAO;gBAKV,MAAM,EAAE,gBAAgB,EACzC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,SAAS,EACF,WAAW,EAAE,YAAY;IAqF5C,mBAAmB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlF,UAAU;IAIV,aAAa;YA0DZ,cAAc;IAa5B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,aAAa;CAetB"}
1
+ {"version":3,"file":"DownloadManager.d.ts","sourceRoot":"","sources":["../../src/download/DownloadManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAU1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAyDpD,OAAO,CAAC,QAAQ,CAAC,MAAM;IAGvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IA3D9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyB;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA4B;IAChE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAGlD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAM;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;IACnD,mFAAmF;IACnF,OAAO,CAAC,eAAe,CAAyE;IAEhG,sFAAsF;IAC/E,oBAAoB,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI;IAI7F,0EAA0E;IAC1E,IAAW,UAAU,IAAI,eAAe,CAEvC;IAED,iFAAiF;IAC1E,WAAW,CAAC,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF;;;;OAIG;IACI,MAAM,CAAC,MAAM,GAAE,MAAoB,GAAG,IAAI;IAQ1C,WAAW,IAAI,OAAO;gBAKV,MAAM,EAAE,gBAAgB,EACzC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,SAAS,EACF,WAAW,EAAE,YAAY;IAoF5C,mBAAmB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlF,UAAU;IAIV,aAAa;YAyDZ,cAAc;IAY5B,OAAO,CAAC,cAAc;CAIvB"}