@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,440 +1,440 @@
|
|
|
1
|
-
# Module 1: Foundations
|
|
2
|
-
|
|
3
|
-
**Level:** Beginner
|
|
4
|
-
**Estimated Time:** 20 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module covers the foundational concepts of webhook validation in the FC Connect SDK. You'll learn how cryptographic signatures protect webhooks, the algorithms Fluent Commerce uses, and the security model that ensures webhooks are authentic and untampered.
|
|
9
|
-
|
|
10
|
-
## Learning Objectives
|
|
11
|
-
|
|
12
|
-
By the end of this module, you will:
|
|
13
|
-
- Understand how cryptographic webhook validation works
|
|
14
|
-
- Know the difference between SHA512 and MD5 signature algorithms
|
|
15
|
-
- Understand RSA public key cryptography basics
|
|
16
|
-
- Know where to get and store public keys
|
|
17
|
-
- Understand the security threats webhook validation prevents
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
## What is Webhook Validation?
|
|
22
|
-
|
|
23
|
-
**Webhook validation** is the process of cryptographically verifying that a webhook request:
|
|
24
|
-
|
|
25
|
-
1. **Originates from Fluent Commerce** - Not a malicious actor
|
|
26
|
-
2. **Has not been tampered with** - Payload integrity is intact
|
|
27
|
-
3. **Is authentic** - Signature matches the expected public key
|
|
28
|
-
|
|
29
|
-
### Webhook Validation Scope
|
|
30
|
-
|
|
31
|
-
The SDK's `validateWebhook()` method is designed for **Fluent Commerce Rubix workflows** but technically works with **any system that implements RSA signature verification** with compatible algorithms (SHA512withRSA or MD5withRSA).
|
|
32
|
-
|
|
33
|
-
**Key Requirement:** You must have access to the **public key** that matches the private key used to sign the webhook.
|
|
34
|
-
|
|
35
|
-
**Common Use Cases:**
|
|
36
|
-
- ✅ Fluent Commerce Rubix workflows (primary use case)
|
|
37
|
-
- ✅ Any system using RSA signatures with SHA512 or MD5
|
|
38
|
-
- ❌ Third-party webhooks using HMAC (Shopify, GitHub, Stripe) - requires manual validation
|
|
39
|
-
|
|
40
|
-
### How It Works
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
┌─────────────────┐
|
|
44
|
-
│ Fluent Commerce │
|
|
45
|
-
│ Rubix Workflow │
|
|
46
|
-
└────────┬────────┘
|
|
47
|
-
│
|
|
48
|
-
│ 1. Generate payload
|
|
49
|
-
│ 2. Sign with private key
|
|
50
|
-
│ 3. Add signature to header
|
|
51
|
-
▼
|
|
52
|
-
┌─────────────┐
|
|
53
|
-
│ Webhook │
|
|
54
|
-
│ Request │
|
|
55
|
-
└──────┬──────┘
|
|
56
|
-
│
|
|
57
|
-
│ Headers:
|
|
58
|
-
│ fluent-signature: <base64-signature>
|
|
59
|
-
│ Body:
|
|
60
|
-
│ { "eventId": "...", "data": {...} }
|
|
61
|
-
▼
|
|
62
|
-
┌──────────────────┐
|
|
63
|
-
│ Your Endpoint │
|
|
64
|
-
│ (SDK Validator) │
|
|
65
|
-
└──────┬───────────┘
|
|
66
|
-
│
|
|
67
|
-
│ 1. Extract signature from header
|
|
68
|
-
│ 2. Verify using public key
|
|
69
|
-
│ 3. Confirm payload integrity
|
|
70
|
-
▼
|
|
71
|
-
┌──────────────┐
|
|
72
|
-
│ Valid ✓ │
|
|
73
|
-
│ Process Data │
|
|
74
|
-
└──────────────┘
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Why This Matters
|
|
78
|
-
|
|
79
|
-
**Without validation**, your system could process:
|
|
80
|
-
- Fake webhooks from attackers pretending to be Fluent Commerce
|
|
81
|
-
- Modified payloads with altered order data, inventory counts, etc.
|
|
82
|
-
- Replayed old webhooks to trigger duplicate processing
|
|
83
|
-
- Malicious payloads designed to exploit your system
|
|
84
|
-
|
|
85
|
-
**With validation**, you ensure:
|
|
86
|
-
- Only genuine Fluent Commerce webhooks are processed
|
|
87
|
-
- Data integrity is preserved end-to-end
|
|
88
|
-
- Your system is protected from webhook-based attacks
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## Cryptographic Signatures Explained
|
|
93
|
-
|
|
94
|
-
### RSA Signature Verification
|
|
95
|
-
|
|
96
|
-
Fluent Commerce uses **RSA asymmetric cryptography** for webhook signatures:
|
|
97
|
-
|
|
98
|
-
1. **Private Key** (Fluent Commerce has this)
|
|
99
|
-
- Used to **sign** webhook payloads
|
|
100
|
-
- Never shared, kept secure
|
|
101
|
-
|
|
102
|
-
2. **Public Key** (You have this)
|
|
103
|
-
- Used to **verify** signatures
|
|
104
|
-
- Shared with integration partners
|
|
105
|
-
- Safe to distribute
|
|
106
|
-
|
|
107
|
-
### The Signing Process
|
|
108
|
-
|
|
109
|
-
```typescript
|
|
110
|
-
// What Fluent Commerce does (you don't do this):
|
|
111
|
-
const signature = crypto.sign(
|
|
112
|
-
'sha512', // Hash algorithm
|
|
113
|
-
webhookPayload, // Raw JSON body
|
|
114
|
-
privateKey // Fluent's private key
|
|
115
|
-
);
|
|
116
|
-
|
|
117
|
-
// Add signature to header
|
|
118
|
-
headers['fluent-signature'] = signature.toString('base64');
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
### The Verification Process
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
// What the SDK does for you:
|
|
125
|
-
const isValid = crypto.verify(
|
|
126
|
-
'sha512', // Same hash algorithm
|
|
127
|
-
webhookPayload, // Raw JSON body (must be identical)
|
|
128
|
-
publicKey, // Your public key from Fluent
|
|
129
|
-
signature // Signature from header
|
|
130
|
-
);
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Key Point**: The signature is a cryptographic hash of the entire webhook body. If even one character changes, verification fails.
|
|
134
|
-
|
|
135
|
-
---
|
|
136
|
-
|
|
137
|
-
## Supported Signature Algorithms
|
|
138
|
-
|
|
139
|
-
Fluent Commerce supports two signature algorithms:
|
|
140
|
-
|
|
141
|
-
### SHA512withRSA
|
|
142
|
-
|
|
143
|
-
**Header:** `fluent-signature`
|
|
144
|
-
**Algorithm:** `SHA512withRSA (RSASSA-PKCS1-v1_5)`
|
|
145
|
-
**Status:** Used for Rubix workflows
|
|
146
|
-
|
|
147
|
-
```typescript
|
|
148
|
-
// Example header
|
|
149
|
-
{
|
|
150
|
-
'fluent-signature': 'iQEcBAABCAAGBQJgm...',
|
|
151
|
-
'content-type': 'application/json'
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**Characteristics:**
|
|
156
|
-
- 512-bit cryptographic hash
|
|
157
|
-
- Used for Rubix workflows
|
|
158
|
-
- Highly resistant to collision attacks
|
|
159
|
-
|
|
160
|
-
### MD5withRSA
|
|
161
|
-
|
|
162
|
-
**Header:** `flex.signature`
|
|
163
|
-
**Algorithm:** `MD5withRSA (RSASSA-PKCS1-v1_5)`
|
|
164
|
-
**Status:** Used for Flex workflows
|
|
165
|
-
|
|
166
|
-
```typescript
|
|
167
|
-
// Example header
|
|
168
|
-
{
|
|
169
|
-
'flex.signature': 'oQEcBAABCAAGBQJgm...',
|
|
170
|
-
'content-type': 'application/json'
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
**Characteristics:**
|
|
175
|
-
- 128-bit hash algorithm
|
|
176
|
-
- Used for Flex workflows
|
|
177
|
-
- Less collision-resistant than SHA512
|
|
178
|
-
|
|
179
|
-
### Algorithm Comparison
|
|
180
|
-
|
|
181
|
-
| Feature | SHA512withRSA | MD5withRSA |
|
|
182
|
-
|---------|---------------|------------|
|
|
183
|
-
| **Header Name** | `fluent-signature` | `flex.signature` |
|
|
184
|
-
| **Hash Strength** | 512-bit | 128-bit |
|
|
185
|
-
| **Security** | High | Moderate |
|
|
186
|
-
| **Collision Resistance** | Excellent | Adequate |
|
|
187
|
-
| **Use Case** | Rubix workflows | Flex workflows |
|
|
188
|
-
|
|
189
|
-
**Best Practice**: The SDK auto-detects which algorithm to use based on the header present.
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## Auto-Detection Pattern
|
|
194
|
-
|
|
195
|
-
The SDK **automatically detects** which signature algorithm to use:
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
// SDK checks headers in priority order:
|
|
199
|
-
if (headers['fluent-signature']) {
|
|
200
|
-
// Use SHA512withRSA
|
|
201
|
-
algorithm = SignatureAlgorithm.SHA512_WITH_RSA;
|
|
202
|
-
signature = headers['fluent-signature'];
|
|
203
|
-
} else if (headers['flex.signature']) {
|
|
204
|
-
// Use MD5withRSA
|
|
205
|
-
algorithm = SignatureAlgorithm.MD5_WITH_RSA;
|
|
206
|
-
signature = headers['flex.signature'];
|
|
207
|
-
} else {
|
|
208
|
-
// No signature found - validation fails
|
|
209
|
-
return { isValid: false, error: 'No signature header found' };
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**You don't need to specify the algorithm** - the SDK handles it automatically.
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## Public Key Management
|
|
218
|
-
|
|
219
|
-
### What is a Public Key?
|
|
220
|
-
|
|
221
|
-
A **public key** is a cryptographic certificate that allows you to verify signatures created by Fluent Commerce's private key.
|
|
222
|
-
|
|
223
|
-
**Format Options:**
|
|
224
|
-
|
|
225
|
-
1. **Full PEM Format** (with headers):
|
|
226
|
-
```
|
|
227
|
-
-----BEGIN PUBLIC KEY-----
|
|
228
|
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
|
|
229
|
-
-----END PUBLIC KEY-----
|
|
230
|
-
```
|
|
231
|
-
|
|
232
|
-
2. **Raw Base64** (without headers):
|
|
233
|
-
```
|
|
234
|
-
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
**The SDK accepts both formats** and automatically adds PEM headers if missing.
|
|
238
|
-
|
|
239
|
-
### Getting Your Public Key
|
|
240
|
-
|
|
241
|
-
Contact your Fluent Commerce account team to obtain the public key for your environment:
|
|
242
|
-
|
|
243
|
-
- **Production**: Production environment public key
|
|
244
|
-
- **Sandbox**: Sandbox environment public key
|
|
245
|
-
- **UAT**: UAT environment public key
|
|
246
|
-
|
|
247
|
-
**Important**: Public keys are **environment-specific**. A production webhook cannot be validated with a sandbox public key.
|
|
248
|
-
|
|
249
|
-
### Storing Public Keys Securely
|
|
250
|
-
|
|
251
|
-
**Environment Variables** (Recommended):
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
# .env file
|
|
255
|
-
FLUENT_WEBHOOK_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIBIj...\n-----END PUBLIC KEY-----"
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
**Versori Variables**:
|
|
259
|
-
|
|
260
|
-
```typescript
|
|
261
|
-
// Access in Versori context
|
|
262
|
-
const publicKey = ctx.vars.FLUENT_WEBHOOK_PUBLIC_KEY;
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
**Configuration Files** (Less secure):
|
|
266
|
-
|
|
267
|
-
```json
|
|
268
|
-
{
|
|
269
|
-
"fluent": {
|
|
270
|
-
"webhookPublicKey": "-----BEGIN PUBLIC KEY-----..."
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
**Best Practices:**
|
|
276
|
-
- Store in environment variables, not hardcoded in source
|
|
277
|
-
- Use secrets management in production (AWS Secrets Manager, Azure Key Vault, etc.)
|
|
278
|
-
- Never commit public keys to version control
|
|
279
|
-
- Rotate keys periodically per security policy
|
|
280
|
-
|
|
281
|
-
---
|
|
282
|
-
|
|
283
|
-
## Security Threats Prevented
|
|
284
|
-
|
|
285
|
-
Webhook validation protects against several attack vectors:
|
|
286
|
-
|
|
287
|
-
### 1. Impersonation Attacks
|
|
288
|
-
|
|
289
|
-
**Threat**: Attacker sends fake webhook pretending to be Fluent Commerce
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
// Malicious request
|
|
293
|
-
POST /webhook
|
|
294
|
-
{
|
|
295
|
-
"eventId": "fake-event",
|
|
296
|
-
"data": { "orderId": "123", "status": "CANCELLED" }
|
|
297
|
-
}
|
|
298
|
-
// No signature or invalid signature
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
**Protection**: Validation fails because signature is missing or invalid
|
|
302
|
-
```typescript
|
|
303
|
-
const result = await validator.validateWebhook(body, headers, publicKey);
|
|
304
|
-
// result.isValid = false
|
|
305
|
-
// result.error = "No signature header found"
|
|
306
|
-
```
|
|
307
|
-
|
|
308
|
-
### 2. Tampering Attacks
|
|
309
|
-
|
|
310
|
-
**Threat**: Attacker intercepts webhook and modifies payload
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
// Original webhook
|
|
314
|
-
{ "orderId": "123", "amount": 100.00 }
|
|
315
|
-
|
|
316
|
-
// Modified by attacker
|
|
317
|
-
{ "orderId": "123", "amount": 0.01 } // Changed amount
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
**Protection**: Signature verification fails because payload changed
|
|
321
|
-
```typescript
|
|
322
|
-
// Signature was created for original payload
|
|
323
|
-
// Verification fails on modified payload
|
|
324
|
-
const result = await validator.validateWebhook(modifiedBody, headers, publicKey);
|
|
325
|
-
// result.isValid = false
|
|
326
|
-
// result.error = "Signature verification failed"
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### 3. Replay Attacks
|
|
330
|
-
|
|
331
|
-
**Threat**: Attacker captures valid webhook and replays it multiple times
|
|
332
|
-
|
|
333
|
-
```typescript
|
|
334
|
-
// Attacker resends same webhook multiple times
|
|
335
|
-
// to trigger duplicate order processing
|
|
336
|
-
```
|
|
337
|
-
|
|
338
|
-
**Protection**: Combine validation with timestamp checks and idempotency keys
|
|
339
|
-
```typescript
|
|
340
|
-
const result = await validator.validateWebhook(body, headers, publicKey);
|
|
341
|
-
if (!result.isValid) throw new Error('Invalid signature');
|
|
342
|
-
|
|
343
|
-
// Additional checks (your implementation)
|
|
344
|
-
const data = JSON.parse(body);
|
|
345
|
-
const eventTime = new Date(data.timestamp);
|
|
346
|
-
const isRecent = Date.now() - eventTime.getTime() < 5 * 60 * 1000; // 5 min
|
|
347
|
-
const isProcessed = await checkIfEventProcessed(data.eventId);
|
|
348
|
-
|
|
349
|
-
if (!isRecent || isProcessed) {
|
|
350
|
-
throw new Error('Stale or duplicate webhook');
|
|
351
|
-
}
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### 4. Man-in-the-Middle Attacks
|
|
355
|
-
|
|
356
|
-
**Threat**: Attacker intercepts and modifies webhook in transit
|
|
357
|
-
|
|
358
|
-
**Protection**:
|
|
359
|
-
- HTTPS encrypts webhook in transit
|
|
360
|
-
- Signature validation detects any modifications
|
|
361
|
-
- Combined protection ensures end-to-end security
|
|
362
|
-
|
|
363
|
-
---
|
|
364
|
-
|
|
365
|
-
## The Validation Workflow
|
|
366
|
-
|
|
367
|
-
Complete validation workflow in the SDK:
|
|
368
|
-
|
|
369
|
-
```
|
|
370
|
-
┌──────────────────────────────────────────────────────┐
|
|
371
|
-
│ 1. Receive Webhook Request │
|
|
372
|
-
│ - Extract raw body (must be unmodified string) │
|
|
373
|
-
│ - Extract headers object │
|
|
374
|
-
└────────────────┬─────────────────────────────────────┘
|
|
375
|
-
│
|
|
376
|
-
▼
|
|
377
|
-
┌──────────────────────────────────────────────────────┐
|
|
378
|
-
│ 2. Detect Signature Algorithm │
|
|
379
|
-
│ - Check for 'fluent-signature' → SHA512 │
|
|
380
|
-
│ - Check for 'flex.signature' → MD5 │
|
|
381
|
-
│ - No signature found → Fail validation │
|
|
382
|
-
└────────────────┬─────────────────────────────────────┘
|
|
383
|
-
│
|
|
384
|
-
▼
|
|
385
|
-
┌──────────────────────────────────────────────────────┐
|
|
386
|
-
│ 3. Extract Signature from Header │
|
|
387
|
-
│ - Decode base64 signature │
|
|
388
|
-
│ - Prepare for verification │
|
|
389
|
-
└────────────────┬─────────────────────────────────────┘
|
|
390
|
-
│
|
|
391
|
-
▼
|
|
392
|
-
┌──────────────────────────────────────────────────────┐
|
|
393
|
-
│ 4. Prepare Public Key │
|
|
394
|
-
│ - Add PEM headers if missing │
|
|
395
|
-
│ - Create verification object │
|
|
396
|
-
└────────────────┬─────────────────────────────────────┘
|
|
397
|
-
│
|
|
398
|
-
▼
|
|
399
|
-
┌──────────────────────────────────────────────────────┐
|
|
400
|
-
│ 5. Verify Signature │
|
|
401
|
-
│ - crypto.createVerify(algorithm) │
|
|
402
|
-
│ - verify.update(rawBody) │
|
|
403
|
-
│ - verify.verify(publicKey, signature, 'base64') │
|
|
404
|
-
└────────────────┬─────────────────────────────────────┘
|
|
405
|
-
│
|
|
406
|
-
▼
|
|
407
|
-
┌──────────────────────────────────────────────────────┐
|
|
408
|
-
│ 6. Return Validation Result │
|
|
409
|
-
│ - isValid: boolean │
|
|
410
|
-
│ - algorithm: string │
|
|
411
|
-
│ - error?: string │
|
|
412
|
-
│ - timestamp: Date │
|
|
413
|
-
└──────────────────────────────────────────────────────┘
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
---
|
|
417
|
-
|
|
418
|
-
## Key Takeaways
|
|
419
|
-
|
|
420
|
-
- **Webhook validation ensures authenticity and integrity** of webhooks from Fluent Commerce
|
|
421
|
-
- **Two algorithms supported**: SHA512withRSA and MD5withRSA
|
|
422
|
-
- **SDK auto-detects** which algorithm to use based on headers
|
|
423
|
-
- **Public keys are environment-specific** - get the right key for prod/sandbox/UAT
|
|
424
|
-
- **Validation prevents**: impersonation, tampering, replay, and MITM attacks
|
|
425
|
-
- **Always use HTTPS** in production for encrypted transport
|
|
426
|
-
- **Store public keys securely** in environment variables or secrets management
|
|
427
|
-
|
|
428
|
-
---
|
|
429
|
-
|
|
430
|
-
## Next Steps
|
|
431
|
-
|
|
432
|
-
Continue to [Module 2: Quick Start](../../auto-pagination/modules/auto-pagination-02-quick-start.md) to learn how to implement webhook validation in your code.
|
|
433
|
-
|
|
434
|
-
---
|
|
435
|
-
|
|
436
|
-
## Further Reading
|
|
437
|
-
|
|
438
|
-
- [Module 5: Configuration](./webhook-validation-05-configuration.md) - Advanced configuration options
|
|
439
|
-
- [Module 6: Error Handling](./webhook-validation-06-error-handling.md) - Handling validation failures
|
|
440
|
-
- [Module 7: API Reference](../../auto-pagination/modules/auto-pagination-07-api-reference.md) - Complete type definitions
|
|
1
|
+
# Module 1: Foundations
|
|
2
|
+
|
|
3
|
+
**Level:** Beginner
|
|
4
|
+
**Estimated Time:** 20 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module covers the foundational concepts of webhook validation in the FC Connect SDK. You'll learn how cryptographic signatures protect webhooks, the algorithms Fluent Commerce uses, and the security model that ensures webhooks are authentic and untampered.
|
|
9
|
+
|
|
10
|
+
## Learning Objectives
|
|
11
|
+
|
|
12
|
+
By the end of this module, you will:
|
|
13
|
+
- Understand how cryptographic webhook validation works
|
|
14
|
+
- Know the difference between SHA512 and MD5 signature algorithms
|
|
15
|
+
- Understand RSA public key cryptography basics
|
|
16
|
+
- Know where to get and store public keys
|
|
17
|
+
- Understand the security threats webhook validation prevents
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## What is Webhook Validation?
|
|
22
|
+
|
|
23
|
+
**Webhook validation** is the process of cryptographically verifying that a webhook request:
|
|
24
|
+
|
|
25
|
+
1. **Originates from Fluent Commerce** - Not a malicious actor
|
|
26
|
+
2. **Has not been tampered with** - Payload integrity is intact
|
|
27
|
+
3. **Is authentic** - Signature matches the expected public key
|
|
28
|
+
|
|
29
|
+
### Webhook Validation Scope
|
|
30
|
+
|
|
31
|
+
The SDK's `validateWebhook()` method is designed for **Fluent Commerce Rubix workflows** but technically works with **any system that implements RSA signature verification** with compatible algorithms (SHA512withRSA or MD5withRSA).
|
|
32
|
+
|
|
33
|
+
**Key Requirement:** You must have access to the **public key** that matches the private key used to sign the webhook.
|
|
34
|
+
|
|
35
|
+
**Common Use Cases:**
|
|
36
|
+
- ✅ Fluent Commerce Rubix workflows (primary use case)
|
|
37
|
+
- ✅ Any system using RSA signatures with SHA512 or MD5
|
|
38
|
+
- ❌ Third-party webhooks using HMAC (Shopify, GitHub, Stripe) - requires manual validation
|
|
39
|
+
|
|
40
|
+
### How It Works
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
┌─────────────────┐
|
|
44
|
+
│ Fluent Commerce │
|
|
45
|
+
│ Rubix Workflow │
|
|
46
|
+
└────────┬────────┘
|
|
47
|
+
│
|
|
48
|
+
│ 1. Generate payload
|
|
49
|
+
│ 2. Sign with private key
|
|
50
|
+
│ 3. Add signature to header
|
|
51
|
+
▼
|
|
52
|
+
┌─────────────┐
|
|
53
|
+
│ Webhook │
|
|
54
|
+
│ Request │
|
|
55
|
+
└──────┬──────┘
|
|
56
|
+
│
|
|
57
|
+
│ Headers:
|
|
58
|
+
│ fluent-signature: <base64-signature>
|
|
59
|
+
│ Body:
|
|
60
|
+
│ { "eventId": "...", "data": {...} }
|
|
61
|
+
▼
|
|
62
|
+
┌──────────────────┐
|
|
63
|
+
│ Your Endpoint │
|
|
64
|
+
│ (SDK Validator) │
|
|
65
|
+
└──────┬───────────┘
|
|
66
|
+
│
|
|
67
|
+
│ 1. Extract signature from header
|
|
68
|
+
│ 2. Verify using public key
|
|
69
|
+
│ 3. Confirm payload integrity
|
|
70
|
+
▼
|
|
71
|
+
┌──────────────┐
|
|
72
|
+
│ Valid ✓ │
|
|
73
|
+
│ Process Data │
|
|
74
|
+
└──────────────┘
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Why This Matters
|
|
78
|
+
|
|
79
|
+
**Without validation**, your system could process:
|
|
80
|
+
- Fake webhooks from attackers pretending to be Fluent Commerce
|
|
81
|
+
- Modified payloads with altered order data, inventory counts, etc.
|
|
82
|
+
- Replayed old webhooks to trigger duplicate processing
|
|
83
|
+
- Malicious payloads designed to exploit your system
|
|
84
|
+
|
|
85
|
+
**With validation**, you ensure:
|
|
86
|
+
- Only genuine Fluent Commerce webhooks are processed
|
|
87
|
+
- Data integrity is preserved end-to-end
|
|
88
|
+
- Your system is protected from webhook-based attacks
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Cryptographic Signatures Explained
|
|
93
|
+
|
|
94
|
+
### RSA Signature Verification
|
|
95
|
+
|
|
96
|
+
Fluent Commerce uses **RSA asymmetric cryptography** for webhook signatures:
|
|
97
|
+
|
|
98
|
+
1. **Private Key** (Fluent Commerce has this)
|
|
99
|
+
- Used to **sign** webhook payloads
|
|
100
|
+
- Never shared, kept secure
|
|
101
|
+
|
|
102
|
+
2. **Public Key** (You have this)
|
|
103
|
+
- Used to **verify** signatures
|
|
104
|
+
- Shared with integration partners
|
|
105
|
+
- Safe to distribute
|
|
106
|
+
|
|
107
|
+
### The Signing Process
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
// What Fluent Commerce does (you don't do this):
|
|
111
|
+
const signature = crypto.sign(
|
|
112
|
+
'sha512', // Hash algorithm
|
|
113
|
+
webhookPayload, // Raw JSON body
|
|
114
|
+
privateKey // Fluent's private key
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
// Add signature to header
|
|
118
|
+
headers['fluent-signature'] = signature.toString('base64');
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### The Verification Process
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
// What the SDK does for you:
|
|
125
|
+
const isValid = crypto.verify(
|
|
126
|
+
'sha512', // Same hash algorithm
|
|
127
|
+
webhookPayload, // Raw JSON body (must be identical)
|
|
128
|
+
publicKey, // Your public key from Fluent
|
|
129
|
+
signature // Signature from header
|
|
130
|
+
);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Key Point**: The signature is a cryptographic hash of the entire webhook body. If even one character changes, verification fails.
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Supported Signature Algorithms
|
|
138
|
+
|
|
139
|
+
Fluent Commerce supports two signature algorithms:
|
|
140
|
+
|
|
141
|
+
### SHA512withRSA
|
|
142
|
+
|
|
143
|
+
**Header:** `fluent-signature`
|
|
144
|
+
**Algorithm:** `SHA512withRSA (RSASSA-PKCS1-v1_5)`
|
|
145
|
+
**Status:** Used for Rubix workflows
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
// Example header
|
|
149
|
+
{
|
|
150
|
+
'fluent-signature': 'iQEcBAABCAAGBQJgm...',
|
|
151
|
+
'content-type': 'application/json'
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**Characteristics:**
|
|
156
|
+
- 512-bit cryptographic hash
|
|
157
|
+
- Used for Rubix workflows
|
|
158
|
+
- Highly resistant to collision attacks
|
|
159
|
+
|
|
160
|
+
### MD5withRSA
|
|
161
|
+
|
|
162
|
+
**Header:** `flex.signature`
|
|
163
|
+
**Algorithm:** `MD5withRSA (RSASSA-PKCS1-v1_5)`
|
|
164
|
+
**Status:** Used for Flex workflows
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
// Example header
|
|
168
|
+
{
|
|
169
|
+
'flex.signature': 'oQEcBAABCAAGBQJgm...',
|
|
170
|
+
'content-type': 'application/json'
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Characteristics:**
|
|
175
|
+
- 128-bit hash algorithm
|
|
176
|
+
- Used for Flex workflows
|
|
177
|
+
- Less collision-resistant than SHA512
|
|
178
|
+
|
|
179
|
+
### Algorithm Comparison
|
|
180
|
+
|
|
181
|
+
| Feature | SHA512withRSA | MD5withRSA |
|
|
182
|
+
|---------|---------------|------------|
|
|
183
|
+
| **Header Name** | `fluent-signature` | `flex.signature` |
|
|
184
|
+
| **Hash Strength** | 512-bit | 128-bit |
|
|
185
|
+
| **Security** | High | Moderate |
|
|
186
|
+
| **Collision Resistance** | Excellent | Adequate |
|
|
187
|
+
| **Use Case** | Rubix workflows | Flex workflows |
|
|
188
|
+
|
|
189
|
+
**Best Practice**: The SDK auto-detects which algorithm to use based on the header present.
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Auto-Detection Pattern
|
|
194
|
+
|
|
195
|
+
The SDK **automatically detects** which signature algorithm to use:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
// SDK checks headers in priority order:
|
|
199
|
+
if (headers['fluent-signature']) {
|
|
200
|
+
// Use SHA512withRSA
|
|
201
|
+
algorithm = SignatureAlgorithm.SHA512_WITH_RSA;
|
|
202
|
+
signature = headers['fluent-signature'];
|
|
203
|
+
} else if (headers['flex.signature']) {
|
|
204
|
+
// Use MD5withRSA
|
|
205
|
+
algorithm = SignatureAlgorithm.MD5_WITH_RSA;
|
|
206
|
+
signature = headers['flex.signature'];
|
|
207
|
+
} else {
|
|
208
|
+
// No signature found - validation fails
|
|
209
|
+
return { isValid: false, error: 'No signature header found' };
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**You don't need to specify the algorithm** - the SDK handles it automatically.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Public Key Management
|
|
218
|
+
|
|
219
|
+
### What is a Public Key?
|
|
220
|
+
|
|
221
|
+
A **public key** is a cryptographic certificate that allows you to verify signatures created by Fluent Commerce's private key.
|
|
222
|
+
|
|
223
|
+
**Format Options:**
|
|
224
|
+
|
|
225
|
+
1. **Full PEM Format** (with headers):
|
|
226
|
+
```
|
|
227
|
+
-----BEGIN PUBLIC KEY-----
|
|
228
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
|
|
229
|
+
-----END PUBLIC KEY-----
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
2. **Raw Base64** (without headers):
|
|
233
|
+
```
|
|
234
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx...
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**The SDK accepts both formats** and automatically adds PEM headers if missing.
|
|
238
|
+
|
|
239
|
+
### Getting Your Public Key
|
|
240
|
+
|
|
241
|
+
Contact your Fluent Commerce account team to obtain the public key for your environment:
|
|
242
|
+
|
|
243
|
+
- **Production**: Production environment public key
|
|
244
|
+
- **Sandbox**: Sandbox environment public key
|
|
245
|
+
- **UAT**: UAT environment public key
|
|
246
|
+
|
|
247
|
+
**Important**: Public keys are **environment-specific**. A production webhook cannot be validated with a sandbox public key.
|
|
248
|
+
|
|
249
|
+
### Storing Public Keys Securely
|
|
250
|
+
|
|
251
|
+
**Environment Variables** (Recommended):
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# .env file
|
|
255
|
+
FLUENT_WEBHOOK_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\nMIIBIj...\n-----END PUBLIC KEY-----"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Versori Variables**:
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// Access in Versori context
|
|
262
|
+
const publicKey = ctx.vars.FLUENT_WEBHOOK_PUBLIC_KEY;
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Configuration Files** (Less secure):
|
|
266
|
+
|
|
267
|
+
```json
|
|
268
|
+
{
|
|
269
|
+
"fluent": {
|
|
270
|
+
"webhookPublicKey": "-----BEGIN PUBLIC KEY-----..."
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Best Practices:**
|
|
276
|
+
- Store in environment variables, not hardcoded in source
|
|
277
|
+
- Use secrets management in production (AWS Secrets Manager, Azure Key Vault, etc.)
|
|
278
|
+
- Never commit public keys to version control
|
|
279
|
+
- Rotate keys periodically per security policy
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
## Security Threats Prevented
|
|
284
|
+
|
|
285
|
+
Webhook validation protects against several attack vectors:
|
|
286
|
+
|
|
287
|
+
### 1. Impersonation Attacks
|
|
288
|
+
|
|
289
|
+
**Threat**: Attacker sends fake webhook pretending to be Fluent Commerce
|
|
290
|
+
|
|
291
|
+
```typescript
|
|
292
|
+
// Malicious request
|
|
293
|
+
POST /webhook
|
|
294
|
+
{
|
|
295
|
+
"eventId": "fake-event",
|
|
296
|
+
"data": { "orderId": "123", "status": "CANCELLED" }
|
|
297
|
+
}
|
|
298
|
+
// No signature or invalid signature
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Protection**: Validation fails because signature is missing or invalid
|
|
302
|
+
```typescript
|
|
303
|
+
const result = await validator.validateWebhook(body, headers, publicKey);
|
|
304
|
+
// result.isValid = false
|
|
305
|
+
// result.error = "No signature header found"
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 2. Tampering Attacks
|
|
309
|
+
|
|
310
|
+
**Threat**: Attacker intercepts webhook and modifies payload
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
// Original webhook
|
|
314
|
+
{ "orderId": "123", "amount": 100.00 }
|
|
315
|
+
|
|
316
|
+
// Modified by attacker
|
|
317
|
+
{ "orderId": "123", "amount": 0.01 } // Changed amount
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Protection**: Signature verification fails because payload changed
|
|
321
|
+
```typescript
|
|
322
|
+
// Signature was created for original payload
|
|
323
|
+
// Verification fails on modified payload
|
|
324
|
+
const result = await validator.validateWebhook(modifiedBody, headers, publicKey);
|
|
325
|
+
// result.isValid = false
|
|
326
|
+
// result.error = "Signature verification failed"
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### 3. Replay Attacks
|
|
330
|
+
|
|
331
|
+
**Threat**: Attacker captures valid webhook and replays it multiple times
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// Attacker resends same webhook multiple times
|
|
335
|
+
// to trigger duplicate order processing
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**Protection**: Combine validation with timestamp checks and idempotency keys
|
|
339
|
+
```typescript
|
|
340
|
+
const result = await validator.validateWebhook(body, headers, publicKey);
|
|
341
|
+
if (!result.isValid) throw new Error('Invalid signature');
|
|
342
|
+
|
|
343
|
+
// Additional checks (your implementation)
|
|
344
|
+
const data = JSON.parse(body);
|
|
345
|
+
const eventTime = new Date(data.timestamp);
|
|
346
|
+
const isRecent = Date.now() - eventTime.getTime() < 5 * 60 * 1000; // 5 min
|
|
347
|
+
const isProcessed = await checkIfEventProcessed(data.eventId);
|
|
348
|
+
|
|
349
|
+
if (!isRecent || isProcessed) {
|
|
350
|
+
throw new Error('Stale or duplicate webhook');
|
|
351
|
+
}
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### 4. Man-in-the-Middle Attacks
|
|
355
|
+
|
|
356
|
+
**Threat**: Attacker intercepts and modifies webhook in transit
|
|
357
|
+
|
|
358
|
+
**Protection**:
|
|
359
|
+
- HTTPS encrypts webhook in transit
|
|
360
|
+
- Signature validation detects any modifications
|
|
361
|
+
- Combined protection ensures end-to-end security
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
## The Validation Workflow
|
|
366
|
+
|
|
367
|
+
Complete validation workflow in the SDK:
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
┌──────────────────────────────────────────────────────┐
|
|
371
|
+
│ 1. Receive Webhook Request │
|
|
372
|
+
│ - Extract raw body (must be unmodified string) │
|
|
373
|
+
│ - Extract headers object │
|
|
374
|
+
└────────────────┬─────────────────────────────────────┘
|
|
375
|
+
│
|
|
376
|
+
▼
|
|
377
|
+
┌──────────────────────────────────────────────────────┐
|
|
378
|
+
│ 2. Detect Signature Algorithm │
|
|
379
|
+
│ - Check for 'fluent-signature' → SHA512 │
|
|
380
|
+
│ - Check for 'flex.signature' → MD5 │
|
|
381
|
+
│ - No signature found → Fail validation │
|
|
382
|
+
└────────────────┬─────────────────────────────────────┘
|
|
383
|
+
│
|
|
384
|
+
▼
|
|
385
|
+
┌──────────────────────────────────────────────────────┐
|
|
386
|
+
│ 3. Extract Signature from Header │
|
|
387
|
+
│ - Decode base64 signature │
|
|
388
|
+
│ - Prepare for verification │
|
|
389
|
+
└────────────────┬─────────────────────────────────────┘
|
|
390
|
+
│
|
|
391
|
+
▼
|
|
392
|
+
┌──────────────────────────────────────────────────────┐
|
|
393
|
+
│ 4. Prepare Public Key │
|
|
394
|
+
│ - Add PEM headers if missing │
|
|
395
|
+
│ - Create verification object │
|
|
396
|
+
└────────────────┬─────────────────────────────────────┘
|
|
397
|
+
│
|
|
398
|
+
▼
|
|
399
|
+
┌──────────────────────────────────────────────────────┐
|
|
400
|
+
│ 5. Verify Signature │
|
|
401
|
+
│ - crypto.createVerify(algorithm) │
|
|
402
|
+
│ - verify.update(rawBody) │
|
|
403
|
+
│ - verify.verify(publicKey, signature, 'base64') │
|
|
404
|
+
└────────────────┬─────────────────────────────────────┘
|
|
405
|
+
│
|
|
406
|
+
▼
|
|
407
|
+
┌──────────────────────────────────────────────────────┐
|
|
408
|
+
│ 6. Return Validation Result │
|
|
409
|
+
│ - isValid: boolean │
|
|
410
|
+
│ - algorithm: string │
|
|
411
|
+
│ - error?: string │
|
|
412
|
+
│ - timestamp: Date │
|
|
413
|
+
└──────────────────────────────────────────────────────┘
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## Key Takeaways
|
|
419
|
+
|
|
420
|
+
- **Webhook validation ensures authenticity and integrity** of webhooks from Fluent Commerce
|
|
421
|
+
- **Two algorithms supported**: SHA512withRSA and MD5withRSA
|
|
422
|
+
- **SDK auto-detects** which algorithm to use based on headers
|
|
423
|
+
- **Public keys are environment-specific** - get the right key for prod/sandbox/UAT
|
|
424
|
+
- **Validation prevents**: impersonation, tampering, replay, and MITM attacks
|
|
425
|
+
- **Always use HTTPS** in production for encrypted transport
|
|
426
|
+
- **Store public keys securely** in environment variables or secrets management
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Next Steps
|
|
431
|
+
|
|
432
|
+
Continue to [Module 2: Quick Start](../../auto-pagination/modules/auto-pagination-02-quick-start.md) to learn how to implement webhook validation in your code.
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
## Further Reading
|
|
437
|
+
|
|
438
|
+
- [Module 5: Configuration](./webhook-validation-05-configuration.md) - Advanced configuration options
|
|
439
|
+
- [Module 6: Error Handling](./webhook-validation-06-error-handling.md) - Handling validation failures
|
|
440
|
+
- [Module 7: API Reference](../../auto-pagination/modules/auto-pagination-07-api-reference.md) - Complete type definitions
|