@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.55
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/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,527 +1,527 @@
|
|
|
1
|
-
# Module 09: Error Handling
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Category:** Error Management
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
The SDK provides comprehensive error handling with typed error classes, error codes, and recovery patterns for building resilient integrations.
|
|
9
|
-
|
|
10
|
-
## Table of Contents
|
|
11
|
-
|
|
12
|
-
- [IngestionError Class](#ingestionerror-class)
|
|
13
|
-
- [Error Codes](#error-codes)
|
|
14
|
-
- [Error Recovery Patterns](#error-recovery-patterns)
|
|
15
|
-
- [Retry with Exponential Backoff](#retry-with-exponential-backoff)
|
|
16
|
-
- [Error Code Handling](#error-code-handling)
|
|
17
|
-
- [Job Expiration Recovery](#job-expiration-recovery)
|
|
18
|
-
- [Rate Limit Handling](#rate-limit-handling)
|
|
19
|
-
- [Error Context](#error-context)
|
|
20
|
-
- [Best Practices](#best-practices)
|
|
21
|
-
- [See Also](#see-also)
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## IngestionError Class
|
|
26
|
-
|
|
27
|
-
Custom error class for SDK operations with error codes and context.
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
31
|
-
|
|
32
|
-
try {
|
|
33
|
-
await client.sendBatch(jobId, data);
|
|
34
|
-
} catch (error) {
|
|
35
|
-
if (error instanceof IngestionError) {
|
|
36
|
-
switch (error.code) {
|
|
37
|
-
case IngestionErrorCode.VALIDATION_ERROR:
|
|
38
|
-
console.error('Validation failed:', error.context);
|
|
39
|
-
break;
|
|
40
|
-
case IngestionErrorCode.JOB_EXPIRED:
|
|
41
|
-
// Create new job and retry
|
|
42
|
-
break;
|
|
43
|
-
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
44
|
-
// Implement backoff
|
|
45
|
-
break;
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
**Properties:**
|
|
52
|
-
- `code: IngestionErrorCode` - Error code enum for classification
|
|
53
|
-
- `message: string` - Human-readable error message
|
|
54
|
-
- `context?: any` - Additional context data (validation errors, API responses, etc.)
|
|
55
|
-
- `cause?: Error` - Original error that caused this error (error chaining)
|
|
56
|
-
|
|
57
|
-
**Constructor:**
|
|
58
|
-
```typescript
|
|
59
|
-
new IngestionError(
|
|
60
|
-
message: string,
|
|
61
|
-
code: IngestionErrorCode,
|
|
62
|
-
context?: any,
|
|
63
|
-
cause?: Error
|
|
64
|
-
)
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
**Example with Context:**
|
|
68
|
-
```typescript
|
|
69
|
-
try {
|
|
70
|
-
const result = await mapper.map(data);
|
|
71
|
-
if (!result.success) {
|
|
72
|
-
throw new IngestionError(
|
|
73
|
-
'Field mapping failed',
|
|
74
|
-
IngestionErrorCode.VALIDATION_ERROR,
|
|
75
|
-
{
|
|
76
|
-
errors: result.errors,
|
|
77
|
-
failedFields: result.errors.map(e => e.field)
|
|
78
|
-
}
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
} catch (error) {
|
|
82
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.VALIDATION_ERROR) {
|
|
83
|
-
console.error('Failed fields:', error.context.failedFields);
|
|
84
|
-
error.context.errors.forEach(err => {
|
|
85
|
-
console.error(`- ${err.field}: ${err.message}`);
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Error Codes
|
|
92
|
-
|
|
93
|
-
The SDK uses typed error codes for consistent error classification:
|
|
94
|
-
|
|
95
|
-
```typescript
|
|
96
|
-
enum IngestionErrorCode {
|
|
97
|
-
VALIDATION_ERROR = 'VALIDATION_ERROR',
|
|
98
|
-
AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR',
|
|
99
|
-
AUTHORIZATION_ERROR = 'AUTHORIZATION_ERROR',
|
|
100
|
-
RATE_LIMIT_ERROR = 'RATE_LIMIT_ERROR',
|
|
101
|
-
NETWORK_ERROR = 'NETWORK_ERROR',
|
|
102
|
-
JOB_EXPIRED = 'JOB_EXPIRED',
|
|
103
|
-
BATCH_FAILED = 'BATCH_FAILED',
|
|
104
|
-
PARSE_ERROR = 'PARSE_ERROR',
|
|
105
|
-
UNKNOWN_ERROR = 'UNKNOWN_ERROR'
|
|
106
|
-
}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
**Error Code Usage:**
|
|
110
|
-
|
|
111
|
-
| Error Code | When It Occurs | Typical Recovery |
|
|
112
|
-
|------------|---------------|------------------|
|
|
113
|
-
| `VALIDATION_ERROR` | Invalid data, missing required fields | Fix data, review mapping config |
|
|
114
|
-
| `AUTHENTICATION_ERROR` | Invalid credentials, token expired | Refresh token, check credentials |
|
|
115
|
-
| `AUTHORIZATION_ERROR` | Insufficient permissions | Check user roles, API permissions |
|
|
116
|
-
| `RATE_LIMIT_ERROR` | API rate limits exceeded | Implement backoff, reduce request rate |
|
|
117
|
-
| `NETWORK_ERROR` | Network failure, timeout | Retry with backoff |
|
|
118
|
-
| `JOB_EXPIRED` | Batch job expired (24h limit) | Create new job, resend batches |
|
|
119
|
-
| `BATCH_FAILED` | Batch API rejected data | Review batch contents, check logs |
|
|
120
|
-
| `PARSE_ERROR` | File parsing failed | Validate file format, check schema |
|
|
121
|
-
| `UNKNOWN_ERROR` | Unexpected error | Log details, contact support |
|
|
122
|
-
|
|
123
|
-
## Error Recovery Patterns
|
|
124
|
-
|
|
125
|
-
### Retry with Exponential Backoff
|
|
126
|
-
|
|
127
|
-
Handle transient errors with automatic retry and exponential backoff:
|
|
128
|
-
|
|
129
|
-
```typescript
|
|
130
|
-
async function retryWithBackoff<T>(
|
|
131
|
-
fn: () => Promise<T>,
|
|
132
|
-
maxRetries = 3,
|
|
133
|
-
initialDelayMs = 1000
|
|
134
|
-
): Promise<T> {
|
|
135
|
-
let lastError: Error;
|
|
136
|
-
|
|
137
|
-
for (let i = 0; i < maxRetries; i++) {
|
|
138
|
-
try {
|
|
139
|
-
return await fn();
|
|
140
|
-
} catch (error) {
|
|
141
|
-
lastError = error;
|
|
142
|
-
|
|
143
|
-
// Don't retry on validation errors or auth errors
|
|
144
|
-
if (error instanceof IngestionError) {
|
|
145
|
-
if (error.code === IngestionErrorCode.VALIDATION_ERROR ||
|
|
146
|
-
error.code === IngestionErrorCode.AUTHENTICATION_ERROR ||
|
|
147
|
-
error.code === IngestionErrorCode.AUTHORIZATION_ERROR) {
|
|
148
|
-
throw error; // Don't retry, fail fast
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Calculate exponential backoff delay
|
|
153
|
-
const delay = initialDelayMs * Math.pow(2, i);
|
|
154
|
-
console.log(`Retry ${i + 1}/${maxRetries} after ${delay}ms delay`);
|
|
155
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
throw lastError!;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Usage
|
|
163
|
-
const result = await retryWithBackoff(
|
|
164
|
-
() => client.sendBatch(jobId, data),
|
|
165
|
-
3, // max retries
|
|
166
|
-
1000 // initial delay 1s (then 2s, 4s)
|
|
167
|
-
);
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### Error Code Handling
|
|
171
|
-
|
|
172
|
-
Handle different error types with specific recovery strategies:
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
async function handleBatchOperation(
|
|
176
|
-
client: FluentClient,
|
|
177
|
-
jobId: string,
|
|
178
|
-
data: any[]
|
|
179
|
-
) {
|
|
180
|
-
try {
|
|
181
|
-
return await client.sendBatch(jobId, data);
|
|
182
|
-
} catch (error) {
|
|
183
|
-
if (!(error instanceof IngestionError)) {
|
|
184
|
-
throw error; // Re-throw non-SDK errors
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
switch (error.code) {
|
|
188
|
-
case IngestionErrorCode.VALIDATION_ERROR:
|
|
189
|
-
// Log validation errors and skip invalid records
|
|
190
|
-
console.error('Validation errors:', error.context);
|
|
191
|
-
return {
|
|
192
|
-
success: false,
|
|
193
|
-
errors: error.context.errors,
|
|
194
|
-
message: 'Some records failed validation'
|
|
195
|
-
};
|
|
196
|
-
|
|
197
|
-
case IngestionErrorCode.JOB_EXPIRED:
|
|
198
|
-
// Create new job and retry
|
|
199
|
-
console.warn('Job expired, creating new job');
|
|
200
|
-
const newJob = await client.createJob({
|
|
201
|
-
name: 'inventory-update-retry',
|
|
202
|
-
retailerId: client.config.retailerId
|
|
203
|
-
});
|
|
204
|
-
return await client.sendBatch(newJob.id, data);
|
|
205
|
-
|
|
206
|
-
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
207
|
-
// Wait and retry with backoff
|
|
208
|
-
console.warn('Rate limited, waiting before retry');
|
|
209
|
-
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
210
|
-
return await client.sendBatch(jobId, data);
|
|
211
|
-
|
|
212
|
-
case IngestionErrorCode.NETWORK_ERROR:
|
|
213
|
-
// Retry network errors
|
|
214
|
-
console.warn('Network error, retrying');
|
|
215
|
-
return await retryWithBackoff(() => client.sendBatch(jobId, data));
|
|
216
|
-
|
|
217
|
-
case IngestionErrorCode.AUTHENTICATION_ERROR:
|
|
218
|
-
// Retry (token refresh is automatic in v0.1.27+)
|
|
219
|
-
console.warn('Auth error, retrying with automatic token refresh');
|
|
220
|
-
return await client.sendBatch(jobId, data);
|
|
221
|
-
|
|
222
|
-
default:
|
|
223
|
-
// Log and re-throw unknown errors
|
|
224
|
-
console.error('Unexpected error:', error);
|
|
225
|
-
throw error;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
### Job Expiration Recovery
|
|
232
|
-
|
|
233
|
-
Handle batch job expiration (jobs expire after 24 hours):
|
|
234
|
-
|
|
235
|
-
```typescript
|
|
236
|
-
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
237
|
-
|
|
238
|
-
async function sendBatchWithJobRecovery(
|
|
239
|
-
client: FluentClient,
|
|
240
|
-
jobId: string,
|
|
241
|
-
data: any[]
|
|
242
|
-
) {
|
|
243
|
-
try {
|
|
244
|
-
return await client.sendBatch(jobId, data);
|
|
245
|
-
} catch (error) {
|
|
246
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.JOB_EXPIRED) {
|
|
247
|
-
console.warn('Job expired, creating new job');
|
|
248
|
-
|
|
249
|
-
// Create new job
|
|
250
|
-
const newJob = await client.createJob({
|
|
251
|
-
name: `inventory-update-${Date.now()}`,
|
|
252
|
-
retailerId: client.config.retailerId
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
console.log('Created new job:', newJob.id);
|
|
256
|
-
|
|
257
|
-
// Retry with new job
|
|
258
|
-
return await client.sendBatch(newJob.id, data);
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
throw error;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
```
|
|
265
|
-
|
|
266
|
-
### Rate Limit Handling
|
|
267
|
-
|
|
268
|
-
Handle API rate limits with adaptive backoff:
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
async function sendBatchWithRateLimitHandling(
|
|
272
|
-
client: FluentClient,
|
|
273
|
-
jobId: string,
|
|
274
|
-
data: any[],
|
|
275
|
-
maxRetries = 5
|
|
276
|
-
) {
|
|
277
|
-
let retryCount = 0;
|
|
278
|
-
|
|
279
|
-
while (retryCount < maxRetries) {
|
|
280
|
-
try {
|
|
281
|
-
return await client.sendBatch(jobId, data);
|
|
282
|
-
} catch (error) {
|
|
283
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.RATE_LIMIT_ERROR) {
|
|
284
|
-
retryCount++;
|
|
285
|
-
|
|
286
|
-
// Exponential backoff with jitter
|
|
287
|
-
const baseDelay = 1000 * Math.pow(2, retryCount);
|
|
288
|
-
const jitter = Math.random() * 1000;
|
|
289
|
-
const delay = baseDelay + jitter;
|
|
290
|
-
|
|
291
|
-
console.warn(`Rate limited, retry ${retryCount}/${maxRetries} after ${delay}ms`);
|
|
292
|
-
|
|
293
|
-
if (retryCount >= maxRetries) {
|
|
294
|
-
throw new IngestionError(
|
|
295
|
-
`Max retries exceeded for rate limit`,
|
|
296
|
-
IngestionErrorCode.RATE_LIMIT_ERROR,
|
|
297
|
-
{ retryCount, maxRetries }
|
|
298
|
-
);
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
await new Promise(resolve => setTimeout(resolve, delay));
|
|
302
|
-
} else {
|
|
303
|
-
throw error;
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
## Error Context
|
|
311
|
-
|
|
312
|
-
The `context` property provides detailed error information for debugging and recovery:
|
|
313
|
-
|
|
314
|
-
### Validation Error Context
|
|
315
|
-
|
|
316
|
-
```typescript
|
|
317
|
-
try {
|
|
318
|
-
const result = await mapper.map(data);
|
|
319
|
-
} catch (error) {
|
|
320
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.VALIDATION_ERROR) {
|
|
321
|
-
// Context contains validation details
|
|
322
|
-
console.error('Validation errors:', error.context);
|
|
323
|
-
// {
|
|
324
|
-
// errors: [
|
|
325
|
-
// { field: 'productRef', message: 'Required field missing' },
|
|
326
|
-
// { field: 'qty', message: 'Must be a number' }
|
|
327
|
-
// ],
|
|
328
|
-
// record: { ... },
|
|
329
|
-
// index: 42
|
|
330
|
-
// }
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### Network Error Context
|
|
336
|
-
|
|
337
|
-
```typescript
|
|
338
|
-
try {
|
|
339
|
-
await client.graphql({ query, variables });
|
|
340
|
-
} catch (error) {
|
|
341
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.NETWORK_ERROR) {
|
|
342
|
-
// Context contains network details
|
|
343
|
-
console.error('Network error:', error.context);
|
|
344
|
-
// {
|
|
345
|
-
// url: 'https://api.fluentcommerce.com/graphql',
|
|
346
|
-
// method: 'POST',
|
|
347
|
-
// statusCode: 503,
|
|
348
|
-
// timeout: 30000
|
|
349
|
-
// }
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### Batch Error Context
|
|
355
|
-
|
|
356
|
-
```typescript
|
|
357
|
-
try {
|
|
358
|
-
await client.sendBatch(jobId, data);
|
|
359
|
-
} catch (error) {
|
|
360
|
-
if (error instanceof IngestionError && error.code === IngestionErrorCode.BATCH_FAILED) {
|
|
361
|
-
// Context contains batch failure details
|
|
362
|
-
console.error('Batch failed:', error.context);
|
|
363
|
-
// {
|
|
364
|
-
// jobId: 'job-123',
|
|
365
|
-
// batchId: 'batch-456',
|
|
366
|
-
// failedRecords: 23,
|
|
367
|
-
// totalRecords: 100,
|
|
368
|
-
// errors: [...]
|
|
369
|
-
// }
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
## Best Practices
|
|
375
|
-
|
|
376
|
-
### 1. Always Use Type Guards
|
|
377
|
-
|
|
378
|
-
Check error types before accessing properties:
|
|
379
|
-
|
|
380
|
-
```typescript
|
|
381
|
-
// ✅ Correct
|
|
382
|
-
try {
|
|
383
|
-
await operation();
|
|
384
|
-
} catch (error) {
|
|
385
|
-
if (error instanceof IngestionError) {
|
|
386
|
-
console.error(`SDK Error [${error.code}]:`, error.message);
|
|
387
|
-
console.error('Context:', error.context);
|
|
388
|
-
} else {
|
|
389
|
-
console.error('Unknown error:', error);
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// ❌ Wrong - assumes error type
|
|
394
|
-
try {
|
|
395
|
-
await operation();
|
|
396
|
-
} catch (error) {
|
|
397
|
-
console.error(error.code); // May be undefined
|
|
398
|
-
}
|
|
399
|
-
```
|
|
400
|
-
|
|
401
|
-
### 2. Log Context for Debugging
|
|
402
|
-
|
|
403
|
-
Always log error context for troubleshooting:
|
|
404
|
-
|
|
405
|
-
```typescript
|
|
406
|
-
catch (error) {
|
|
407
|
-
if (error instanceof IngestionError) {
|
|
408
|
-
logger.error('Operation failed', {
|
|
409
|
-
code: error.code,
|
|
410
|
-
message: error.message,
|
|
411
|
-
context: error.context,
|
|
412
|
-
cause: error.cause
|
|
413
|
-
});
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### 3. Fail Fast on Unrecoverable Errors
|
|
419
|
-
|
|
420
|
-
Don't retry validation or authentication errors:
|
|
421
|
-
|
|
422
|
-
```typescript
|
|
423
|
-
const UNRECOVERABLE_ERRORS = [
|
|
424
|
-
IngestionErrorCode.VALIDATION_ERROR,
|
|
425
|
-
IngestionErrorCode.AUTHENTICATION_ERROR,
|
|
426
|
-
IngestionErrorCode.AUTHORIZATION_ERROR
|
|
427
|
-
];
|
|
428
|
-
|
|
429
|
-
async function retryableOperation() {
|
|
430
|
-
try {
|
|
431
|
-
return await operation();
|
|
432
|
-
} catch (error) {
|
|
433
|
-
if (error instanceof IngestionError &&
|
|
434
|
-
UNRECOVERABLE_ERRORS.includes(error.code)) {
|
|
435
|
-
throw error; // Fail immediately
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
// Retry for other errors
|
|
439
|
-
return await retryWithBackoff(() => operation());
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
```
|
|
443
|
-
|
|
444
|
-
### 4. Use Error Chaining
|
|
445
|
-
|
|
446
|
-
Preserve original errors with cause parameter:
|
|
447
|
-
|
|
448
|
-
```typescript
|
|
449
|
-
try {
|
|
450
|
-
const data = JSON.parse(content);
|
|
451
|
-
} catch (parseError) {
|
|
452
|
-
throw new IngestionError(
|
|
453
|
-
'Failed to parse JSON content',
|
|
454
|
-
IngestionErrorCode.PARSE_ERROR,
|
|
455
|
-
{ content: content.substring(0, 100) },
|
|
456
|
-
parseError // Preserve original error
|
|
457
|
-
);
|
|
458
|
-
}
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
### 5. Implement Circuit Breakers
|
|
462
|
-
|
|
463
|
-
Prevent cascading failures with circuit breaker pattern:
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
class CircuitBreaker {
|
|
467
|
-
private failures = 0;
|
|
468
|
-
private threshold = 5;
|
|
469
|
-
private timeout = 60000; // 1 minute
|
|
470
|
-
private isOpen = false;
|
|
471
|
-
private resetTimer?: NodeJS.Timeout;
|
|
472
|
-
|
|
473
|
-
async execute<T>(fn: () => Promise<T>): Promise<T> {
|
|
474
|
-
if (this.isOpen) {
|
|
475
|
-
throw new IngestionError(
|
|
476
|
-
'Circuit breaker is open',
|
|
477
|
-
IngestionErrorCode.NETWORK_ERROR,
|
|
478
|
-
{ failures: this.failures, threshold: this.threshold }
|
|
479
|
-
);
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
try {
|
|
483
|
-
const result = await fn();
|
|
484
|
-
this.onSuccess();
|
|
485
|
-
return result;
|
|
486
|
-
} catch (error) {
|
|
487
|
-
this.onFailure();
|
|
488
|
-
throw error;
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
private onSuccess() {
|
|
493
|
-
this.failures = 0;
|
|
494
|
-
}
|
|
495
|
-
|
|
496
|
-
private onFailure() {
|
|
497
|
-
this.failures++;
|
|
498
|
-
if (this.failures >= this.threshold) {
|
|
499
|
-
this.isOpen = true;
|
|
500
|
-
this.resetTimer = setTimeout(() => {
|
|
501
|
-
this.isOpen = false;
|
|
502
|
-
this.failures = 0;
|
|
503
|
-
}, this.timeout);
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
// Usage
|
|
509
|
-
const breaker = new CircuitBreaker();
|
|
510
|
-
|
|
511
|
-
try {
|
|
512
|
-
const result = await breaker.execute(() => client.sendBatch(jobId, data));
|
|
513
|
-
} catch (error) {
|
|
514
|
-
console.error('Operation failed:', error);
|
|
515
|
-
}
|
|
516
|
-
```
|
|
517
|
-
|
|
518
|
-
## See Also
|
|
519
|
-
|
|
520
|
-
- [Module 01: Client - Batch API](./api-reference-01-client-api.md#job-batch-operations) - Batch operation error handling
|
|
521
|
-
- [Module 08: Types](./api-reference-08-types.md) - IngestionErrorCode enum
|
|
522
|
-
- [Getting Started Guide](../../../00-START-HERE/getting-started.md) - Error handling basics
|
|
523
|
-
- [Troubleshooting Guide](../../../00-START-HERE/troubleshooting-quick-reference.md) - Common errors and solutions
|
|
524
|
-
|
|
525
|
-
---
|
|
526
|
-
|
|
527
|
-
**[← Previous: Module 08 - Types](./api-reference-08-types.md)** | **[API Reference Home](../api-reference-readme.md)** | **[Next: Module 10 - Utilities →](./api-reference-10-utilities.md)**
|
|
1
|
+
# Module 09: Error Handling
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Category:** Error Management
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
The SDK provides comprehensive error handling with typed error classes, error codes, and recovery patterns for building resilient integrations.
|
|
9
|
+
|
|
10
|
+
## Table of Contents
|
|
11
|
+
|
|
12
|
+
- [IngestionError Class](#ingestionerror-class)
|
|
13
|
+
- [Error Codes](#error-codes)
|
|
14
|
+
- [Error Recovery Patterns](#error-recovery-patterns)
|
|
15
|
+
- [Retry with Exponential Backoff](#retry-with-exponential-backoff)
|
|
16
|
+
- [Error Code Handling](#error-code-handling)
|
|
17
|
+
- [Job Expiration Recovery](#job-expiration-recovery)
|
|
18
|
+
- [Rate Limit Handling](#rate-limit-handling)
|
|
19
|
+
- [Error Context](#error-context)
|
|
20
|
+
- [Best Practices](#best-practices)
|
|
21
|
+
- [See Also](#see-also)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## IngestionError Class
|
|
26
|
+
|
|
27
|
+
Custom error class for SDK operations with error codes and context.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
31
|
+
|
|
32
|
+
try {
|
|
33
|
+
await client.sendBatch(jobId, data);
|
|
34
|
+
} catch (error) {
|
|
35
|
+
if (error instanceof IngestionError) {
|
|
36
|
+
switch (error.code) {
|
|
37
|
+
case IngestionErrorCode.VALIDATION_ERROR:
|
|
38
|
+
console.error('Validation failed:', error.context);
|
|
39
|
+
break;
|
|
40
|
+
case IngestionErrorCode.JOB_EXPIRED:
|
|
41
|
+
// Create new job and retry
|
|
42
|
+
break;
|
|
43
|
+
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
44
|
+
// Implement backoff
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Properties:**
|
|
52
|
+
- `code: IngestionErrorCode` - Error code enum for classification
|
|
53
|
+
- `message: string` - Human-readable error message
|
|
54
|
+
- `context?: any` - Additional context data (validation errors, API responses, etc.)
|
|
55
|
+
- `cause?: Error` - Original error that caused this error (error chaining)
|
|
56
|
+
|
|
57
|
+
**Constructor:**
|
|
58
|
+
```typescript
|
|
59
|
+
new IngestionError(
|
|
60
|
+
message: string,
|
|
61
|
+
code: IngestionErrorCode,
|
|
62
|
+
context?: any,
|
|
63
|
+
cause?: Error
|
|
64
|
+
)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Example with Context:**
|
|
68
|
+
```typescript
|
|
69
|
+
try {
|
|
70
|
+
const result = await mapper.map(data);
|
|
71
|
+
if (!result.success) {
|
|
72
|
+
throw new IngestionError(
|
|
73
|
+
'Field mapping failed',
|
|
74
|
+
IngestionErrorCode.VALIDATION_ERROR,
|
|
75
|
+
{
|
|
76
|
+
errors: result.errors,
|
|
77
|
+
failedFields: result.errors.map(e => e.field)
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
} catch (error) {
|
|
82
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.VALIDATION_ERROR) {
|
|
83
|
+
console.error('Failed fields:', error.context.failedFields);
|
|
84
|
+
error.context.errors.forEach(err => {
|
|
85
|
+
console.error(`- ${err.field}: ${err.message}`);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Error Codes
|
|
92
|
+
|
|
93
|
+
The SDK uses typed error codes for consistent error classification:
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
enum IngestionErrorCode {
|
|
97
|
+
VALIDATION_ERROR = 'VALIDATION_ERROR',
|
|
98
|
+
AUTHENTICATION_ERROR = 'AUTHENTICATION_ERROR',
|
|
99
|
+
AUTHORIZATION_ERROR = 'AUTHORIZATION_ERROR',
|
|
100
|
+
RATE_LIMIT_ERROR = 'RATE_LIMIT_ERROR',
|
|
101
|
+
NETWORK_ERROR = 'NETWORK_ERROR',
|
|
102
|
+
JOB_EXPIRED = 'JOB_EXPIRED',
|
|
103
|
+
BATCH_FAILED = 'BATCH_FAILED',
|
|
104
|
+
PARSE_ERROR = 'PARSE_ERROR',
|
|
105
|
+
UNKNOWN_ERROR = 'UNKNOWN_ERROR'
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Error Code Usage:**
|
|
110
|
+
|
|
111
|
+
| Error Code | When It Occurs | Typical Recovery |
|
|
112
|
+
|------------|---------------|------------------|
|
|
113
|
+
| `VALIDATION_ERROR` | Invalid data, missing required fields | Fix data, review mapping config |
|
|
114
|
+
| `AUTHENTICATION_ERROR` | Invalid credentials, token expired | Refresh token, check credentials |
|
|
115
|
+
| `AUTHORIZATION_ERROR` | Insufficient permissions | Check user roles, API permissions |
|
|
116
|
+
| `RATE_LIMIT_ERROR` | API rate limits exceeded | Implement backoff, reduce request rate |
|
|
117
|
+
| `NETWORK_ERROR` | Network failure, timeout | Retry with backoff |
|
|
118
|
+
| `JOB_EXPIRED` | Batch job expired (24h limit) | Create new job, resend batches |
|
|
119
|
+
| `BATCH_FAILED` | Batch API rejected data | Review batch contents, check logs |
|
|
120
|
+
| `PARSE_ERROR` | File parsing failed | Validate file format, check schema |
|
|
121
|
+
| `UNKNOWN_ERROR` | Unexpected error | Log details, contact support |
|
|
122
|
+
|
|
123
|
+
## Error Recovery Patterns
|
|
124
|
+
|
|
125
|
+
### Retry with Exponential Backoff
|
|
126
|
+
|
|
127
|
+
Handle transient errors with automatic retry and exponential backoff:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
async function retryWithBackoff<T>(
|
|
131
|
+
fn: () => Promise<T>,
|
|
132
|
+
maxRetries = 3,
|
|
133
|
+
initialDelayMs = 1000
|
|
134
|
+
): Promise<T> {
|
|
135
|
+
let lastError: Error;
|
|
136
|
+
|
|
137
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
138
|
+
try {
|
|
139
|
+
return await fn();
|
|
140
|
+
} catch (error) {
|
|
141
|
+
lastError = error;
|
|
142
|
+
|
|
143
|
+
// Don't retry on validation errors or auth errors
|
|
144
|
+
if (error instanceof IngestionError) {
|
|
145
|
+
if (error.code === IngestionErrorCode.VALIDATION_ERROR ||
|
|
146
|
+
error.code === IngestionErrorCode.AUTHENTICATION_ERROR ||
|
|
147
|
+
error.code === IngestionErrorCode.AUTHORIZATION_ERROR) {
|
|
148
|
+
throw error; // Don't retry, fail fast
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Calculate exponential backoff delay
|
|
153
|
+
const delay = initialDelayMs * Math.pow(2, i);
|
|
154
|
+
console.log(`Retry ${i + 1}/${maxRetries} after ${delay}ms delay`);
|
|
155
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
throw lastError!;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Usage
|
|
163
|
+
const result = await retryWithBackoff(
|
|
164
|
+
() => client.sendBatch(jobId, data),
|
|
165
|
+
3, // max retries
|
|
166
|
+
1000 // initial delay 1s (then 2s, 4s)
|
|
167
|
+
);
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Error Code Handling
|
|
171
|
+
|
|
172
|
+
Handle different error types with specific recovery strategies:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
async function handleBatchOperation(
|
|
176
|
+
client: FluentClient,
|
|
177
|
+
jobId: string,
|
|
178
|
+
data: any[]
|
|
179
|
+
) {
|
|
180
|
+
try {
|
|
181
|
+
return await client.sendBatch(jobId, data);
|
|
182
|
+
} catch (error) {
|
|
183
|
+
if (!(error instanceof IngestionError)) {
|
|
184
|
+
throw error; // Re-throw non-SDK errors
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
switch (error.code) {
|
|
188
|
+
case IngestionErrorCode.VALIDATION_ERROR:
|
|
189
|
+
// Log validation errors and skip invalid records
|
|
190
|
+
console.error('Validation errors:', error.context);
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
errors: error.context.errors,
|
|
194
|
+
message: 'Some records failed validation'
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
case IngestionErrorCode.JOB_EXPIRED:
|
|
198
|
+
// Create new job and retry
|
|
199
|
+
console.warn('Job expired, creating new job');
|
|
200
|
+
const newJob = await client.createJob({
|
|
201
|
+
name: 'inventory-update-retry',
|
|
202
|
+
retailerId: client.config.retailerId
|
|
203
|
+
});
|
|
204
|
+
return await client.sendBatch(newJob.id, data);
|
|
205
|
+
|
|
206
|
+
case IngestionErrorCode.RATE_LIMIT_ERROR:
|
|
207
|
+
// Wait and retry with backoff
|
|
208
|
+
console.warn('Rate limited, waiting before retry');
|
|
209
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
210
|
+
return await client.sendBatch(jobId, data);
|
|
211
|
+
|
|
212
|
+
case IngestionErrorCode.NETWORK_ERROR:
|
|
213
|
+
// Retry network errors
|
|
214
|
+
console.warn('Network error, retrying');
|
|
215
|
+
return await retryWithBackoff(() => client.sendBatch(jobId, data));
|
|
216
|
+
|
|
217
|
+
case IngestionErrorCode.AUTHENTICATION_ERROR:
|
|
218
|
+
// Retry (token refresh is automatic in v0.1.27+)
|
|
219
|
+
console.warn('Auth error, retrying with automatic token refresh');
|
|
220
|
+
return await client.sendBatch(jobId, data);
|
|
221
|
+
|
|
222
|
+
default:
|
|
223
|
+
// Log and re-throw unknown errors
|
|
224
|
+
console.error('Unexpected error:', error);
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### Job Expiration Recovery
|
|
232
|
+
|
|
233
|
+
Handle batch job expiration (jobs expire after 24 hours):
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
237
|
+
|
|
238
|
+
async function sendBatchWithJobRecovery(
|
|
239
|
+
client: FluentClient,
|
|
240
|
+
jobId: string,
|
|
241
|
+
data: any[]
|
|
242
|
+
) {
|
|
243
|
+
try {
|
|
244
|
+
return await client.sendBatch(jobId, data);
|
|
245
|
+
} catch (error) {
|
|
246
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.JOB_EXPIRED) {
|
|
247
|
+
console.warn('Job expired, creating new job');
|
|
248
|
+
|
|
249
|
+
// Create new job
|
|
250
|
+
const newJob = await client.createJob({
|
|
251
|
+
name: `inventory-update-${Date.now()}`,
|
|
252
|
+
retailerId: client.config.retailerId
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
console.log('Created new job:', newJob.id);
|
|
256
|
+
|
|
257
|
+
// Retry with new job
|
|
258
|
+
return await client.sendBatch(newJob.id, data);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Rate Limit Handling
|
|
267
|
+
|
|
268
|
+
Handle API rate limits with adaptive backoff:
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
async function sendBatchWithRateLimitHandling(
|
|
272
|
+
client: FluentClient,
|
|
273
|
+
jobId: string,
|
|
274
|
+
data: any[],
|
|
275
|
+
maxRetries = 5
|
|
276
|
+
) {
|
|
277
|
+
let retryCount = 0;
|
|
278
|
+
|
|
279
|
+
while (retryCount < maxRetries) {
|
|
280
|
+
try {
|
|
281
|
+
return await client.sendBatch(jobId, data);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.RATE_LIMIT_ERROR) {
|
|
284
|
+
retryCount++;
|
|
285
|
+
|
|
286
|
+
// Exponential backoff with jitter
|
|
287
|
+
const baseDelay = 1000 * Math.pow(2, retryCount);
|
|
288
|
+
const jitter = Math.random() * 1000;
|
|
289
|
+
const delay = baseDelay + jitter;
|
|
290
|
+
|
|
291
|
+
console.warn(`Rate limited, retry ${retryCount}/${maxRetries} after ${delay}ms`);
|
|
292
|
+
|
|
293
|
+
if (retryCount >= maxRetries) {
|
|
294
|
+
throw new IngestionError(
|
|
295
|
+
`Max retries exceeded for rate limit`,
|
|
296
|
+
IngestionErrorCode.RATE_LIMIT_ERROR,
|
|
297
|
+
{ retryCount, maxRetries }
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
await new Promise(resolve => setTimeout(resolve, delay));
|
|
302
|
+
} else {
|
|
303
|
+
throw error;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Error Context
|
|
311
|
+
|
|
312
|
+
The `context` property provides detailed error information for debugging and recovery:
|
|
313
|
+
|
|
314
|
+
### Validation Error Context
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
try {
|
|
318
|
+
const result = await mapper.map(data);
|
|
319
|
+
} catch (error) {
|
|
320
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.VALIDATION_ERROR) {
|
|
321
|
+
// Context contains validation details
|
|
322
|
+
console.error('Validation errors:', error.context);
|
|
323
|
+
// {
|
|
324
|
+
// errors: [
|
|
325
|
+
// { field: 'productRef', message: 'Required field missing' },
|
|
326
|
+
// { field: 'qty', message: 'Must be a number' }
|
|
327
|
+
// ],
|
|
328
|
+
// record: { ... },
|
|
329
|
+
// index: 42
|
|
330
|
+
// }
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Network Error Context
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
try {
|
|
339
|
+
await client.graphql({ query, variables });
|
|
340
|
+
} catch (error) {
|
|
341
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.NETWORK_ERROR) {
|
|
342
|
+
// Context contains network details
|
|
343
|
+
console.error('Network error:', error.context);
|
|
344
|
+
// {
|
|
345
|
+
// url: 'https://api.fluentcommerce.com/graphql',
|
|
346
|
+
// method: 'POST',
|
|
347
|
+
// statusCode: 503,
|
|
348
|
+
// timeout: 30000
|
|
349
|
+
// }
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### Batch Error Context
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
try {
|
|
358
|
+
await client.sendBatch(jobId, data);
|
|
359
|
+
} catch (error) {
|
|
360
|
+
if (error instanceof IngestionError && error.code === IngestionErrorCode.BATCH_FAILED) {
|
|
361
|
+
// Context contains batch failure details
|
|
362
|
+
console.error('Batch failed:', error.context);
|
|
363
|
+
// {
|
|
364
|
+
// jobId: 'job-123',
|
|
365
|
+
// batchId: 'batch-456',
|
|
366
|
+
// failedRecords: 23,
|
|
367
|
+
// totalRecords: 100,
|
|
368
|
+
// errors: [...]
|
|
369
|
+
// }
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Best Practices
|
|
375
|
+
|
|
376
|
+
### 1. Always Use Type Guards
|
|
377
|
+
|
|
378
|
+
Check error types before accessing properties:
|
|
379
|
+
|
|
380
|
+
```typescript
|
|
381
|
+
// ✅ Correct
|
|
382
|
+
try {
|
|
383
|
+
await operation();
|
|
384
|
+
} catch (error) {
|
|
385
|
+
if (error instanceof IngestionError) {
|
|
386
|
+
console.error(`SDK Error [${error.code}]:`, error.message);
|
|
387
|
+
console.error('Context:', error.context);
|
|
388
|
+
} else {
|
|
389
|
+
console.error('Unknown error:', error);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// ❌ Wrong - assumes error type
|
|
394
|
+
try {
|
|
395
|
+
await operation();
|
|
396
|
+
} catch (error) {
|
|
397
|
+
console.error(error.code); // May be undefined
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### 2. Log Context for Debugging
|
|
402
|
+
|
|
403
|
+
Always log error context for troubleshooting:
|
|
404
|
+
|
|
405
|
+
```typescript
|
|
406
|
+
catch (error) {
|
|
407
|
+
if (error instanceof IngestionError) {
|
|
408
|
+
logger.error('Operation failed', {
|
|
409
|
+
code: error.code,
|
|
410
|
+
message: error.message,
|
|
411
|
+
context: error.context,
|
|
412
|
+
cause: error.cause
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
### 3. Fail Fast on Unrecoverable Errors
|
|
419
|
+
|
|
420
|
+
Don't retry validation or authentication errors:
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
const UNRECOVERABLE_ERRORS = [
|
|
424
|
+
IngestionErrorCode.VALIDATION_ERROR,
|
|
425
|
+
IngestionErrorCode.AUTHENTICATION_ERROR,
|
|
426
|
+
IngestionErrorCode.AUTHORIZATION_ERROR
|
|
427
|
+
];
|
|
428
|
+
|
|
429
|
+
async function retryableOperation() {
|
|
430
|
+
try {
|
|
431
|
+
return await operation();
|
|
432
|
+
} catch (error) {
|
|
433
|
+
if (error instanceof IngestionError &&
|
|
434
|
+
UNRECOVERABLE_ERRORS.includes(error.code)) {
|
|
435
|
+
throw error; // Fail immediately
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
// Retry for other errors
|
|
439
|
+
return await retryWithBackoff(() => operation());
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
### 4. Use Error Chaining
|
|
445
|
+
|
|
446
|
+
Preserve original errors with cause parameter:
|
|
447
|
+
|
|
448
|
+
```typescript
|
|
449
|
+
try {
|
|
450
|
+
const data = JSON.parse(content);
|
|
451
|
+
} catch (parseError) {
|
|
452
|
+
throw new IngestionError(
|
|
453
|
+
'Failed to parse JSON content',
|
|
454
|
+
IngestionErrorCode.PARSE_ERROR,
|
|
455
|
+
{ content: content.substring(0, 100) },
|
|
456
|
+
parseError // Preserve original error
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 5. Implement Circuit Breakers
|
|
462
|
+
|
|
463
|
+
Prevent cascading failures with circuit breaker pattern:
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
class CircuitBreaker {
|
|
467
|
+
private failures = 0;
|
|
468
|
+
private threshold = 5;
|
|
469
|
+
private timeout = 60000; // 1 minute
|
|
470
|
+
private isOpen = false;
|
|
471
|
+
private resetTimer?: NodeJS.Timeout;
|
|
472
|
+
|
|
473
|
+
async execute<T>(fn: () => Promise<T>): Promise<T> {
|
|
474
|
+
if (this.isOpen) {
|
|
475
|
+
throw new IngestionError(
|
|
476
|
+
'Circuit breaker is open',
|
|
477
|
+
IngestionErrorCode.NETWORK_ERROR,
|
|
478
|
+
{ failures: this.failures, threshold: this.threshold }
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
try {
|
|
483
|
+
const result = await fn();
|
|
484
|
+
this.onSuccess();
|
|
485
|
+
return result;
|
|
486
|
+
} catch (error) {
|
|
487
|
+
this.onFailure();
|
|
488
|
+
throw error;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
private onSuccess() {
|
|
493
|
+
this.failures = 0;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
private onFailure() {
|
|
497
|
+
this.failures++;
|
|
498
|
+
if (this.failures >= this.threshold) {
|
|
499
|
+
this.isOpen = true;
|
|
500
|
+
this.resetTimer = setTimeout(() => {
|
|
501
|
+
this.isOpen = false;
|
|
502
|
+
this.failures = 0;
|
|
503
|
+
}, this.timeout);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Usage
|
|
509
|
+
const breaker = new CircuitBreaker();
|
|
510
|
+
|
|
511
|
+
try {
|
|
512
|
+
const result = await breaker.execute(() => client.sendBatch(jobId, data));
|
|
513
|
+
} catch (error) {
|
|
514
|
+
console.error('Operation failed:', error);
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
## See Also
|
|
519
|
+
|
|
520
|
+
- [Module 01: Client - Batch API](./api-reference-01-client-api.md#job-batch-operations) - Batch operation error handling
|
|
521
|
+
- [Module 08: Types](./api-reference-08-types.md) - IngestionErrorCode enum
|
|
522
|
+
- [Getting Started Guide](../../../00-START-HERE/getting-started.md) - Error handling basics
|
|
523
|
+
- [Troubleshooting Guide](../../../00-START-HERE/troubleshooting-quick-reference.md) - Common errors and solutions
|
|
524
|
+
|
|
525
|
+
---
|
|
526
|
+
|
|
527
|
+
**[← Previous: Module 08 - Types](./api-reference-08-types.md)** | **[API Reference Home](../api-reference-readme.md)** | **[Next: Module 10 - Utilities →](./api-reference-10-utilities.md)**
|