@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
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.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,561 +1,561 @@
|
|
|
1
|
-
# PartialBatchRecovery
|
|
2
|
-
|
|
3
|
-
**Level:** Advanced
|
|
4
|
-
**Category:** Resilience & Error Recovery
|
|
5
|
-
**Purpose:** Recover from partial batch failures without losing all data
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
`PartialBatchRecovery` enables per-record tracking in batch operations, allowing you to retry only failed records instead of re-processing the entire batch. This dramatically improves resilience and reduces data loss in production workflows.
|
|
10
|
-
|
|
11
|
-
## Use Cases
|
|
12
|
-
|
|
13
|
-
- ✅ Handle transient API failures gracefully
|
|
14
|
-
- ✅ Implement checkpoint/resume functionality
|
|
15
|
-
- ✅ Retry individual failed records
|
|
16
|
-
- ✅ Track detailed error information per record
|
|
17
|
-
- ✅ Reduce duplicate submissions
|
|
18
|
-
- ✅ Minimize data loss on partial failures
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Installation
|
|
23
|
-
|
|
24
|
-
```typescript
|
|
25
|
-
import { PartialBatchRecovery } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
## Quick Start
|
|
31
|
-
|
|
32
|
-
```typescript
|
|
33
|
-
import { PartialBatchRecovery, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
34
|
-
|
|
35
|
-
const recovery = new PartialBatchRecovery(logger);
|
|
36
|
-
const client = await createClient(ctx);
|
|
37
|
-
|
|
38
|
-
// Process with automatic recovery
|
|
39
|
-
const result = await recovery.processBatchWithRecovery(
|
|
40
|
-
inventoryRecords,
|
|
41
|
-
async (batch) => await client.sendBatch(jobId, {
|
|
42
|
-
action: 'UPSERT',
|
|
43
|
-
entityType: 'INVENTORY',
|
|
44
|
-
entities: batch
|
|
45
|
-
}),
|
|
46
|
-
{
|
|
47
|
-
maxRetries: 3,
|
|
48
|
-
retryOnlyFailed: true,
|
|
49
|
-
checkpointKey: 'inventory-2025-01-30'
|
|
50
|
-
}
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
console.log(`✅ Success: ${result.successCount}`);
|
|
54
|
-
console.log(`❌ Failed: ${result.failedCount}`);
|
|
55
|
-
|
|
56
|
-
if (result.failedRecords.length > 0) {
|
|
57
|
-
// Handle failed records
|
|
58
|
-
await sendToDeadLetterQueue(result.failedRecords);
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
## API Reference
|
|
65
|
-
|
|
66
|
-
### Constructor
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
new PartialBatchRecovery<T>(logger?: StructuredLogger)
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
**Generic Type `T`:** The type of your records (e.g., `InventoryRecord`)
|
|
73
|
-
|
|
74
|
-
---
|
|
75
|
-
|
|
76
|
-
### processBatchWithRecovery()
|
|
77
|
-
|
|
78
|
-
Process a batch with automatic recovery and retry logic.
|
|
79
|
-
|
|
80
|
-
```typescript
|
|
81
|
-
await recovery.processBatchWithRecovery<T>(
|
|
82
|
-
records: T[],
|
|
83
|
-
batchProcessor: (records: T[]) => Promise<any>,
|
|
84
|
-
options?: BatchRecoveryOptions
|
|
85
|
-
): Promise<BatchRecoveryResult<T>>
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
**Parameters:**
|
|
89
|
-
|
|
90
|
-
- `records` - Array of records to process
|
|
91
|
-
- `batchProcessor` - Async function that processes a batch
|
|
92
|
-
- `options` - Recovery configuration
|
|
93
|
-
|
|
94
|
-
**Returns:** `BatchRecoveryResult<T>` with detailed outcome
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
## BatchRecoveryOptions
|
|
99
|
-
|
|
100
|
-
```typescript
|
|
101
|
-
interface BatchRecoveryOptions {
|
|
102
|
-
/** Maximum retry attempts per record (default: 3) */
|
|
103
|
-
maxRetries?: number;
|
|
104
|
-
|
|
105
|
-
/** Retry only failed records (true) or entire batch (false) (default: true) */
|
|
106
|
-
retryOnlyFailed?: boolean;
|
|
107
|
-
|
|
108
|
-
/** Checkpoint key for resume functionality */
|
|
109
|
-
checkpointKey?: string;
|
|
110
|
-
|
|
111
|
-
/** Delay between retries in ms (default: 1000) */
|
|
112
|
-
retryDelayMs?: number;
|
|
113
|
-
|
|
114
|
-
/** Custom retry predicate */
|
|
115
|
-
shouldRetry?: (error: Error, attemptCount: number) => boolean;
|
|
116
|
-
|
|
117
|
-
/** Batch size for retry operations (default: 100) */
|
|
118
|
-
retryBatchSize?: number;
|
|
119
|
-
}
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## BatchRecoveryResult
|
|
125
|
-
|
|
126
|
-
```typescript
|
|
127
|
-
interface BatchRecoveryResult<T> {
|
|
128
|
-
/** Total records processed */
|
|
129
|
-
totalRecords: number;
|
|
130
|
-
|
|
131
|
-
/** Successfully processed count */
|
|
132
|
-
successCount: number;
|
|
133
|
-
|
|
134
|
-
/** Failed records after all retries */
|
|
135
|
-
failedCount: number;
|
|
136
|
-
|
|
137
|
-
/** Details of failed records */
|
|
138
|
-
failedRecords: RecordFailure<T>[];
|
|
139
|
-
|
|
140
|
-
/** Checkpoint ID for resuming */
|
|
141
|
-
checkpointId?: string;
|
|
142
|
-
|
|
143
|
-
/** Human-readable summary */
|
|
144
|
-
summary: string;
|
|
145
|
-
|
|
146
|
-
/** Total processing time (ms) */
|
|
147
|
-
durationMs: number;
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## RecordFailure
|
|
154
|
-
|
|
155
|
-
```typescript
|
|
156
|
-
interface RecordFailure<T> {
|
|
157
|
-
/** Original record index */
|
|
158
|
-
index: number;
|
|
159
|
-
|
|
160
|
-
/** The record that failed */
|
|
161
|
-
record: T;
|
|
162
|
-
|
|
163
|
-
/** Error that occurred */
|
|
164
|
-
error: Error;
|
|
165
|
-
|
|
166
|
-
/** Number of retry attempts */
|
|
167
|
-
attemptCount: number;
|
|
168
|
-
|
|
169
|
-
/** Timestamp of failure */
|
|
170
|
-
timestamp: string;
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## Examples
|
|
177
|
-
|
|
178
|
-
### Example 1: Basic Recovery
|
|
179
|
-
|
|
180
|
-
```typescript
|
|
181
|
-
const recovery = new PartialBatchRecovery(logger);
|
|
182
|
-
|
|
183
|
-
const records = [
|
|
184
|
-
{ ref: 'SKU-001', qty: 100, locationRef: 'DC-001' },
|
|
185
|
-
{ ref: 'SKU-002', qty: 200, locationRef: 'DC-002' },
|
|
186
|
-
// ... 1000 records
|
|
187
|
-
];
|
|
188
|
-
|
|
189
|
-
const result = await recovery.processBatchWithRecovery(
|
|
190
|
-
records,
|
|
191
|
-
async (batch) => {
|
|
192
|
-
return await client.sendBatch(jobId, {
|
|
193
|
-
action: 'UPSERT',
|
|
194
|
-
entityType: 'INVENTORY',
|
|
195
|
-
entities: batch
|
|
196
|
-
});
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
maxRetries: 3,
|
|
200
|
-
retryOnlyFailed: true
|
|
201
|
-
}
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
logger.info('Batch processing complete', {
|
|
205
|
-
total: result.totalRecords,
|
|
206
|
-
success: result.successCount,
|
|
207
|
-
failed: result.failedCount,
|
|
208
|
-
duration: result.durationMs
|
|
209
|
-
});
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
### Example 2: Custom Retry Logic
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
const result = await recovery.processBatchWithRecovery(
|
|
218
|
-
records,
|
|
219
|
-
batchProcessor,
|
|
220
|
-
{
|
|
221
|
-
maxRetries: 5,
|
|
222
|
-
retryDelayMs: 2000,
|
|
223
|
-
shouldRetry: (error, attemptCount) => {
|
|
224
|
-
// Don't retry validation errors
|
|
225
|
-
if (error.message.includes('VALIDATION')) {
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// Retry transient errors
|
|
230
|
-
if (error.message.includes('TIMEOUT') ||
|
|
231
|
-
error.message.includes('RATE_LIMIT')) {
|
|
232
|
-
return attemptCount < 5;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
return false;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
);
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
---
|
|
242
|
-
|
|
243
|
-
### Example 3: Checkpoint/Resume
|
|
244
|
-
|
|
245
|
-
```typescript
|
|
246
|
-
const checkpointKey = `inventory-${new Date().toISOString().split('T')[0]}`;
|
|
247
|
-
|
|
248
|
-
// First attempt
|
|
249
|
-
const result = await recovery.processBatchWithRecovery(
|
|
250
|
-
records,
|
|
251
|
-
batchProcessor,
|
|
252
|
-
{
|
|
253
|
-
checkpointKey,
|
|
254
|
-
maxRetries: 3
|
|
255
|
-
}
|
|
256
|
-
);
|
|
257
|
-
|
|
258
|
-
// If there were failures, you can resume later
|
|
259
|
-
if (result.failedRecords.length > 0) {
|
|
260
|
-
logger.warn('Some records failed, saved checkpoint', {
|
|
261
|
-
checkpointId: result.checkpointId,
|
|
262
|
-
failedCount: result.failedCount
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
// Later, retry just the failed records
|
|
266
|
-
const checkpoint = recovery.getCheckpoint(checkpointKey);
|
|
267
|
-
if (checkpoint) {
|
|
268
|
-
const retryResult = await recovery.processBatchWithRecovery(
|
|
269
|
-
checkpoint.failedRecords.map(f => f.record),
|
|
270
|
-
batchProcessor,
|
|
271
|
-
{ maxRetries: 3 }
|
|
272
|
-
);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
---
|
|
278
|
-
|
|
279
|
-
### Example 4: Dead Letter Queue Pattern
|
|
280
|
-
|
|
281
|
-
```typescript
|
|
282
|
-
async function processWithDLQ(records: any[]) {
|
|
283
|
-
const recovery = new PartialBatchRecovery(logger);
|
|
284
|
-
|
|
285
|
-
const result = await recovery.processBatchWithRecovery(
|
|
286
|
-
records,
|
|
287
|
-
batchProcessor,
|
|
288
|
-
{
|
|
289
|
-
maxRetries: 3,
|
|
290
|
-
retryOnlyFailed: true
|
|
291
|
-
}
|
|
292
|
-
);
|
|
293
|
-
|
|
294
|
-
// Send failed records to DLQ for manual review
|
|
295
|
-
if (result.failedRecords.length > 0) {
|
|
296
|
-
await s3.uploadFile(
|
|
297
|
-
`dlq/failed-${Date.now()}.json`,
|
|
298
|
-
JSON.stringify({
|
|
299
|
-
timestamp: new Date().toISOString(),
|
|
300
|
-
totalFailed: result.failedCount,
|
|
301
|
-
records: result.failedRecords.map(f => ({
|
|
302
|
-
record: f.record,
|
|
303
|
-
error: f.error.message,
|
|
304
|
-
attempts: f.attemptCount,
|
|
305
|
-
timestamp: f.timestamp
|
|
306
|
-
}))
|
|
307
|
-
}, null, 2)
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
logger.error('Records sent to DLQ', {
|
|
311
|
-
count: result.failedCount,
|
|
312
|
-
dlqKey: `dlq/failed-${Date.now()}.json`
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
// Optionally send alert
|
|
316
|
-
await sendAlert({
|
|
317
|
-
type: 'BATCH_PARTIAL_FAILURE',
|
|
318
|
-
failedCount: result.failedCount,
|
|
319
|
-
totalCount: result.totalRecords
|
|
320
|
-
});
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return result;
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
---
|
|
328
|
-
|
|
329
|
-
## Patterns
|
|
330
|
-
|
|
331
|
-
### Pattern 1: Retry Only Failed
|
|
332
|
-
|
|
333
|
-
```typescript
|
|
334
|
-
const result = await recovery.processBatchWithRecovery(
|
|
335
|
-
records,
|
|
336
|
-
batchProcessor,
|
|
337
|
-
{
|
|
338
|
-
retryOnlyFailed: true,
|
|
339
|
-
maxRetries: 3
|
|
340
|
-
}
|
|
341
|
-
);
|
|
342
|
-
```
|
|
343
|
-
|
|
344
|
-
**Benefits:**
|
|
345
|
-
- Faster recovery
|
|
346
|
-
- Reduces duplicate submissions
|
|
347
|
-
- Lower API costs
|
|
348
|
-
|
|
349
|
-
---
|
|
350
|
-
|
|
351
|
-
### Pattern 2: Retry Entire Batch
|
|
352
|
-
|
|
353
|
-
```typescript
|
|
354
|
-
// Use when batch must be atomic
|
|
355
|
-
const result = await recovery.processBatchWithRecovery(
|
|
356
|
-
records,
|
|
357
|
-
batchProcessor,
|
|
358
|
-
{
|
|
359
|
-
retryOnlyFailed: false, // Retry entire batch
|
|
360
|
-
maxRetries: 2
|
|
361
|
-
}
|
|
362
|
-
);
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
**Use When:**
|
|
366
|
-
- Batch operations must be atomic
|
|
367
|
-
- Records are interdependent
|
|
368
|
-
- Fluent BPP requires full snapshot
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
### Pattern 3: Exponential Backoff
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
let retryDelay = 1000;
|
|
376
|
-
|
|
377
|
-
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
378
|
-
const result = await recovery.processBatchWithRecovery(
|
|
379
|
-
records,
|
|
380
|
-
batchProcessor,
|
|
381
|
-
{
|
|
382
|
-
retryDelayMs: retryDelay,
|
|
383
|
-
maxRetries: 1 // Manual retry control
|
|
384
|
-
}
|
|
385
|
-
);
|
|
386
|
-
|
|
387
|
-
if (result.failedCount === 0) break;
|
|
388
|
-
|
|
389
|
-
retryDelay *= 2; // Double delay each attempt
|
|
390
|
-
records = result.failedRecords.map(f => f.record);
|
|
391
|
-
}
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
### Pattern 4: Multi-Stage Recovery
|
|
397
|
-
|
|
398
|
-
```typescript
|
|
399
|
-
async function multiStageRecovery(records: any[]) {
|
|
400
|
-
// Stage 1: Fast retries (transient errors)
|
|
401
|
-
let result = await recovery.processBatchWithRecovery(
|
|
402
|
-
records,
|
|
403
|
-
batchProcessor,
|
|
404
|
-
{
|
|
405
|
-
maxRetries: 2,
|
|
406
|
-
retryDelayMs: 500,
|
|
407
|
-
retryOnlyFailed: true
|
|
408
|
-
}
|
|
409
|
-
);
|
|
410
|
-
|
|
411
|
-
if (result.failedCount === 0) return result;
|
|
412
|
-
|
|
413
|
-
// Stage 2: Slower retries with backoff
|
|
414
|
-
const stage2Result = await recovery.processBatchWithRecovery(
|
|
415
|
-
result.failedRecords.map(f => f.record),
|
|
416
|
-
batchProcessor,
|
|
417
|
-
{
|
|
418
|
-
maxRetries: 3,
|
|
419
|
-
retryDelayMs: 5000,
|
|
420
|
-
retryOnlyFailed: true
|
|
421
|
-
}
|
|
422
|
-
);
|
|
423
|
-
|
|
424
|
-
if (stage2Result.failedCount === 0) {
|
|
425
|
-
return {
|
|
426
|
-
...stage2Result,
|
|
427
|
-
totalRecords: result.totalRecords,
|
|
428
|
-
successCount: result.totalRecords
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
// Stage 3: Send to DLQ
|
|
433
|
-
await sendToDLQ(stage2Result.failedRecords);
|
|
434
|
-
|
|
435
|
-
return stage2Result;
|
|
436
|
-
}
|
|
437
|
-
```
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
## Patterns
|
|
442
|
-
|
|
443
|
-
### 1. Always Check Failed Records
|
|
444
|
-
|
|
445
|
-
```typescript
|
|
446
|
-
const result = await recovery.processBatchWithRecovery(records, processor);
|
|
447
|
-
|
|
448
|
-
if (result.failedCount > 0) {
|
|
449
|
-
logger.error('Batch had failures', {
|
|
450
|
-
failed: result.failedCount,
|
|
451
|
-
total: result.totalRecords
|
|
452
|
-
});
|
|
453
|
-
|
|
454
|
-
await handleFailures(result.failedRecords);
|
|
455
|
-
}
|
|
456
|
-
```
|
|
457
|
-
|
|
458
|
-
### 2. Use Appropriate Batch Sizes
|
|
459
|
-
|
|
460
|
-
```typescript
|
|
461
|
-
const result = await recovery.processBatchWithRecovery(
|
|
462
|
-
records,
|
|
463
|
-
batchProcessor,
|
|
464
|
-
{
|
|
465
|
-
retryBatchSize: 100
|
|
466
|
-
}
|
|
467
|
-
);
|
|
468
|
-
```
|
|
469
|
-
|
|
470
|
-
### 3. Implement Dead Letter Queue
|
|
471
|
-
|
|
472
|
-
```typescript
|
|
473
|
-
if (result.failedRecords.length > 0) {
|
|
474
|
-
await saveToDLQ(result.failedRecords);
|
|
475
|
-
await notifyTeam(result.failedCount);
|
|
476
|
-
}
|
|
477
|
-
```
|
|
478
|
-
|
|
479
|
-
### 4. Set Realistic Retry Limits
|
|
480
|
-
|
|
481
|
-
```typescript
|
|
482
|
-
maxRetries: 3
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
---
|
|
486
|
-
|
|
487
|
-
## Performance Considerations
|
|
488
|
-
|
|
489
|
-
**Overhead:** ~5-10% for tracking
|
|
490
|
-
**Memory:** O(n) for failed records
|
|
491
|
-
**Network:** Only retries failed records (with `retryOnlyFailed: true`)
|
|
492
|
-
|
|
493
|
-
**Optimization Tips:**
|
|
494
|
-
```typescript
|
|
495
|
-
// 1. Use retryOnlyFailed for efficiency
|
|
496
|
-
retryOnlyFailed: true
|
|
497
|
-
|
|
498
|
-
// 2. Reasonable batch sizes
|
|
499
|
-
retryBatchSize: 100
|
|
500
|
-
|
|
501
|
-
// 3. Short retry delays for transient errors
|
|
502
|
-
retryDelayMs: 1000
|
|
503
|
-
|
|
504
|
-
// 4. Custom retry predicates to skip non-retryable
|
|
505
|
-
shouldRetry: (error) => !error.message.includes('VALIDATION')
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
---
|
|
509
|
-
|
|
510
|
-
## Troubleshooting
|
|
511
|
-
|
|
512
|
-
### All Records Failing
|
|
513
|
-
|
|
514
|
-
**Problem:** `failedCount === totalRecords`
|
|
515
|
-
|
|
516
|
-
**Causes:**
|
|
517
|
-
1. Batch processor function has a bug
|
|
518
|
-
2. API credentials invalid
|
|
519
|
-
3. Network connectivity issues
|
|
520
|
-
|
|
521
|
-
**Solution:**
|
|
522
|
-
```typescript
|
|
523
|
-
// Test processor with small batch
|
|
524
|
-
const testResult = await recovery.processBatchWithRecovery(
|
|
525
|
-
records.slice(0, 10),
|
|
526
|
-
batchProcessor,
|
|
527
|
-
{ maxRetries: 1 }
|
|
528
|
-
);
|
|
529
|
-
|
|
530
|
-
if (testResult.failedCount > 0) {
|
|
531
|
-
console.error('Processor error:', testResult.failedRecords[0].error);
|
|
532
|
-
}
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
---
|
|
536
|
-
|
|
537
|
-
### Infinite Retries
|
|
538
|
-
|
|
539
|
-
**Problem:** Records keep failing and retrying
|
|
540
|
-
|
|
541
|
-
**Cause:** `shouldRetry` always returns true
|
|
542
|
-
|
|
543
|
-
**Solution:**
|
|
544
|
-
```typescript
|
|
545
|
-
shouldRetry: (error, attemptCount) => {
|
|
546
|
-
return attemptCount < 3 && isRetryableError(error);
|
|
547
|
-
}
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
---
|
|
551
|
-
|
|
552
|
-
## See Also
|
|
553
|
-
|
|
554
|
-
- [JobTracker](./advanced-services-job-tracker.md) - Track job status
|
|
555
|
-
- [BatchArchivalService](./advanced-services-batch-archival.md) - Archive batches
|
|
556
|
-
- [Error Handling](../api-reference/modules/api-reference-09-error-handling.md) - Error strategies
|
|
557
|
-
- [Ingestion Best Practices](../ingestion/modules/02-core-guides-ingestion-09-best-practices.md)
|
|
558
|
-
|
|
559
|
-
---
|
|
560
|
-
|
|
561
|
-
[← Back: JobTracker](./advanced-services-job-tracker.md) | [Advanced Services Overview](./advanced-services-readme.md) | [Next: BatchArchival →](./advanced-services-batch-archival.md)
|
|
1
|
+
# PartialBatchRecovery
|
|
2
|
+
|
|
3
|
+
**Level:** Advanced
|
|
4
|
+
**Category:** Resilience & Error Recovery
|
|
5
|
+
**Purpose:** Recover from partial batch failures without losing all data
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
`PartialBatchRecovery` enables per-record tracking in batch operations, allowing you to retry only failed records instead of re-processing the entire batch. This dramatically improves resilience and reduces data loss in production workflows.
|
|
10
|
+
|
|
11
|
+
## Use Cases
|
|
12
|
+
|
|
13
|
+
- ✅ Handle transient API failures gracefully
|
|
14
|
+
- ✅ Implement checkpoint/resume functionality
|
|
15
|
+
- ✅ Retry individual failed records
|
|
16
|
+
- ✅ Track detailed error information per record
|
|
17
|
+
- ✅ Reduce duplicate submissions
|
|
18
|
+
- ✅ Minimize data loss on partial failures
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { PartialBatchRecovery } from '@fluentcommerce/fc-connect-sdk';
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Quick Start
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { PartialBatchRecovery, createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
34
|
+
|
|
35
|
+
const recovery = new PartialBatchRecovery(logger);
|
|
36
|
+
const client = await createClient(ctx);
|
|
37
|
+
|
|
38
|
+
// Process with automatic recovery
|
|
39
|
+
const result = await recovery.processBatchWithRecovery(
|
|
40
|
+
inventoryRecords,
|
|
41
|
+
async (batch) => await client.sendBatch(jobId, {
|
|
42
|
+
action: 'UPSERT',
|
|
43
|
+
entityType: 'INVENTORY',
|
|
44
|
+
entities: batch
|
|
45
|
+
}),
|
|
46
|
+
{
|
|
47
|
+
maxRetries: 3,
|
|
48
|
+
retryOnlyFailed: true,
|
|
49
|
+
checkpointKey: 'inventory-2025-01-30'
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
console.log(`✅ Success: ${result.successCount}`);
|
|
54
|
+
console.log(`❌ Failed: ${result.failedCount}`);
|
|
55
|
+
|
|
56
|
+
if (result.failedRecords.length > 0) {
|
|
57
|
+
// Handle failed records
|
|
58
|
+
await sendToDeadLetterQueue(result.failedRecords);
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## API Reference
|
|
65
|
+
|
|
66
|
+
### Constructor
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
new PartialBatchRecovery<T>(logger?: StructuredLogger)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Generic Type `T`:** The type of your records (e.g., `InventoryRecord`)
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
### processBatchWithRecovery()
|
|
77
|
+
|
|
78
|
+
Process a batch with automatic recovery and retry logic.
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
await recovery.processBatchWithRecovery<T>(
|
|
82
|
+
records: T[],
|
|
83
|
+
batchProcessor: (records: T[]) => Promise<any>,
|
|
84
|
+
options?: BatchRecoveryOptions
|
|
85
|
+
): Promise<BatchRecoveryResult<T>>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Parameters:**
|
|
89
|
+
|
|
90
|
+
- `records` - Array of records to process
|
|
91
|
+
- `batchProcessor` - Async function that processes a batch
|
|
92
|
+
- `options` - Recovery configuration
|
|
93
|
+
|
|
94
|
+
**Returns:** `BatchRecoveryResult<T>` with detailed outcome
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## BatchRecoveryOptions
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
interface BatchRecoveryOptions {
|
|
102
|
+
/** Maximum retry attempts per record (default: 3) */
|
|
103
|
+
maxRetries?: number;
|
|
104
|
+
|
|
105
|
+
/** Retry only failed records (true) or entire batch (false) (default: true) */
|
|
106
|
+
retryOnlyFailed?: boolean;
|
|
107
|
+
|
|
108
|
+
/** Checkpoint key for resume functionality */
|
|
109
|
+
checkpointKey?: string;
|
|
110
|
+
|
|
111
|
+
/** Delay between retries in ms (default: 1000) */
|
|
112
|
+
retryDelayMs?: number;
|
|
113
|
+
|
|
114
|
+
/** Custom retry predicate */
|
|
115
|
+
shouldRetry?: (error: Error, attemptCount: number) => boolean;
|
|
116
|
+
|
|
117
|
+
/** Batch size for retry operations (default: 100) */
|
|
118
|
+
retryBatchSize?: number;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## BatchRecoveryResult
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
interface BatchRecoveryResult<T> {
|
|
128
|
+
/** Total records processed */
|
|
129
|
+
totalRecords: number;
|
|
130
|
+
|
|
131
|
+
/** Successfully processed count */
|
|
132
|
+
successCount: number;
|
|
133
|
+
|
|
134
|
+
/** Failed records after all retries */
|
|
135
|
+
failedCount: number;
|
|
136
|
+
|
|
137
|
+
/** Details of failed records */
|
|
138
|
+
failedRecords: RecordFailure<T>[];
|
|
139
|
+
|
|
140
|
+
/** Checkpoint ID for resuming */
|
|
141
|
+
checkpointId?: string;
|
|
142
|
+
|
|
143
|
+
/** Human-readable summary */
|
|
144
|
+
summary: string;
|
|
145
|
+
|
|
146
|
+
/** Total processing time (ms) */
|
|
147
|
+
durationMs: number;
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## RecordFailure
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
interface RecordFailure<T> {
|
|
157
|
+
/** Original record index */
|
|
158
|
+
index: number;
|
|
159
|
+
|
|
160
|
+
/** The record that failed */
|
|
161
|
+
record: T;
|
|
162
|
+
|
|
163
|
+
/** Error that occurred */
|
|
164
|
+
error: Error;
|
|
165
|
+
|
|
166
|
+
/** Number of retry attempts */
|
|
167
|
+
attemptCount: number;
|
|
168
|
+
|
|
169
|
+
/** Timestamp of failure */
|
|
170
|
+
timestamp: string;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Examples
|
|
177
|
+
|
|
178
|
+
### Example 1: Basic Recovery
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
const recovery = new PartialBatchRecovery(logger);
|
|
182
|
+
|
|
183
|
+
const records = [
|
|
184
|
+
{ ref: 'SKU-001', qty: 100, locationRef: 'DC-001' },
|
|
185
|
+
{ ref: 'SKU-002', qty: 200, locationRef: 'DC-002' },
|
|
186
|
+
// ... 1000 records
|
|
187
|
+
];
|
|
188
|
+
|
|
189
|
+
const result = await recovery.processBatchWithRecovery(
|
|
190
|
+
records,
|
|
191
|
+
async (batch) => {
|
|
192
|
+
return await client.sendBatch(jobId, {
|
|
193
|
+
action: 'UPSERT',
|
|
194
|
+
entityType: 'INVENTORY',
|
|
195
|
+
entities: batch
|
|
196
|
+
});
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
maxRetries: 3,
|
|
200
|
+
retryOnlyFailed: true
|
|
201
|
+
}
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
logger.info('Batch processing complete', {
|
|
205
|
+
total: result.totalRecords,
|
|
206
|
+
success: result.successCount,
|
|
207
|
+
failed: result.failedCount,
|
|
208
|
+
duration: result.durationMs
|
|
209
|
+
});
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
### Example 2: Custom Retry Logic
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
const result = await recovery.processBatchWithRecovery(
|
|
218
|
+
records,
|
|
219
|
+
batchProcessor,
|
|
220
|
+
{
|
|
221
|
+
maxRetries: 5,
|
|
222
|
+
retryDelayMs: 2000,
|
|
223
|
+
shouldRetry: (error, attemptCount) => {
|
|
224
|
+
// Don't retry validation errors
|
|
225
|
+
if (error.message.includes('VALIDATION')) {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Retry transient errors
|
|
230
|
+
if (error.message.includes('TIMEOUT') ||
|
|
231
|
+
error.message.includes('RATE_LIMIT')) {
|
|
232
|
+
return attemptCount < 5;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
---
|
|
242
|
+
|
|
243
|
+
### Example 3: Checkpoint/Resume
|
|
244
|
+
|
|
245
|
+
```typescript
|
|
246
|
+
const checkpointKey = `inventory-${new Date().toISOString().split('T')[0]}`;
|
|
247
|
+
|
|
248
|
+
// First attempt
|
|
249
|
+
const result = await recovery.processBatchWithRecovery(
|
|
250
|
+
records,
|
|
251
|
+
batchProcessor,
|
|
252
|
+
{
|
|
253
|
+
checkpointKey,
|
|
254
|
+
maxRetries: 3
|
|
255
|
+
}
|
|
256
|
+
);
|
|
257
|
+
|
|
258
|
+
// If there were failures, you can resume later
|
|
259
|
+
if (result.failedRecords.length > 0) {
|
|
260
|
+
logger.warn('Some records failed, saved checkpoint', {
|
|
261
|
+
checkpointId: result.checkpointId,
|
|
262
|
+
failedCount: result.failedCount
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
// Later, retry just the failed records
|
|
266
|
+
const checkpoint = recovery.getCheckpoint(checkpointKey);
|
|
267
|
+
if (checkpoint) {
|
|
268
|
+
const retryResult = await recovery.processBatchWithRecovery(
|
|
269
|
+
checkpoint.failedRecords.map(f => f.record),
|
|
270
|
+
batchProcessor,
|
|
271
|
+
{ maxRetries: 3 }
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
---
|
|
278
|
+
|
|
279
|
+
### Example 4: Dead Letter Queue Pattern
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
async function processWithDLQ(records: any[]) {
|
|
283
|
+
const recovery = new PartialBatchRecovery(logger);
|
|
284
|
+
|
|
285
|
+
const result = await recovery.processBatchWithRecovery(
|
|
286
|
+
records,
|
|
287
|
+
batchProcessor,
|
|
288
|
+
{
|
|
289
|
+
maxRetries: 3,
|
|
290
|
+
retryOnlyFailed: true
|
|
291
|
+
}
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
// Send failed records to DLQ for manual review
|
|
295
|
+
if (result.failedRecords.length > 0) {
|
|
296
|
+
await s3.uploadFile(
|
|
297
|
+
`dlq/failed-${Date.now()}.json`,
|
|
298
|
+
JSON.stringify({
|
|
299
|
+
timestamp: new Date().toISOString(),
|
|
300
|
+
totalFailed: result.failedCount,
|
|
301
|
+
records: result.failedRecords.map(f => ({
|
|
302
|
+
record: f.record,
|
|
303
|
+
error: f.error.message,
|
|
304
|
+
attempts: f.attemptCount,
|
|
305
|
+
timestamp: f.timestamp
|
|
306
|
+
}))
|
|
307
|
+
}, null, 2)
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
logger.error('Records sent to DLQ', {
|
|
311
|
+
count: result.failedCount,
|
|
312
|
+
dlqKey: `dlq/failed-${Date.now()}.json`
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
// Optionally send alert
|
|
316
|
+
await sendAlert({
|
|
317
|
+
type: 'BATCH_PARTIAL_FAILURE',
|
|
318
|
+
failedCount: result.failedCount,
|
|
319
|
+
totalCount: result.totalRecords
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
---
|
|
328
|
+
|
|
329
|
+
## Patterns
|
|
330
|
+
|
|
331
|
+
### Pattern 1: Retry Only Failed
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
const result = await recovery.processBatchWithRecovery(
|
|
335
|
+
records,
|
|
336
|
+
batchProcessor,
|
|
337
|
+
{
|
|
338
|
+
retryOnlyFailed: true,
|
|
339
|
+
maxRetries: 3
|
|
340
|
+
}
|
|
341
|
+
);
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
**Benefits:**
|
|
345
|
+
- Faster recovery
|
|
346
|
+
- Reduces duplicate submissions
|
|
347
|
+
- Lower API costs
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
### Pattern 2: Retry Entire Batch
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
// Use when batch must be atomic
|
|
355
|
+
const result = await recovery.processBatchWithRecovery(
|
|
356
|
+
records,
|
|
357
|
+
batchProcessor,
|
|
358
|
+
{
|
|
359
|
+
retryOnlyFailed: false, // Retry entire batch
|
|
360
|
+
maxRetries: 2
|
|
361
|
+
}
|
|
362
|
+
);
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Use When:**
|
|
366
|
+
- Batch operations must be atomic
|
|
367
|
+
- Records are interdependent
|
|
368
|
+
- Fluent BPP requires full snapshot
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
### Pattern 3: Exponential Backoff
|
|
373
|
+
|
|
374
|
+
```typescript
|
|
375
|
+
let retryDelay = 1000;
|
|
376
|
+
|
|
377
|
+
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
378
|
+
const result = await recovery.processBatchWithRecovery(
|
|
379
|
+
records,
|
|
380
|
+
batchProcessor,
|
|
381
|
+
{
|
|
382
|
+
retryDelayMs: retryDelay,
|
|
383
|
+
maxRetries: 1 // Manual retry control
|
|
384
|
+
}
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
if (result.failedCount === 0) break;
|
|
388
|
+
|
|
389
|
+
retryDelay *= 2; // Double delay each attempt
|
|
390
|
+
records = result.failedRecords.map(f => f.record);
|
|
391
|
+
}
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
### Pattern 4: Multi-Stage Recovery
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
async function multiStageRecovery(records: any[]) {
|
|
400
|
+
// Stage 1: Fast retries (transient errors)
|
|
401
|
+
let result = await recovery.processBatchWithRecovery(
|
|
402
|
+
records,
|
|
403
|
+
batchProcessor,
|
|
404
|
+
{
|
|
405
|
+
maxRetries: 2,
|
|
406
|
+
retryDelayMs: 500,
|
|
407
|
+
retryOnlyFailed: true
|
|
408
|
+
}
|
|
409
|
+
);
|
|
410
|
+
|
|
411
|
+
if (result.failedCount === 0) return result;
|
|
412
|
+
|
|
413
|
+
// Stage 2: Slower retries with backoff
|
|
414
|
+
const stage2Result = await recovery.processBatchWithRecovery(
|
|
415
|
+
result.failedRecords.map(f => f.record),
|
|
416
|
+
batchProcessor,
|
|
417
|
+
{
|
|
418
|
+
maxRetries: 3,
|
|
419
|
+
retryDelayMs: 5000,
|
|
420
|
+
retryOnlyFailed: true
|
|
421
|
+
}
|
|
422
|
+
);
|
|
423
|
+
|
|
424
|
+
if (stage2Result.failedCount === 0) {
|
|
425
|
+
return {
|
|
426
|
+
...stage2Result,
|
|
427
|
+
totalRecords: result.totalRecords,
|
|
428
|
+
successCount: result.totalRecords
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
// Stage 3: Send to DLQ
|
|
433
|
+
await sendToDLQ(stage2Result.failedRecords);
|
|
434
|
+
|
|
435
|
+
return stage2Result;
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
## Patterns
|
|
442
|
+
|
|
443
|
+
### 1. Always Check Failed Records
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
const result = await recovery.processBatchWithRecovery(records, processor);
|
|
447
|
+
|
|
448
|
+
if (result.failedCount > 0) {
|
|
449
|
+
logger.error('Batch had failures', {
|
|
450
|
+
failed: result.failedCount,
|
|
451
|
+
total: result.totalRecords
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
await handleFailures(result.failedRecords);
|
|
455
|
+
}
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### 2. Use Appropriate Batch Sizes
|
|
459
|
+
|
|
460
|
+
```typescript
|
|
461
|
+
const result = await recovery.processBatchWithRecovery(
|
|
462
|
+
records,
|
|
463
|
+
batchProcessor,
|
|
464
|
+
{
|
|
465
|
+
retryBatchSize: 100
|
|
466
|
+
}
|
|
467
|
+
);
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### 3. Implement Dead Letter Queue
|
|
471
|
+
|
|
472
|
+
```typescript
|
|
473
|
+
if (result.failedRecords.length > 0) {
|
|
474
|
+
await saveToDLQ(result.failedRecords);
|
|
475
|
+
await notifyTeam(result.failedCount);
|
|
476
|
+
}
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
### 4. Set Realistic Retry Limits
|
|
480
|
+
|
|
481
|
+
```typescript
|
|
482
|
+
maxRetries: 3
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
487
|
+
## Performance Considerations
|
|
488
|
+
|
|
489
|
+
**Overhead:** ~5-10% for tracking
|
|
490
|
+
**Memory:** O(n) for failed records
|
|
491
|
+
**Network:** Only retries failed records (with `retryOnlyFailed: true`)
|
|
492
|
+
|
|
493
|
+
**Optimization Tips:**
|
|
494
|
+
```typescript
|
|
495
|
+
// 1. Use retryOnlyFailed for efficiency
|
|
496
|
+
retryOnlyFailed: true
|
|
497
|
+
|
|
498
|
+
// 2. Reasonable batch sizes
|
|
499
|
+
retryBatchSize: 100
|
|
500
|
+
|
|
501
|
+
// 3. Short retry delays for transient errors
|
|
502
|
+
retryDelayMs: 1000
|
|
503
|
+
|
|
504
|
+
// 4. Custom retry predicates to skip non-retryable
|
|
505
|
+
shouldRetry: (error) => !error.message.includes('VALIDATION')
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
---
|
|
509
|
+
|
|
510
|
+
## Troubleshooting
|
|
511
|
+
|
|
512
|
+
### All Records Failing
|
|
513
|
+
|
|
514
|
+
**Problem:** `failedCount === totalRecords`
|
|
515
|
+
|
|
516
|
+
**Causes:**
|
|
517
|
+
1. Batch processor function has a bug
|
|
518
|
+
2. API credentials invalid
|
|
519
|
+
3. Network connectivity issues
|
|
520
|
+
|
|
521
|
+
**Solution:**
|
|
522
|
+
```typescript
|
|
523
|
+
// Test processor with small batch
|
|
524
|
+
const testResult = await recovery.processBatchWithRecovery(
|
|
525
|
+
records.slice(0, 10),
|
|
526
|
+
batchProcessor,
|
|
527
|
+
{ maxRetries: 1 }
|
|
528
|
+
);
|
|
529
|
+
|
|
530
|
+
if (testResult.failedCount > 0) {
|
|
531
|
+
console.error('Processor error:', testResult.failedRecords[0].error);
|
|
532
|
+
}
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
---
|
|
536
|
+
|
|
537
|
+
### Infinite Retries
|
|
538
|
+
|
|
539
|
+
**Problem:** Records keep failing and retrying
|
|
540
|
+
|
|
541
|
+
**Cause:** `shouldRetry` always returns true
|
|
542
|
+
|
|
543
|
+
**Solution:**
|
|
544
|
+
```typescript
|
|
545
|
+
shouldRetry: (error, attemptCount) => {
|
|
546
|
+
return attemptCount < 3 && isRetryableError(error);
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## See Also
|
|
553
|
+
|
|
554
|
+
- [JobTracker](./advanced-services-job-tracker.md) - Track job status
|
|
555
|
+
- [BatchArchivalService](./advanced-services-batch-archival.md) - Archive batches
|
|
556
|
+
- [Error Handling](../api-reference/modules/api-reference-09-error-handling.md) - Error strategies
|
|
557
|
+
- [Ingestion Best Practices](../ingestion/modules/02-core-guides-ingestion-09-best-practices.md)
|
|
558
|
+
|
|
559
|
+
---
|
|
560
|
+
|
|
561
|
+
[← Back: JobTracker](./advanced-services-job-tracker.md) | [Advanced Services Overview](./advanced-services-readme.md) | [Next: BatchArchival →](./advanced-services-batch-archival.md)
|