@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,511 +1,511 @@
|
|
|
1
|
-
# Pattern: Error Handling & Retry Strategies
|
|
2
|
-
|
|
3
|
-
**FC Connect SDK Use Case Guide**
|
|
4
|
-
|
|
5
|
-
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
-
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
**Context**: Focused guide on error handling, retry logic, and graceful degradation
|
|
9
|
-
|
|
10
|
-
**Type**: Reusable Pattern
|
|
11
|
-
|
|
12
|
-
**Complexity**: Low-Medium
|
|
13
|
-
|
|
14
|
-
**Lines**: ~140 lines
|
|
15
|
-
|
|
16
|
-
## When to Use This Pattern
|
|
17
|
-
|
|
18
|
-
- Network failures and timeouts
|
|
19
|
-
- API rate limiting
|
|
20
|
-
- Transient errors
|
|
21
|
-
- Batch processing errors
|
|
22
|
-
- File processing failures
|
|
23
|
-
- State management conflicts
|
|
24
|
-
|
|
25
|
-
## SDK Error Classes
|
|
26
|
-
|
|
27
|
-
The FC Connect SDK provides typed error classes for robust error handling:
|
|
28
|
-
|
|
29
|
-
```typescript
|
|
30
|
-
import {
|
|
31
|
-
IngestionError, // Base class with error codes
|
|
32
|
-
IngestionErrorCode, // Machine-readable error codes
|
|
33
|
-
ConfigurationError, // Config validation errors
|
|
34
|
-
FileParsingError, // XML/CSV/Parquet parsing errors
|
|
35
|
-
ValidationError, // Data validation errors
|
|
36
|
-
AggregateIngestionError, // Multiple failures aggregated
|
|
37
|
-
IngestionErrorFactory, // Create structured errors
|
|
38
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Common Error Handling Patterns
|
|
42
|
-
|
|
43
|
-
### 1. Basic Try-Catch with Logging
|
|
44
|
-
|
|
45
|
-
```typescript
|
|
46
|
-
// FC Connect SDK (latest)
|
|
47
|
-
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
48
|
-
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
49
|
-
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
50
|
-
|
|
51
|
-
import {
|
|
52
|
-
IngestionError,
|
|
53
|
-
createConsoleLogger,
|
|
54
|
-
toStructuredLogger
|
|
55
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
56
|
-
|
|
57
|
-
const logger = createConsoleLogger();
|
|
58
|
-
|
|
59
|
-
async function processFile(fileName: string) {
|
|
60
|
-
try {
|
|
61
|
-
const data = await readFile(fileName);
|
|
62
|
-
const result = await sendBatch(data);
|
|
63
|
-
logger.info('File processed successfully', { fileName, recordCount: result.count });
|
|
64
|
-
return result;
|
|
65
|
-
} catch (error) {
|
|
66
|
-
if (error instanceof IngestionError) {
|
|
67
|
-
// Structured error with error code and context
|
|
68
|
-
logger.error('Processing failed', error.toJSON());
|
|
69
|
-
// Re-throw to prevent silent failures
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Unexpected error - wrap and re-throw
|
|
74
|
-
logger.error('Unexpected error', { message: error.message, stack: error.stack });
|
|
75
|
-
throw IngestionErrorFactory.fromError(error);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 2. GraphQL Error Classification & Retry
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
import {
|
|
84
|
-
createClient,
|
|
85
|
-
GraphQLMutationMapper,
|
|
86
|
-
classifyErrors,
|
|
87
|
-
type GraphQLError
|
|
88
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
89
|
-
|
|
90
|
-
async function executeMutationWithRetry(
|
|
91
|
-
client: FluentClient,
|
|
92
|
-
mapper: GraphQLMutationMapper,
|
|
93
|
-
sourceData: any,
|
|
94
|
-
maxRetries = 3
|
|
95
|
-
) {
|
|
96
|
-
// Map source data to GraphQL mutation
|
|
97
|
-
const mappingResult = await mapper.mapSafe(sourceData);
|
|
98
|
-
|
|
99
|
-
if (!mappingResult.success) {
|
|
100
|
-
throw new Error(`Mapping failed: ${mappingResult.errors?.join(', ')}`);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Execute mutation with retry logic
|
|
104
|
-
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
105
|
-
const result = await client.graphql({
|
|
106
|
-
query: mappingResult.query,
|
|
107
|
-
variables: mappingResult.variables,
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
if (!result.errors) {
|
|
111
|
-
return result; // Success
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Classify GraphQL errors
|
|
115
|
-
const classification = classifyErrors(result.errors);
|
|
116
|
-
|
|
117
|
-
logger.info(`GraphQL error (attempt ${attempt}/${maxRetries}):`, {
|
|
118
|
-
errorCode: classification.errorCode,
|
|
119
|
-
retryable: classification.retryable,
|
|
120
|
-
action: classification.action,
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
// Don't retry non-retryable errors
|
|
124
|
-
if (!classification.retryable) {
|
|
125
|
-
throw new Error(classification.userMessage);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Wait before retry (use recommended delay or exponential backoff)
|
|
129
|
-
if (attempt < maxRetries) {
|
|
130
|
-
const delay = classification.retryDelaySeconds || Math.pow(2, attempt) * 1000;
|
|
131
|
-
logger.info(`Retrying after ${delay}ms...`);
|
|
132
|
-
await new Promise(resolve => setTimeout(resolve, delay * 1000));
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
throw new Error('All retry attempts failed');
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### 3. Exponential Backoff Retry
|
|
141
|
-
|
|
142
|
-
```typescript
|
|
143
|
-
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
144
|
-
|
|
145
|
-
async function retryWithBackoff<T>(
|
|
146
|
-
operation: () => Promise<T>,
|
|
147
|
-
maxRetries: number = 3,
|
|
148
|
-
initialDelay: number = 1000
|
|
149
|
-
): Promise<T> {
|
|
150
|
-
let lastError: Error;
|
|
151
|
-
|
|
152
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
153
|
-
try {
|
|
154
|
-
return await operation();
|
|
155
|
-
} catch (error) {
|
|
156
|
-
lastError = error;
|
|
157
|
-
|
|
158
|
-
// Only retry if error is retryable
|
|
159
|
-
if (error instanceof IngestionError && !error.isRetryable()) {
|
|
160
|
-
console.error('Non-retryable error, stopping:', error.code);
|
|
161
|
-
throw error;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Last attempt - throw error
|
|
165
|
-
if (attempt === maxRetries - 1) {
|
|
166
|
-
throw lastError;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// Calculate exponential backoff with jitter
|
|
170
|
-
const delay = initialDelay * Math.pow(2, attempt);
|
|
171
|
-
const jitter = Math.random() * 100;
|
|
172
|
-
console.log(`Retry ${attempt + 1}/${maxRetries} after ${delay + jitter}ms`);
|
|
173
|
-
await new Promise(resolve => setTimeout(resolve, delay + jitter));
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
throw lastError!;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Usage
|
|
181
|
-
const result = await retryWithBackoff(
|
|
182
|
-
() => client.sendBatch(jobId, batch),
|
|
183
|
-
3, // max retries
|
|
184
|
-
2000 // initial delay (2 seconds)
|
|
185
|
-
);
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### 3. Circuit Breaker Pattern
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
class CircuitBreaker {
|
|
192
|
-
private failureCount = 0;
|
|
193
|
-
private lastFailureTime?: Date;
|
|
194
|
-
private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
|
|
195
|
-
|
|
196
|
-
constructor(
|
|
197
|
-
private threshold: number = 5,
|
|
198
|
-
private timeout: number = 60000 // 60 seconds
|
|
199
|
-
) {}
|
|
200
|
-
|
|
201
|
-
async execute<T>(operation: () => Promise<T>): Promise<T> {
|
|
202
|
-
// Check if circuit is open
|
|
203
|
-
if (this.state === 'OPEN') {
|
|
204
|
-
const timeSinceFailure = Date.now() - this.lastFailureTime!.getTime();
|
|
205
|
-
if (timeSinceFailure < this.timeout) {
|
|
206
|
-
throw new Error('Circuit breaker is OPEN - operation rejected');
|
|
207
|
-
}
|
|
208
|
-
// Timeout elapsed - try half-open
|
|
209
|
-
this.state = 'HALF_OPEN';
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
try {
|
|
213
|
-
const result = await operation();
|
|
214
|
-
// Success - reset circuit
|
|
215
|
-
this.failureCount = 0;
|
|
216
|
-
this.state = 'CLOSED';
|
|
217
|
-
return result;
|
|
218
|
-
} catch (error) {
|
|
219
|
-
this.failureCount++;
|
|
220
|
-
this.lastFailureTime = new Date();
|
|
221
|
-
|
|
222
|
-
// Open circuit if threshold exceeded
|
|
223
|
-
if (this.failureCount >= this.threshold) {
|
|
224
|
-
this.state = 'OPEN';
|
|
225
|
-
console.warn(`Circuit breaker opened after ${this.failureCount} failures`);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
throw error;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Usage
|
|
234
|
-
const breaker = new CircuitBreaker(5, 60000);
|
|
235
|
-
|
|
236
|
-
async function callAPI() {
|
|
237
|
-
return breaker.execute(() => client.sendBatch(jobId, batch));
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### 4. Batch Error Isolation
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
import { AggregateIngestionError, IngestionError } from '@fluentcommerce/fc-connect-sdk';
|
|
245
|
-
|
|
246
|
-
async function processBatchWithIsolation(records: any[]) {
|
|
247
|
-
const errors: IngestionError[] = [];
|
|
248
|
-
const successes: any[] = [];
|
|
249
|
-
|
|
250
|
-
for (const [index, record] of records.entries()) {
|
|
251
|
-
try {
|
|
252
|
-
const result = await processRecord(record);
|
|
253
|
-
successes.push(result);
|
|
254
|
-
} catch (error) {
|
|
255
|
-
// Isolate error to single record
|
|
256
|
-
const ingestionError =
|
|
257
|
-
error instanceof IngestionError
|
|
258
|
-
? error
|
|
259
|
-
: IngestionErrorFactory.fromError(error, IngestionErrorCode.TRANSFORMATION_ERROR, {
|
|
260
|
-
recordIndex: index,
|
|
261
|
-
record,
|
|
262
|
-
});
|
|
263
|
-
|
|
264
|
-
errors.push(ingestionError);
|
|
265
|
-
logger.warn(`Record ${index} failed, continuing with remaining records`, {
|
|
266
|
-
recordIndex: index,
|
|
267
|
-
error: ingestionError.toJSON(),
|
|
268
|
-
});
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// Log summary
|
|
273
|
-
logger.info('Batch processing complete', {
|
|
274
|
-
total: records.length,
|
|
275
|
-
successes: successes.length,
|
|
276
|
-
failures: errors.length,
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Throw aggregate if any failures
|
|
280
|
-
if (errors.length > 0) {
|
|
281
|
-
throw new AggregateIngestionError(
|
|
282
|
-
`${errors.length} of ${records.length} records failed`,
|
|
283
|
-
errors
|
|
284
|
-
);
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
return successes;
|
|
288
|
-
}
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
### 5. Graceful Degradation
|
|
292
|
-
|
|
293
|
-
```typescript
|
|
294
|
-
async function fetchWithFallback(primarySource: string, fallbackSource: string) {
|
|
295
|
-
try {
|
|
296
|
-
// Try primary source
|
|
297
|
-
return await fetch(primarySource);
|
|
298
|
-
} catch (primaryError) {
|
|
299
|
-
logger.warn('Primary source failed, trying fallback', {
|
|
300
|
-
primarySource,
|
|
301
|
-
error: primaryError.message,
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
try {
|
|
305
|
-
// Fallback to secondary source
|
|
306
|
-
return await fetch(fallbackSource);
|
|
307
|
-
} catch (fallbackError) {
|
|
308
|
-
logger.error('Both primary and fallback sources failed', {
|
|
309
|
-
primaryError: primaryError.message,
|
|
310
|
-
fallbackError: fallbackError.message,
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
// Return cached data or empty result as last resort
|
|
314
|
-
return getCachedData() || { data: [], cached: true };
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
### 6. Error Monitoring and Alerting
|
|
321
|
-
|
|
322
|
-
```typescript
|
|
323
|
-
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
324
|
-
|
|
325
|
-
class ErrorMonitor {
|
|
326
|
-
private errorCounts = new Map<string, number>();
|
|
327
|
-
private errorWindow = new Map<string, Date[]>();
|
|
328
|
-
private readonly windowSize = 5 * 60 * 1000; // 5 minutes
|
|
329
|
-
|
|
330
|
-
recordError(error: Error): void {
|
|
331
|
-
const errorType = error instanceof IngestionError ? error.code : 'UNKNOWN';
|
|
332
|
-
|
|
333
|
-
// Increment counter
|
|
334
|
-
const count = (this.errorCounts.get(errorType) || 0) + 1;
|
|
335
|
-
this.errorCounts.set(errorType, count);
|
|
336
|
-
|
|
337
|
-
// Track in time window
|
|
338
|
-
const timestamps = this.errorWindow.get(errorType) || [];
|
|
339
|
-
timestamps.push(new Date());
|
|
340
|
-
this.errorWindow.set(errorType, timestamps);
|
|
341
|
-
|
|
342
|
-
// Clean old entries
|
|
343
|
-
this.cleanupWindow(errorType);
|
|
344
|
-
|
|
345
|
-
// Check for high error rate
|
|
346
|
-
const recentErrors = this.errorWindow.get(errorType)!.length;
|
|
347
|
-
if (recentErrors > 10) {
|
|
348
|
-
this.alertHighErrorRate(errorType, recentErrors);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
private cleanupWindow(errorType: string): void {
|
|
353
|
-
const timestamps = this.errorWindow.get(errorType) || [];
|
|
354
|
-
const cutoff = Date.now() - this.windowSize;
|
|
355
|
-
const recent = timestamps.filter(t => t.getTime() > cutoff);
|
|
356
|
-
this.errorWindow.set(errorType, recent);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
private alertHighErrorRate(errorType: string, count: number): void {
|
|
360
|
-
console.error(`ALERT: High error rate detected - ${errorType}: ${count} errors in 5 minutes`);
|
|
361
|
-
// Send to monitoring system (DataDog, CloudWatch, etc.)
|
|
362
|
-
// sendAlert({ type: errorType, count, window: '5m' });
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
getMetrics() {
|
|
366
|
-
return {
|
|
367
|
-
totalErrors: Object.fromEntries(this.errorCounts),
|
|
368
|
-
recentErrors: Object.fromEntries(
|
|
369
|
-
Array.from(this.errorWindow.entries()).map(([type, timestamps]) => [
|
|
370
|
-
type,
|
|
371
|
-
timestamps.length,
|
|
372
|
-
])
|
|
373
|
-
),
|
|
374
|
-
timestamp: new Date().toISOString(),
|
|
375
|
-
};
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
// Usage
|
|
380
|
-
const monitor = new ErrorMonitor();
|
|
381
|
-
|
|
382
|
-
try {
|
|
383
|
-
await processFile(fileName);
|
|
384
|
-
} catch (error) {
|
|
385
|
-
monitor.recordError(error);
|
|
386
|
-
throw error;
|
|
387
|
-
}
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
## Best Practices
|
|
391
|
-
|
|
392
|
-
### Do's
|
|
393
|
-
|
|
394
|
-
1. **Always Check Error Type**
|
|
395
|
-
|
|
396
|
-
```typescript
|
|
397
|
-
if (error instanceof IngestionError && error.isRetryable()) {
|
|
398
|
-
return scheduleRetry();
|
|
399
|
-
}
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
2. **Use Structured Logging**
|
|
403
|
-
|
|
404
|
-
```typescript
|
|
405
|
-
logger.error('Operation failed', error.toJSON());
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
3. **Add Context to Errors**
|
|
409
|
-
|
|
410
|
-
```typescript
|
|
411
|
-
throw new TransformationError('Failed to parse quantity', recordIndex, 'quantity', {
|
|
412
|
-
record,
|
|
413
|
-
originalValue,
|
|
414
|
-
});
|
|
415
|
-
```
|
|
416
|
-
|
|
417
|
-
4. **Re-throw After Handling**
|
|
418
|
-
|
|
419
|
-
```typescript
|
|
420
|
-
try {
|
|
421
|
-
await operation();
|
|
422
|
-
} catch (error) {
|
|
423
|
-
logger.error('Failed', error);
|
|
424
|
-
throw error; // Don't swallow errors
|
|
425
|
-
}
|
|
426
|
-
```
|
|
427
|
-
|
|
428
|
-
5. **Distinguish Retryable Errors**
|
|
429
|
-
```typescript
|
|
430
|
-
// Retryable: NETWORK_ERROR, TIMEOUT_ERROR, RATE_LIMIT_ERROR
|
|
431
|
-
// Non-retryable: PARSE_ERROR, VALIDATION_ERROR, CONFIGURATION_ERROR
|
|
432
|
-
```
|
|
433
|
-
|
|
434
|
-
### Don'ts
|
|
435
|
-
|
|
436
|
-
1. **Don't Swallow Errors**
|
|
437
|
-
|
|
438
|
-
```typescript
|
|
439
|
-
// ❌ WRONG
|
|
440
|
-
try {
|
|
441
|
-
await operation();
|
|
442
|
-
} catch {}
|
|
443
|
-
|
|
444
|
-
// ✅ CORRECT
|
|
445
|
-
try {
|
|
446
|
-
await operation();
|
|
447
|
-
} catch (error) {
|
|
448
|
-
logger.error('Failed', error);
|
|
449
|
-
throw error;
|
|
450
|
-
}
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
2. **Don't Retry Non-Retryable Errors**
|
|
454
|
-
|
|
455
|
-
```typescript
|
|
456
|
-
// ❌ WRONG - Retrying parse errors wastes resources
|
|
457
|
-
await retry(() => parseXML(invalidXML));
|
|
458
|
-
|
|
459
|
-
// ✅ CORRECT - Check if retryable first
|
|
460
|
-
if (error.isRetryable()) await retry(operation);
|
|
461
|
-
```
|
|
462
|
-
|
|
463
|
-
3. **Don't Use Generic Error Messages**
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
// ❌ WRONG
|
|
467
|
-
throw new Error('Failed');
|
|
468
|
-
|
|
469
|
-
// ✅ CORRECT
|
|
470
|
-
throw new FileParsingError('Invalid CSV: missing header row', fileName, 1);
|
|
471
|
-
```
|
|
472
|
-
|
|
473
|
-
4. **Don't Ignore Error Context**
|
|
474
|
-
|
|
475
|
-
```typescript
|
|
476
|
-
// ❌ WRONG
|
|
477
|
-
console.log(error.message);
|
|
478
|
-
|
|
479
|
-
// ✅ CORRECT
|
|
480
|
-
console.log(error.toJSON()); // Includes code, context, timestamp, etc.
|
|
481
|
-
```
|
|
482
|
-
|
|
483
|
-
## Retryable vs Non-Retryable Errors
|
|
484
|
-
|
|
485
|
-
```typescript
|
|
486
|
-
// RETRYABLE - Transient failures
|
|
487
|
-
IngestionErrorCode.NETWORK_ERROR;
|
|
488
|
-
IngestionErrorCode.TIMEOUT_ERROR;
|
|
489
|
-
IngestionErrorCode.RATE_LIMIT_ERROR;
|
|
490
|
-
IngestionErrorCode.LOCK_ACQUISITION_FAILED;
|
|
491
|
-
|
|
492
|
-
// NON-RETRYABLE - Permanent failures
|
|
493
|
-
IngestionErrorCode.PARSE_ERROR;
|
|
494
|
-
IngestionErrorCode.VALIDATION_ERROR;
|
|
495
|
-
IngestionErrorCode.REQUIRED_FIELD_MISSING;
|
|
496
|
-
IngestionErrorCode.CONFIGURATION_ERROR;
|
|
497
|
-
IngestionErrorCode.FIELD_MAPPING_ERROR;
|
|
498
|
-
IngestionErrorCode.INVALID_FILE_FORMAT;
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
## Related Patterns
|
|
502
|
-
|
|
503
|
-
- [Batch Processing Pattern](../../03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md) - Handling batch-level errors
|
|
504
|
-
- [State Management Pattern](../../02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md) - State-related error handling
|
|
505
|
-
- [Configuration Pattern](../../04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md) - Config validation errors
|
|
506
|
-
|
|
507
|
-
## Related Documentation
|
|
508
|
-
|
|
509
|
-
- [Complete Error Handling Guide](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
510
|
-
- [GraphQL Mapping Error Handling](../../02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md)
|
|
511
|
-
- [API Reference - Error Classes](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
1
|
+
# Pattern: Error Handling & Retry Strategies
|
|
2
|
+
|
|
3
|
+
**FC Connect SDK Use Case Guide**
|
|
4
|
+
|
|
5
|
+
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
+
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
**Context**: Focused guide on error handling, retry logic, and graceful degradation
|
|
9
|
+
|
|
10
|
+
**Type**: Reusable Pattern
|
|
11
|
+
|
|
12
|
+
**Complexity**: Low-Medium
|
|
13
|
+
|
|
14
|
+
**Lines**: ~140 lines
|
|
15
|
+
|
|
16
|
+
## When to Use This Pattern
|
|
17
|
+
|
|
18
|
+
- Network failures and timeouts
|
|
19
|
+
- API rate limiting
|
|
20
|
+
- Transient errors
|
|
21
|
+
- Batch processing errors
|
|
22
|
+
- File processing failures
|
|
23
|
+
- State management conflicts
|
|
24
|
+
|
|
25
|
+
## SDK Error Classes
|
|
26
|
+
|
|
27
|
+
The FC Connect SDK provides typed error classes for robust error handling:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import {
|
|
31
|
+
IngestionError, // Base class with error codes
|
|
32
|
+
IngestionErrorCode, // Machine-readable error codes
|
|
33
|
+
ConfigurationError, // Config validation errors
|
|
34
|
+
FileParsingError, // XML/CSV/Parquet parsing errors
|
|
35
|
+
ValidationError, // Data validation errors
|
|
36
|
+
AggregateIngestionError, // Multiple failures aggregated
|
|
37
|
+
IngestionErrorFactory, // Create structured errors
|
|
38
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Common Error Handling Patterns
|
|
42
|
+
|
|
43
|
+
### 1. Basic Try-Catch with Logging
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
// FC Connect SDK (latest)
|
|
47
|
+
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
48
|
+
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
49
|
+
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
50
|
+
|
|
51
|
+
import {
|
|
52
|
+
IngestionError,
|
|
53
|
+
createConsoleLogger,
|
|
54
|
+
toStructuredLogger
|
|
55
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
56
|
+
|
|
57
|
+
const logger = createConsoleLogger();
|
|
58
|
+
|
|
59
|
+
async function processFile(fileName: string) {
|
|
60
|
+
try {
|
|
61
|
+
const data = await readFile(fileName);
|
|
62
|
+
const result = await sendBatch(data);
|
|
63
|
+
logger.info('File processed successfully', { fileName, recordCount: result.count });
|
|
64
|
+
return result;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (error instanceof IngestionError) {
|
|
67
|
+
// Structured error with error code and context
|
|
68
|
+
logger.error('Processing failed', error.toJSON());
|
|
69
|
+
// Re-throw to prevent silent failures
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Unexpected error - wrap and re-throw
|
|
74
|
+
logger.error('Unexpected error', { message: error.message, stack: error.stack });
|
|
75
|
+
throw IngestionErrorFactory.fromError(error);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 2. GraphQL Error Classification & Retry
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import {
|
|
84
|
+
createClient,
|
|
85
|
+
GraphQLMutationMapper,
|
|
86
|
+
classifyErrors,
|
|
87
|
+
type GraphQLError
|
|
88
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
89
|
+
|
|
90
|
+
async function executeMutationWithRetry(
|
|
91
|
+
client: FluentClient,
|
|
92
|
+
mapper: GraphQLMutationMapper,
|
|
93
|
+
sourceData: any,
|
|
94
|
+
maxRetries = 3
|
|
95
|
+
) {
|
|
96
|
+
// Map source data to GraphQL mutation
|
|
97
|
+
const mappingResult = await mapper.mapSafe(sourceData);
|
|
98
|
+
|
|
99
|
+
if (!mappingResult.success) {
|
|
100
|
+
throw new Error(`Mapping failed: ${mappingResult.errors?.join(', ')}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Execute mutation with retry logic
|
|
104
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
105
|
+
const result = await client.graphql({
|
|
106
|
+
query: mappingResult.query,
|
|
107
|
+
variables: mappingResult.variables,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
if (!result.errors) {
|
|
111
|
+
return result; // Success
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Classify GraphQL errors
|
|
115
|
+
const classification = classifyErrors(result.errors);
|
|
116
|
+
|
|
117
|
+
logger.info(`GraphQL error (attempt ${attempt}/${maxRetries}):`, {
|
|
118
|
+
errorCode: classification.errorCode,
|
|
119
|
+
retryable: classification.retryable,
|
|
120
|
+
action: classification.action,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// Don't retry non-retryable errors
|
|
124
|
+
if (!classification.retryable) {
|
|
125
|
+
throw new Error(classification.userMessage);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Wait before retry (use recommended delay or exponential backoff)
|
|
129
|
+
if (attempt < maxRetries) {
|
|
130
|
+
const delay = classification.retryDelaySeconds || Math.pow(2, attempt) * 1000;
|
|
131
|
+
logger.info(`Retrying after ${delay}ms...`);
|
|
132
|
+
await new Promise(resolve => setTimeout(resolve, delay * 1000));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
throw new Error('All retry attempts failed');
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 3. Exponential Backoff Retry
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
144
|
+
|
|
145
|
+
async function retryWithBackoff<T>(
|
|
146
|
+
operation: () => Promise<T>,
|
|
147
|
+
maxRetries: number = 3,
|
|
148
|
+
initialDelay: number = 1000
|
|
149
|
+
): Promise<T> {
|
|
150
|
+
let lastError: Error;
|
|
151
|
+
|
|
152
|
+
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
153
|
+
try {
|
|
154
|
+
return await operation();
|
|
155
|
+
} catch (error) {
|
|
156
|
+
lastError = error;
|
|
157
|
+
|
|
158
|
+
// Only retry if error is retryable
|
|
159
|
+
if (error instanceof IngestionError && !error.isRetryable()) {
|
|
160
|
+
console.error('Non-retryable error, stopping:', error.code);
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Last attempt - throw error
|
|
165
|
+
if (attempt === maxRetries - 1) {
|
|
166
|
+
throw lastError;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Calculate exponential backoff with jitter
|
|
170
|
+
const delay = initialDelay * Math.pow(2, attempt);
|
|
171
|
+
const jitter = Math.random() * 100;
|
|
172
|
+
console.log(`Retry ${attempt + 1}/${maxRetries} after ${delay + jitter}ms`);
|
|
173
|
+
await new Promise(resolve => setTimeout(resolve, delay + jitter));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
throw lastError!;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Usage
|
|
181
|
+
const result = await retryWithBackoff(
|
|
182
|
+
() => client.sendBatch(jobId, batch),
|
|
183
|
+
3, // max retries
|
|
184
|
+
2000 // initial delay (2 seconds)
|
|
185
|
+
);
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 3. Circuit Breaker Pattern
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
class CircuitBreaker {
|
|
192
|
+
private failureCount = 0;
|
|
193
|
+
private lastFailureTime?: Date;
|
|
194
|
+
private state: 'CLOSED' | 'OPEN' | 'HALF_OPEN' = 'CLOSED';
|
|
195
|
+
|
|
196
|
+
constructor(
|
|
197
|
+
private threshold: number = 5,
|
|
198
|
+
private timeout: number = 60000 // 60 seconds
|
|
199
|
+
) {}
|
|
200
|
+
|
|
201
|
+
async execute<T>(operation: () => Promise<T>): Promise<T> {
|
|
202
|
+
// Check if circuit is open
|
|
203
|
+
if (this.state === 'OPEN') {
|
|
204
|
+
const timeSinceFailure = Date.now() - this.lastFailureTime!.getTime();
|
|
205
|
+
if (timeSinceFailure < this.timeout) {
|
|
206
|
+
throw new Error('Circuit breaker is OPEN - operation rejected');
|
|
207
|
+
}
|
|
208
|
+
// Timeout elapsed - try half-open
|
|
209
|
+
this.state = 'HALF_OPEN';
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
try {
|
|
213
|
+
const result = await operation();
|
|
214
|
+
// Success - reset circuit
|
|
215
|
+
this.failureCount = 0;
|
|
216
|
+
this.state = 'CLOSED';
|
|
217
|
+
return result;
|
|
218
|
+
} catch (error) {
|
|
219
|
+
this.failureCount++;
|
|
220
|
+
this.lastFailureTime = new Date();
|
|
221
|
+
|
|
222
|
+
// Open circuit if threshold exceeded
|
|
223
|
+
if (this.failureCount >= this.threshold) {
|
|
224
|
+
this.state = 'OPEN';
|
|
225
|
+
console.warn(`Circuit breaker opened after ${this.failureCount} failures`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
throw error;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Usage
|
|
234
|
+
const breaker = new CircuitBreaker(5, 60000);
|
|
235
|
+
|
|
236
|
+
async function callAPI() {
|
|
237
|
+
return breaker.execute(() => client.sendBatch(jobId, batch));
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### 4. Batch Error Isolation
|
|
242
|
+
|
|
243
|
+
```typescript
|
|
244
|
+
import { AggregateIngestionError, IngestionError } from '@fluentcommerce/fc-connect-sdk';
|
|
245
|
+
|
|
246
|
+
async function processBatchWithIsolation(records: any[]) {
|
|
247
|
+
const errors: IngestionError[] = [];
|
|
248
|
+
const successes: any[] = [];
|
|
249
|
+
|
|
250
|
+
for (const [index, record] of records.entries()) {
|
|
251
|
+
try {
|
|
252
|
+
const result = await processRecord(record);
|
|
253
|
+
successes.push(result);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
// Isolate error to single record
|
|
256
|
+
const ingestionError =
|
|
257
|
+
error instanceof IngestionError
|
|
258
|
+
? error
|
|
259
|
+
: IngestionErrorFactory.fromError(error, IngestionErrorCode.TRANSFORMATION_ERROR, {
|
|
260
|
+
recordIndex: index,
|
|
261
|
+
record,
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
errors.push(ingestionError);
|
|
265
|
+
logger.warn(`Record ${index} failed, continuing with remaining records`, {
|
|
266
|
+
recordIndex: index,
|
|
267
|
+
error: ingestionError.toJSON(),
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Log summary
|
|
273
|
+
logger.info('Batch processing complete', {
|
|
274
|
+
total: records.length,
|
|
275
|
+
successes: successes.length,
|
|
276
|
+
failures: errors.length,
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Throw aggregate if any failures
|
|
280
|
+
if (errors.length > 0) {
|
|
281
|
+
throw new AggregateIngestionError(
|
|
282
|
+
`${errors.length} of ${records.length} records failed`,
|
|
283
|
+
errors
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return successes;
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 5. Graceful Degradation
|
|
292
|
+
|
|
293
|
+
```typescript
|
|
294
|
+
async function fetchWithFallback(primarySource: string, fallbackSource: string) {
|
|
295
|
+
try {
|
|
296
|
+
// Try primary source
|
|
297
|
+
return await fetch(primarySource);
|
|
298
|
+
} catch (primaryError) {
|
|
299
|
+
logger.warn('Primary source failed, trying fallback', {
|
|
300
|
+
primarySource,
|
|
301
|
+
error: primaryError.message,
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
try {
|
|
305
|
+
// Fallback to secondary source
|
|
306
|
+
return await fetch(fallbackSource);
|
|
307
|
+
} catch (fallbackError) {
|
|
308
|
+
logger.error('Both primary and fallback sources failed', {
|
|
309
|
+
primaryError: primaryError.message,
|
|
310
|
+
fallbackError: fallbackError.message,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Return cached data or empty result as last resort
|
|
314
|
+
return getCachedData() || { data: [], cached: true };
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### 6. Error Monitoring and Alerting
|
|
321
|
+
|
|
322
|
+
```typescript
|
|
323
|
+
import { IngestionError, IngestionErrorCode } from '@fluentcommerce/fc-connect-sdk';
|
|
324
|
+
|
|
325
|
+
class ErrorMonitor {
|
|
326
|
+
private errorCounts = new Map<string, number>();
|
|
327
|
+
private errorWindow = new Map<string, Date[]>();
|
|
328
|
+
private readonly windowSize = 5 * 60 * 1000; // 5 minutes
|
|
329
|
+
|
|
330
|
+
recordError(error: Error): void {
|
|
331
|
+
const errorType = error instanceof IngestionError ? error.code : 'UNKNOWN';
|
|
332
|
+
|
|
333
|
+
// Increment counter
|
|
334
|
+
const count = (this.errorCounts.get(errorType) || 0) + 1;
|
|
335
|
+
this.errorCounts.set(errorType, count);
|
|
336
|
+
|
|
337
|
+
// Track in time window
|
|
338
|
+
const timestamps = this.errorWindow.get(errorType) || [];
|
|
339
|
+
timestamps.push(new Date());
|
|
340
|
+
this.errorWindow.set(errorType, timestamps);
|
|
341
|
+
|
|
342
|
+
// Clean old entries
|
|
343
|
+
this.cleanupWindow(errorType);
|
|
344
|
+
|
|
345
|
+
// Check for high error rate
|
|
346
|
+
const recentErrors = this.errorWindow.get(errorType)!.length;
|
|
347
|
+
if (recentErrors > 10) {
|
|
348
|
+
this.alertHighErrorRate(errorType, recentErrors);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private cleanupWindow(errorType: string): void {
|
|
353
|
+
const timestamps = this.errorWindow.get(errorType) || [];
|
|
354
|
+
const cutoff = Date.now() - this.windowSize;
|
|
355
|
+
const recent = timestamps.filter(t => t.getTime() > cutoff);
|
|
356
|
+
this.errorWindow.set(errorType, recent);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
private alertHighErrorRate(errorType: string, count: number): void {
|
|
360
|
+
console.error(`ALERT: High error rate detected - ${errorType}: ${count} errors in 5 minutes`);
|
|
361
|
+
// Send to monitoring system (DataDog, CloudWatch, etc.)
|
|
362
|
+
// sendAlert({ type: errorType, count, window: '5m' });
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
getMetrics() {
|
|
366
|
+
return {
|
|
367
|
+
totalErrors: Object.fromEntries(this.errorCounts),
|
|
368
|
+
recentErrors: Object.fromEntries(
|
|
369
|
+
Array.from(this.errorWindow.entries()).map(([type, timestamps]) => [
|
|
370
|
+
type,
|
|
371
|
+
timestamps.length,
|
|
372
|
+
])
|
|
373
|
+
),
|
|
374
|
+
timestamp: new Date().toISOString(),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// Usage
|
|
380
|
+
const monitor = new ErrorMonitor();
|
|
381
|
+
|
|
382
|
+
try {
|
|
383
|
+
await processFile(fileName);
|
|
384
|
+
} catch (error) {
|
|
385
|
+
monitor.recordError(error);
|
|
386
|
+
throw error;
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Best Practices
|
|
391
|
+
|
|
392
|
+
### Do's
|
|
393
|
+
|
|
394
|
+
1. **Always Check Error Type**
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
if (error instanceof IngestionError && error.isRetryable()) {
|
|
398
|
+
return scheduleRetry();
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
2. **Use Structured Logging**
|
|
403
|
+
|
|
404
|
+
```typescript
|
|
405
|
+
logger.error('Operation failed', error.toJSON());
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
3. **Add Context to Errors**
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
throw new TransformationError('Failed to parse quantity', recordIndex, 'quantity', {
|
|
412
|
+
record,
|
|
413
|
+
originalValue,
|
|
414
|
+
});
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
4. **Re-throw After Handling**
|
|
418
|
+
|
|
419
|
+
```typescript
|
|
420
|
+
try {
|
|
421
|
+
await operation();
|
|
422
|
+
} catch (error) {
|
|
423
|
+
logger.error('Failed', error);
|
|
424
|
+
throw error; // Don't swallow errors
|
|
425
|
+
}
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
5. **Distinguish Retryable Errors**
|
|
429
|
+
```typescript
|
|
430
|
+
// Retryable: NETWORK_ERROR, TIMEOUT_ERROR, RATE_LIMIT_ERROR
|
|
431
|
+
// Non-retryable: PARSE_ERROR, VALIDATION_ERROR, CONFIGURATION_ERROR
|
|
432
|
+
```
|
|
433
|
+
|
|
434
|
+
### Don'ts
|
|
435
|
+
|
|
436
|
+
1. **Don't Swallow Errors**
|
|
437
|
+
|
|
438
|
+
```typescript
|
|
439
|
+
// ❌ WRONG
|
|
440
|
+
try {
|
|
441
|
+
await operation();
|
|
442
|
+
} catch {}
|
|
443
|
+
|
|
444
|
+
// ✅ CORRECT
|
|
445
|
+
try {
|
|
446
|
+
await operation();
|
|
447
|
+
} catch (error) {
|
|
448
|
+
logger.error('Failed', error);
|
|
449
|
+
throw error;
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
2. **Don't Retry Non-Retryable Errors**
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
// ❌ WRONG - Retrying parse errors wastes resources
|
|
457
|
+
await retry(() => parseXML(invalidXML));
|
|
458
|
+
|
|
459
|
+
// ✅ CORRECT - Check if retryable first
|
|
460
|
+
if (error.isRetryable()) await retry(operation);
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
3. **Don't Use Generic Error Messages**
|
|
464
|
+
|
|
465
|
+
```typescript
|
|
466
|
+
// ❌ WRONG
|
|
467
|
+
throw new Error('Failed');
|
|
468
|
+
|
|
469
|
+
// ✅ CORRECT
|
|
470
|
+
throw new FileParsingError('Invalid CSV: missing header row', fileName, 1);
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
4. **Don't Ignore Error Context**
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
// ❌ WRONG
|
|
477
|
+
console.log(error.message);
|
|
478
|
+
|
|
479
|
+
// ✅ CORRECT
|
|
480
|
+
console.log(error.toJSON()); // Includes code, context, timestamp, etc.
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
## Retryable vs Non-Retryable Errors
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
// RETRYABLE - Transient failures
|
|
487
|
+
IngestionErrorCode.NETWORK_ERROR;
|
|
488
|
+
IngestionErrorCode.TIMEOUT_ERROR;
|
|
489
|
+
IngestionErrorCode.RATE_LIMIT_ERROR;
|
|
490
|
+
IngestionErrorCode.LOCK_ACQUISITION_FAILED;
|
|
491
|
+
|
|
492
|
+
// NON-RETRYABLE - Permanent failures
|
|
493
|
+
IngestionErrorCode.PARSE_ERROR;
|
|
494
|
+
IngestionErrorCode.VALIDATION_ERROR;
|
|
495
|
+
IngestionErrorCode.REQUIRED_FIELD_MISSING;
|
|
496
|
+
IngestionErrorCode.CONFIGURATION_ERROR;
|
|
497
|
+
IngestionErrorCode.FIELD_MAPPING_ERROR;
|
|
498
|
+
IngestionErrorCode.INVALID_FILE_FORMAT;
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Related Patterns
|
|
502
|
+
|
|
503
|
+
- [Batch Processing Pattern](../../03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md) - Handling batch-level errors
|
|
504
|
+
- [State Management Pattern](../../02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md) - State-related error handling
|
|
505
|
+
- [Configuration Pattern](../../04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md) - Config validation errors
|
|
506
|
+
|
|
507
|
+
## Related Documentation
|
|
508
|
+
|
|
509
|
+
- [Complete Error Handling Guide](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
510
|
+
- [GraphQL Mapping Error Handling](../../02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md)
|
|
511
|
+
- [API Reference - Error Classes](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|