@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
package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md
CHANGED
|
@@ -1,511 +1,511 @@
|
|
|
1
|
-
# Module 7: API Reference
|
|
2
|
-
|
|
3
|
-
**Level:** Reference
|
|
4
|
-
**Estimated Time:** As needed
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
Complete API reference for the WebhookValidationService, including TypeScript type definitions, method signatures, and comprehensive documentation.
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Core Classes
|
|
13
|
-
|
|
14
|
-
### FluentClient.validateWebhook()
|
|
15
|
-
|
|
16
|
-
Validates webhook authenticity using cryptographic signature verification.
|
|
17
|
-
|
|
18
|
-
**Method Signature:**
|
|
19
|
-
```typescript
|
|
20
|
-
async validateWebhook(
|
|
21
|
-
payload: FluentWebhookPayload,
|
|
22
|
-
signature?: string,
|
|
23
|
-
rawPayload?: string
|
|
24
|
-
): Promise<boolean>
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
**Parameters:**
|
|
28
|
-
- `payload`: Parsed webhook payload object
|
|
29
|
-
- `signature`: (Optional) Signature header value (e.g., from `x-signature`)
|
|
30
|
-
- `rawPayload`: (Optional) Raw request body string (required for signature validation)
|
|
31
|
-
|
|
32
|
-
**Returns:** `Promise<boolean>` - `true` if valid, `false` if invalid
|
|
33
|
-
|
|
34
|
-
**Configuration Required:**
|
|
35
|
-
FluentClient must be configured with `publicKey`:
|
|
36
|
-
```typescript
|
|
37
|
-
const client = await createClient({
|
|
38
|
-
baseUrl: 'https://api.fluentcommerce.com',
|
|
39
|
-
clientId: process.env.FLUENT_CLIENT_ID,
|
|
40
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
41
|
-
publicKey: process.env.FLUENT_WEBHOOK_PUBLIC_KEY // Required for validation
|
|
42
|
-
});
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
> **Note:** `validateWebhook()` is the **ONLY** FluentClient method that does NOT require `retailerId` configuration. This is because webhook validation is performed using RSA public key cryptography and does not require API authentication.
|
|
46
|
-
|
|
47
|
-
**Examples:**
|
|
48
|
-
|
|
49
|
-
1. **Basic Validation (Payload Structure Only):**
|
|
50
|
-
```typescript
|
|
51
|
-
const isValid = await client.validateWebhook(payload);
|
|
52
|
-
// Validates: retailerId, accountId, entityType, rootEntityRef
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
2. **Signature Validation:**
|
|
56
|
-
```typescript
|
|
57
|
-
const signature = req.headers['x-signature'];
|
|
58
|
-
const rawBody = req.body; // Raw string before JSON parsing
|
|
59
|
-
const isValid = await client.validateWebhook(payload, signature, rawBody);
|
|
60
|
-
// Validates: signature + payload structure
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
3. **Versori Platform:**
|
|
64
|
-
```typescript
|
|
65
|
-
export const handleWebhook = webhook('json', {
|
|
66
|
-
handler: async (activation) => {
|
|
67
|
-
const { payload, headers, body } = activation;
|
|
68
|
-
const client = await createClient(activation); // Auto-detects Versori context
|
|
69
|
-
|
|
70
|
-
const signature = headers['x-signature'];
|
|
71
|
-
const isValid = await client.validateWebhook(payload, signature, body);
|
|
72
|
-
|
|
73
|
-
if (!isValid) {
|
|
74
|
-
return { status: 401, message: 'Invalid webhook' };
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Process webhook...
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
**Validation Logic:**
|
|
83
|
-
1. If `signature` provided → Verify cryptographic signature using `publicKey`
|
|
84
|
-
2. Validate payload structure (retailerId, accountId, entityType, rootEntityRef)
|
|
85
|
-
3. Return `true` only if all validations pass
|
|
86
|
-
|
|
87
|
-
**When to Use:**
|
|
88
|
-
- Use `FluentClient.validateWebhook()` when you have a FluentClient instance
|
|
89
|
-
- Use `WebhookValidationService` directly for standalone validation
|
|
90
|
-
- Both use the same underlying validation
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
### WebhookValidationService
|
|
95
|
-
|
|
96
|
-
Main service for validating webhook signatures with RSA algorithms.
|
|
97
|
-
|
|
98
|
-
```typescript
|
|
99
|
-
class WebhookValidationService {
|
|
100
|
-
constructor(
|
|
101
|
-
config: WebhookValidationConfig,
|
|
102
|
-
logger: Logger
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
validateWebhook(
|
|
106
|
-
rawBody: string,
|
|
107
|
-
headers: Record<string, string>,
|
|
108
|
-
publicKey: string
|
|
109
|
-
): Promise<WebhookValidationResult>;
|
|
110
|
-
|
|
111
|
-
validateWebhookSignature(
|
|
112
|
-
rawBody: string,
|
|
113
|
-
signature: string,
|
|
114
|
-
publicKey: string,
|
|
115
|
-
algorithm: SignatureAlgorithm
|
|
116
|
-
): Promise<WebhookValidationResult>;
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
#### Methods
|
|
121
|
-
|
|
122
|
-
**validateWebhook()**
|
|
123
|
-
- **Purpose**: Validate webhook with automatic algorithm detection
|
|
124
|
-
- **Parameters**:
|
|
125
|
-
- `rawBody: string` - Raw request body (unmodified)
|
|
126
|
-
- `headers: Record<string, string>` - HTTP headers
|
|
127
|
-
- `publicKey: string` - Public key (PEM or base64)
|
|
128
|
-
- **Returns**: `Promise<WebhookValidationResult>`
|
|
129
|
-
- **Throws**: Error if strictValidation enabled and validation fails
|
|
130
|
-
|
|
131
|
-
**validateWebhookSignature()**
|
|
132
|
-
- **Purpose**: Validate with explicit algorithm selection
|
|
133
|
-
- **Parameters**:
|
|
134
|
-
- `rawBody: string` - Raw request body
|
|
135
|
-
- `signature: string` - Base64-encoded signature
|
|
136
|
-
- `publicKey: string` - Public key (PEM or base64)
|
|
137
|
-
- `algorithm: SignatureAlgorithm` - Specific algorithm to use
|
|
138
|
-
- **Returns**: `Promise<WebhookValidationResult>`
|
|
139
|
-
- **Throws**: Error if strictValidation enabled and validation fails
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## Factory Class
|
|
144
|
-
|
|
145
|
-
### WebhookValidationFactory
|
|
146
|
-
|
|
147
|
-
Factory methods for common validator configurations.
|
|
148
|
-
|
|
149
|
-
```typescript
|
|
150
|
-
class WebhookValidationFactory {
|
|
151
|
-
static createProduction(logger: Logger): WebhookValidationService;
|
|
152
|
-
static createDevelopment(logger: Logger): WebhookValidationService;
|
|
153
|
-
static createWithFallback(logger: Logger): WebhookValidationService;
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
#### Methods
|
|
158
|
-
|
|
159
|
-
**createProduction()**
|
|
160
|
-
- Creates validator with `strictValidation: true`, `algorithm: SHA512_WITH_RSA`
|
|
161
|
-
- Use for production environments
|
|
162
|
-
|
|
163
|
-
**createDevelopment()**
|
|
164
|
-
- Creates validator with `strictValidation: false`, `algorithm: SHA512_WITH_RSA`
|
|
165
|
-
- Use for development/testing
|
|
166
|
-
|
|
167
|
-
**createWithFallback()**
|
|
168
|
-
- Creates validator with `strictValidation: true`, supports both SHA512 and MD5
|
|
169
|
-
- Use for environments with mixed webhook sources
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## Type Definitions
|
|
174
|
-
|
|
175
|
-
### WebhookValidationConfig
|
|
176
|
-
|
|
177
|
-
```typescript
|
|
178
|
-
interface WebhookValidationConfig {
|
|
179
|
-
/**
|
|
180
|
-
* Throw errors on validation failure (default: false)
|
|
181
|
-
*/
|
|
182
|
-
strictValidation?: boolean;
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Default algorithm if not auto-detected (default: SHA512_WITH_RSA)
|
|
186
|
-
*/
|
|
187
|
-
algorithm?: SignatureAlgorithm;
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### WebhookValidationResult
|
|
192
|
-
|
|
193
|
-
```typescript
|
|
194
|
-
interface WebhookValidationResult {
|
|
195
|
-
/**
|
|
196
|
-
* Whether signature validation succeeded
|
|
197
|
-
*/
|
|
198
|
-
isValid: boolean;
|
|
199
|
-
|
|
200
|
-
/**
|
|
201
|
-
* Algorithm used for validation
|
|
202
|
-
*/
|
|
203
|
-
algorithm: SignatureAlgorithm;
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* Error message if validation failed
|
|
207
|
-
*/
|
|
208
|
-
error?: string;
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Timestamp when validation occurred
|
|
212
|
-
*/
|
|
213
|
-
timestamp: Date;
|
|
214
|
-
}
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### SignatureAlgorithm
|
|
218
|
-
|
|
219
|
-
```typescript
|
|
220
|
-
enum SignatureAlgorithm {
|
|
221
|
-
SHA512_WITH_RSA = 'SHA512withRSA',
|
|
222
|
-
MD5_WITH_RSA = 'MD5withRSA'
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
## Best Practices
|
|
229
|
-
|
|
230
|
-
### 1. Always Use Raw Body
|
|
231
|
-
|
|
232
|
-
```typescript
|
|
233
|
-
// ✅ CORRECT
|
|
234
|
-
const rawBody = await request.text();
|
|
235
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
236
|
-
|
|
237
|
-
// ❌ WRONG
|
|
238
|
-
const data = await request.json();
|
|
239
|
-
const rawBody = JSON.stringify(data); // May change whitespace/order
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
### 2. Check isValid Before Processing
|
|
243
|
-
|
|
244
|
-
```typescript
|
|
245
|
-
// ✅ CORRECT
|
|
246
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
247
|
-
if (!result.isValid) {
|
|
248
|
-
return { statusCode: 401 };
|
|
249
|
-
}
|
|
250
|
-
const data = JSON.parse(rawBody);
|
|
251
|
-
|
|
252
|
-
// ❌ WRONG
|
|
253
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
254
|
-
const data = JSON.parse(rawBody); // Parse before checking isValid
|
|
255
|
-
if (!result.isValid) { /* too late */ }
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### 3. Use Environment Variables for Public Keys
|
|
259
|
-
|
|
260
|
-
```typescript
|
|
261
|
-
// ✅ CORRECT
|
|
262
|
-
const publicKey = process.env.FLUENT_WEBHOOK_PUBLIC_KEY;
|
|
263
|
-
|
|
264
|
-
// ❌ WRONG
|
|
265
|
-
const publicKey = "-----BEGIN PUBLIC KEY-----..."; // Hardcoded
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### 4. Return Appropriate HTTP Status Codes
|
|
269
|
-
|
|
270
|
-
```typescript
|
|
271
|
-
// ✅ CORRECT
|
|
272
|
-
if (!publicKey) return { statusCode: 500 }; // Server error
|
|
273
|
-
if (!signature) return { statusCode: 400 }; // Bad request
|
|
274
|
-
if (!result.isValid) return { statusCode: 401 }; // Unauthorized
|
|
275
|
-
|
|
276
|
-
// ❌ WRONG
|
|
277
|
-
if (!result.isValid) return { statusCode: 500 }; // Wrong code
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
### 5. Log Security Events
|
|
281
|
-
|
|
282
|
-
```typescript
|
|
283
|
-
// ✅ CORRECT
|
|
284
|
-
if (!result.isValid) {
|
|
285
|
-
logger.warn('Invalid webhook signature', {
|
|
286
|
-
error: result.error,
|
|
287
|
-
sourceIp: req.ip
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// ❌ WRONG
|
|
292
|
-
if (!result.isValid) {
|
|
293
|
-
console.log('Invalid'); // No context, poor logging
|
|
294
|
-
}
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
## FAQ
|
|
300
|
-
|
|
301
|
-
### Q: Which algorithm should I use?
|
|
302
|
-
|
|
303
|
-
**A**: Use `SHA512_WITH_RSA` (the SDK default). It's used by Fluent Commerce Rubix workflows. Use `MD5_WITH_RSA` for Flex workflows that require it.
|
|
304
|
-
|
|
305
|
-
### Q: Do I need to specify the algorithm?
|
|
306
|
-
|
|
307
|
-
**A**: No. The SDK auto-detects based on which signature header is present (`fluent-signature` for SHA512, `flex.signature` for MD5).
|
|
308
|
-
|
|
309
|
-
### Q: Can I use parsed JSON body for validation?
|
|
310
|
-
|
|
311
|
-
**A**: No. You must use the raw, unmodified request body. Parsing and re-stringifying may change whitespace or key order, breaking validation.
|
|
312
|
-
|
|
313
|
-
### Q: What if validation always fails?
|
|
314
|
-
|
|
315
|
-
**A**: Check:
|
|
316
|
-
1. Using correct public key for environment (prod vs sandbox)
|
|
317
|
-
2. Using raw body, not parsed and re-stringified
|
|
318
|
-
3. Signature header is present in headers object
|
|
319
|
-
4. Public key format is valid (PEM or base64)
|
|
320
|
-
|
|
321
|
-
### Q: Should I use strict or lenient validation?
|
|
322
|
-
|
|
323
|
-
**A**: Use strict (`strictValidation: true`) in production for fail-fast behavior. Use lenient (`false`) in development for better debugging.
|
|
324
|
-
|
|
325
|
-
### Q: How do I handle multiple environments?
|
|
326
|
-
|
|
327
|
-
**A**: Store separate public keys for each environment and select based on context:
|
|
328
|
-
```typescript
|
|
329
|
-
const publicKey = env === 'production'
|
|
330
|
-
? process.env.FLUENT_WEBHOOK_PUBLIC_KEY_PROD
|
|
331
|
-
: process.env.FLUENT_WEBHOOK_PUBLIC_KEY_SANDBOX;
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### Q: Can I validate webhooks from other sources?
|
|
335
|
-
|
|
336
|
-
**A**: No. This service is specifically for Fluent Commerce Rubix workflows. Don't use it for webhooks from other systems.
|
|
337
|
-
|
|
338
|
-
### Q: What's the difference between validateWebhook and validateWebhookSignature?
|
|
339
|
-
|
|
340
|
-
**A**:
|
|
341
|
-
- `validateWebhook()`: Auto-detects algorithm from headers (recommended)
|
|
342
|
-
- `validateWebhookSignature()`: Explicit algorithm selection (advanced use cases)
|
|
343
|
-
|
|
344
|
-
### Q: How do I test validation locally?
|
|
345
|
-
|
|
346
|
-
**A**: Get a real webhook sample from Fluent Commerce test environment with valid signature. Don't try to generate signatures manually.
|
|
347
|
-
|
|
348
|
-
---
|
|
349
|
-
|
|
350
|
-
## Security Considerations
|
|
351
|
-
|
|
352
|
-
### Public Key Security
|
|
353
|
-
|
|
354
|
-
- **Store in environment variables** or secrets management (AWS Secrets Manager, Azure Key Vault)
|
|
355
|
-
- **Never commit to version control**
|
|
356
|
-
- **Rotate periodically** per security policy
|
|
357
|
-
- **Use environment-specific keys** (prod/sandbox/UAT)
|
|
358
|
-
|
|
359
|
-
### Validation Security
|
|
360
|
-
|
|
361
|
-
- **Always validate before processing** webhook data
|
|
362
|
-
- **Return 401 for invalid signatures** (not detailed error messages)
|
|
363
|
-
- **Log validation failures** for security monitoring
|
|
364
|
-
- **Use HTTPS endpoints** in production
|
|
365
|
-
- **Never log raw signatures** (security risk)
|
|
366
|
-
|
|
367
|
-
### Implementation Security
|
|
368
|
-
|
|
369
|
-
```typescript
|
|
370
|
-
// ✅ CORRECT - Secure implementation
|
|
371
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
372
|
-
if (!result.isValid) {
|
|
373
|
-
logger.warn('Invalid signature'); // Log without details
|
|
374
|
-
return { statusCode: 401, body: 'Unauthorized' }; // Generic message
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// ❌ WRONG - Leaks information
|
|
378
|
-
if (!result.isValid) {
|
|
379
|
-
return {
|
|
380
|
-
statusCode: 401,
|
|
381
|
-
body: {
|
|
382
|
-
error: result.error, // Exposes error details
|
|
383
|
-
publicKey: publicKey, // Exposes key
|
|
384
|
-
signature: headers['fluent-signature'] // Exposes signature
|
|
385
|
-
}
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Performance Considerations
|
|
393
|
-
|
|
394
|
-
### Caching Validators
|
|
395
|
-
|
|
396
|
-
```typescript
|
|
397
|
-
// ✅ GOOD - Reuse validator instance
|
|
398
|
-
const validator = WebhookValidationFactory.createProduction(logger);
|
|
399
|
-
|
|
400
|
-
app.post('/webhook', async (req, res) => {
|
|
401
|
-
const result = await validator.validateWebhook(...);
|
|
402
|
-
// ...
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
// ❌ AVOID - Creating new validator per request
|
|
406
|
-
app.post('/webhook', async (req, res) => {
|
|
407
|
-
const validator = new WebhookValidationService({}, logger);
|
|
408
|
-
const result = await validator.validateWebhook(...);
|
|
409
|
-
});
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
### Async Validation
|
|
413
|
-
|
|
414
|
-
Validation is already async - no additional optimization needed:
|
|
415
|
-
```typescript
|
|
416
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
417
|
-
```
|
|
418
|
-
|
|
419
|
-
---
|
|
420
|
-
|
|
421
|
-
## Migration Guide
|
|
422
|
-
|
|
423
|
-
### From Manual Crypto Validation
|
|
424
|
-
|
|
425
|
-
**Before**:
|
|
426
|
-
```typescript
|
|
427
|
-
const crypto = require('crypto');
|
|
428
|
-
const verify = crypto.createVerify('sha512');
|
|
429
|
-
verify.update(rawBody);
|
|
430
|
-
const isValid = verify.verify(publicKey, signature, 'base64');
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
**After**:
|
|
434
|
-
```typescript
|
|
435
|
-
import {
|
|
436
|
-
WebhookValidationService,
|
|
437
|
-
createConsoleLogger,
|
|
438
|
-
toStructuredLogger,
|
|
439
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
440
|
-
|
|
441
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
442
|
-
const isValid = result.isValid;
|
|
443
|
-
```
|
|
444
|
-
|
|
445
|
-
---
|
|
446
|
-
|
|
447
|
-
## Complete TypeScript Example
|
|
448
|
-
|
|
449
|
-
```typescript
|
|
450
|
-
import {
|
|
451
|
-
WebhookValidationService,
|
|
452
|
-
WebhookValidationFactory,
|
|
453
|
-
SignatureAlgorithm,
|
|
454
|
-
WebhookValidationResult,
|
|
455
|
-
WebhookValidationConfig,
|
|
456
|
-
createConsoleLogger,
|
|
457
|
-
toStructuredLogger
|
|
458
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
459
|
-
|
|
460
|
-
// Initialize services
|
|
461
|
-
const logger = toStructuredLogger(createConsoleLogger(), { service: 'webhook' });
|
|
462
|
-
|
|
463
|
-
// Create validator (choose one)
|
|
464
|
-
const validator1 = WebhookValidationFactory.createProduction(logger);
|
|
465
|
-
const validator2 = new WebhookValidationService({
|
|
466
|
-
strictValidation: true,
|
|
467
|
-
algorithm: SignatureAlgorithm.SHA512_WITH_RSA
|
|
468
|
-
}, logger);
|
|
469
|
-
|
|
470
|
-
// Validate webhook
|
|
471
|
-
async function handleWebhook(
|
|
472
|
-
rawBody: string,
|
|
473
|
-
headers: Record<string, string>,
|
|
474
|
-
publicKey: string
|
|
475
|
-
): Promise<void> {
|
|
476
|
-
const result: WebhookValidationResult = await validator1.validateWebhook(
|
|
477
|
-
rawBody,
|
|
478
|
-
headers,
|
|
479
|
-
publicKey
|
|
480
|
-
);
|
|
481
|
-
|
|
482
|
-
if (!result.isValid) {
|
|
483
|
-
throw new Error(`Validation failed: ${result.error}`);
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
console.log('Valid webhook using:', result.algorithm);
|
|
487
|
-
const data = JSON.parse(rawBody);
|
|
488
|
-
// Process webhook
|
|
489
|
-
}
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
---
|
|
493
|
-
|
|
494
|
-
## Key Takeaways
|
|
495
|
-
|
|
496
|
-
- **Use factory methods** for common scenarios
|
|
497
|
-
- **Auto-detection is preferred** - let SDK choose algorithm
|
|
498
|
-
- **Raw body is mandatory** - never parse before validation
|
|
499
|
-
- **Log security events** - track validation failures
|
|
500
|
-
- **Return 401 for invalid signatures** - proper HTTP semantics
|
|
501
|
-
- **Cache validator instances** - don't create per request
|
|
502
|
-
|
|
503
|
-
---
|
|
504
|
-
|
|
505
|
-
## Related Documentation
|
|
506
|
-
|
|
507
|
-
- [Module 1: Foundations](../../auto-pagination/modules/auto-pagination-01-foundations.md) - Core concepts
|
|
508
|
-
- [Module 2: Quick Start](../../auto-pagination/modules/auto-pagination-02-quick-start.md) - Basic usage
|
|
509
|
-
- [Module 5: Configuration](./webhook-validation-05-configuration.md) - Configuration options
|
|
510
|
-
- [Module 6: Error Handling](./webhook-validation-06-error-handling.md) - Error handling patterns
|
|
511
|
-
- [Quick Reference](../../advanced-services/advanced-services-quick-reference.md) - One-page cheat sheet
|
|
1
|
+
# Module 7: API Reference
|
|
2
|
+
|
|
3
|
+
**Level:** Reference
|
|
4
|
+
**Estimated Time:** As needed
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Complete API reference for the WebhookValidationService, including TypeScript type definitions, method signatures, and comprehensive documentation.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Core Classes
|
|
13
|
+
|
|
14
|
+
### FluentClient.validateWebhook()
|
|
15
|
+
|
|
16
|
+
Validates webhook authenticity using cryptographic signature verification.
|
|
17
|
+
|
|
18
|
+
**Method Signature:**
|
|
19
|
+
```typescript
|
|
20
|
+
async validateWebhook(
|
|
21
|
+
payload: FluentWebhookPayload,
|
|
22
|
+
signature?: string,
|
|
23
|
+
rawPayload?: string
|
|
24
|
+
): Promise<boolean>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**Parameters:**
|
|
28
|
+
- `payload`: Parsed webhook payload object
|
|
29
|
+
- `signature`: (Optional) Signature header value (e.g., from `x-signature`)
|
|
30
|
+
- `rawPayload`: (Optional) Raw request body string (required for signature validation)
|
|
31
|
+
|
|
32
|
+
**Returns:** `Promise<boolean>` - `true` if valid, `false` if invalid
|
|
33
|
+
|
|
34
|
+
**Configuration Required:**
|
|
35
|
+
FluentClient must be configured with `publicKey`:
|
|
36
|
+
```typescript
|
|
37
|
+
const client = await createClient({
|
|
38
|
+
baseUrl: 'https://api.fluentcommerce.com',
|
|
39
|
+
clientId: process.env.FLUENT_CLIENT_ID,
|
|
40
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET,
|
|
41
|
+
publicKey: process.env.FLUENT_WEBHOOK_PUBLIC_KEY // Required for validation
|
|
42
|
+
});
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
> **Note:** `validateWebhook()` is the **ONLY** FluentClient method that does NOT require `retailerId` configuration. This is because webhook validation is performed using RSA public key cryptography and does not require API authentication.
|
|
46
|
+
|
|
47
|
+
**Examples:**
|
|
48
|
+
|
|
49
|
+
1. **Basic Validation (Payload Structure Only):**
|
|
50
|
+
```typescript
|
|
51
|
+
const isValid = await client.validateWebhook(payload);
|
|
52
|
+
// Validates: retailerId, accountId, entityType, rootEntityRef
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
2. **Signature Validation:**
|
|
56
|
+
```typescript
|
|
57
|
+
const signature = req.headers['x-signature'];
|
|
58
|
+
const rawBody = req.body; // Raw string before JSON parsing
|
|
59
|
+
const isValid = await client.validateWebhook(payload, signature, rawBody);
|
|
60
|
+
// Validates: signature + payload structure
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
3. **Versori Platform:**
|
|
64
|
+
```typescript
|
|
65
|
+
export const handleWebhook = webhook('json', {
|
|
66
|
+
handler: async (activation) => {
|
|
67
|
+
const { payload, headers, body } = activation;
|
|
68
|
+
const client = await createClient(activation); // Auto-detects Versori context
|
|
69
|
+
|
|
70
|
+
const signature = headers['x-signature'];
|
|
71
|
+
const isValid = await client.validateWebhook(payload, signature, body);
|
|
72
|
+
|
|
73
|
+
if (!isValid) {
|
|
74
|
+
return { status: 401, message: 'Invalid webhook' };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Process webhook...
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Validation Logic:**
|
|
83
|
+
1. If `signature` provided → Verify cryptographic signature using `publicKey`
|
|
84
|
+
2. Validate payload structure (retailerId, accountId, entityType, rootEntityRef)
|
|
85
|
+
3. Return `true` only if all validations pass
|
|
86
|
+
|
|
87
|
+
**When to Use:**
|
|
88
|
+
- Use `FluentClient.validateWebhook()` when you have a FluentClient instance
|
|
89
|
+
- Use `WebhookValidationService` directly for standalone validation
|
|
90
|
+
- Both use the same underlying validation
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
### WebhookValidationService
|
|
95
|
+
|
|
96
|
+
Main service for validating webhook signatures with RSA algorithms.
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
class WebhookValidationService {
|
|
100
|
+
constructor(
|
|
101
|
+
config: WebhookValidationConfig,
|
|
102
|
+
logger: Logger
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
validateWebhook(
|
|
106
|
+
rawBody: string,
|
|
107
|
+
headers: Record<string, string>,
|
|
108
|
+
publicKey: string
|
|
109
|
+
): Promise<WebhookValidationResult>;
|
|
110
|
+
|
|
111
|
+
validateWebhookSignature(
|
|
112
|
+
rawBody: string,
|
|
113
|
+
signature: string,
|
|
114
|
+
publicKey: string,
|
|
115
|
+
algorithm: SignatureAlgorithm
|
|
116
|
+
): Promise<WebhookValidationResult>;
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### Methods
|
|
121
|
+
|
|
122
|
+
**validateWebhook()**
|
|
123
|
+
- **Purpose**: Validate webhook with automatic algorithm detection
|
|
124
|
+
- **Parameters**:
|
|
125
|
+
- `rawBody: string` - Raw request body (unmodified)
|
|
126
|
+
- `headers: Record<string, string>` - HTTP headers
|
|
127
|
+
- `publicKey: string` - Public key (PEM or base64)
|
|
128
|
+
- **Returns**: `Promise<WebhookValidationResult>`
|
|
129
|
+
- **Throws**: Error if strictValidation enabled and validation fails
|
|
130
|
+
|
|
131
|
+
**validateWebhookSignature()**
|
|
132
|
+
- **Purpose**: Validate with explicit algorithm selection
|
|
133
|
+
- **Parameters**:
|
|
134
|
+
- `rawBody: string` - Raw request body
|
|
135
|
+
- `signature: string` - Base64-encoded signature
|
|
136
|
+
- `publicKey: string` - Public key (PEM or base64)
|
|
137
|
+
- `algorithm: SignatureAlgorithm` - Specific algorithm to use
|
|
138
|
+
- **Returns**: `Promise<WebhookValidationResult>`
|
|
139
|
+
- **Throws**: Error if strictValidation enabled and validation fails
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## Factory Class
|
|
144
|
+
|
|
145
|
+
### WebhookValidationFactory
|
|
146
|
+
|
|
147
|
+
Factory methods for common validator configurations.
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
class WebhookValidationFactory {
|
|
151
|
+
static createProduction(logger: Logger): WebhookValidationService;
|
|
152
|
+
static createDevelopment(logger: Logger): WebhookValidationService;
|
|
153
|
+
static createWithFallback(logger: Logger): WebhookValidationService;
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### Methods
|
|
158
|
+
|
|
159
|
+
**createProduction()**
|
|
160
|
+
- Creates validator with `strictValidation: true`, `algorithm: SHA512_WITH_RSA`
|
|
161
|
+
- Use for production environments
|
|
162
|
+
|
|
163
|
+
**createDevelopment()**
|
|
164
|
+
- Creates validator with `strictValidation: false`, `algorithm: SHA512_WITH_RSA`
|
|
165
|
+
- Use for development/testing
|
|
166
|
+
|
|
167
|
+
**createWithFallback()**
|
|
168
|
+
- Creates validator with `strictValidation: true`, supports both SHA512 and MD5
|
|
169
|
+
- Use for environments with mixed webhook sources
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Type Definitions
|
|
174
|
+
|
|
175
|
+
### WebhookValidationConfig
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
interface WebhookValidationConfig {
|
|
179
|
+
/**
|
|
180
|
+
* Throw errors on validation failure (default: false)
|
|
181
|
+
*/
|
|
182
|
+
strictValidation?: boolean;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Default algorithm if not auto-detected (default: SHA512_WITH_RSA)
|
|
186
|
+
*/
|
|
187
|
+
algorithm?: SignatureAlgorithm;
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### WebhookValidationResult
|
|
192
|
+
|
|
193
|
+
```typescript
|
|
194
|
+
interface WebhookValidationResult {
|
|
195
|
+
/**
|
|
196
|
+
* Whether signature validation succeeded
|
|
197
|
+
*/
|
|
198
|
+
isValid: boolean;
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Algorithm used for validation
|
|
202
|
+
*/
|
|
203
|
+
algorithm: SignatureAlgorithm;
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Error message if validation failed
|
|
207
|
+
*/
|
|
208
|
+
error?: string;
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Timestamp when validation occurred
|
|
212
|
+
*/
|
|
213
|
+
timestamp: Date;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### SignatureAlgorithm
|
|
218
|
+
|
|
219
|
+
```typescript
|
|
220
|
+
enum SignatureAlgorithm {
|
|
221
|
+
SHA512_WITH_RSA = 'SHA512withRSA',
|
|
222
|
+
MD5_WITH_RSA = 'MD5withRSA'
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Best Practices
|
|
229
|
+
|
|
230
|
+
### 1. Always Use Raw Body
|
|
231
|
+
|
|
232
|
+
```typescript
|
|
233
|
+
// ✅ CORRECT
|
|
234
|
+
const rawBody = await request.text();
|
|
235
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
236
|
+
|
|
237
|
+
// ❌ WRONG
|
|
238
|
+
const data = await request.json();
|
|
239
|
+
const rawBody = JSON.stringify(data); // May change whitespace/order
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 2. Check isValid Before Processing
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
// ✅ CORRECT
|
|
246
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
247
|
+
if (!result.isValid) {
|
|
248
|
+
return { statusCode: 401 };
|
|
249
|
+
}
|
|
250
|
+
const data = JSON.parse(rawBody);
|
|
251
|
+
|
|
252
|
+
// ❌ WRONG
|
|
253
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
254
|
+
const data = JSON.parse(rawBody); // Parse before checking isValid
|
|
255
|
+
if (!result.isValid) { /* too late */ }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 3. Use Environment Variables for Public Keys
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
// ✅ CORRECT
|
|
262
|
+
const publicKey = process.env.FLUENT_WEBHOOK_PUBLIC_KEY;
|
|
263
|
+
|
|
264
|
+
// ❌ WRONG
|
|
265
|
+
const publicKey = "-----BEGIN PUBLIC KEY-----..."; // Hardcoded
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 4. Return Appropriate HTTP Status Codes
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
// ✅ CORRECT
|
|
272
|
+
if (!publicKey) return { statusCode: 500 }; // Server error
|
|
273
|
+
if (!signature) return { statusCode: 400 }; // Bad request
|
|
274
|
+
if (!result.isValid) return { statusCode: 401 }; // Unauthorized
|
|
275
|
+
|
|
276
|
+
// ❌ WRONG
|
|
277
|
+
if (!result.isValid) return { statusCode: 500 }; // Wrong code
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### 5. Log Security Events
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
// ✅ CORRECT
|
|
284
|
+
if (!result.isValid) {
|
|
285
|
+
logger.warn('Invalid webhook signature', {
|
|
286
|
+
error: result.error,
|
|
287
|
+
sourceIp: req.ip
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ❌ WRONG
|
|
292
|
+
if (!result.isValid) {
|
|
293
|
+
console.log('Invalid'); // No context, poor logging
|
|
294
|
+
}
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## FAQ
|
|
300
|
+
|
|
301
|
+
### Q: Which algorithm should I use?
|
|
302
|
+
|
|
303
|
+
**A**: Use `SHA512_WITH_RSA` (the SDK default). It's used by Fluent Commerce Rubix workflows. Use `MD5_WITH_RSA` for Flex workflows that require it.
|
|
304
|
+
|
|
305
|
+
### Q: Do I need to specify the algorithm?
|
|
306
|
+
|
|
307
|
+
**A**: No. The SDK auto-detects based on which signature header is present (`fluent-signature` for SHA512, `flex.signature` for MD5).
|
|
308
|
+
|
|
309
|
+
### Q: Can I use parsed JSON body for validation?
|
|
310
|
+
|
|
311
|
+
**A**: No. You must use the raw, unmodified request body. Parsing and re-stringifying may change whitespace or key order, breaking validation.
|
|
312
|
+
|
|
313
|
+
### Q: What if validation always fails?
|
|
314
|
+
|
|
315
|
+
**A**: Check:
|
|
316
|
+
1. Using correct public key for environment (prod vs sandbox)
|
|
317
|
+
2. Using raw body, not parsed and re-stringified
|
|
318
|
+
3. Signature header is present in headers object
|
|
319
|
+
4. Public key format is valid (PEM or base64)
|
|
320
|
+
|
|
321
|
+
### Q: Should I use strict or lenient validation?
|
|
322
|
+
|
|
323
|
+
**A**: Use strict (`strictValidation: true`) in production for fail-fast behavior. Use lenient (`false`) in development for better debugging.
|
|
324
|
+
|
|
325
|
+
### Q: How do I handle multiple environments?
|
|
326
|
+
|
|
327
|
+
**A**: Store separate public keys for each environment and select based on context:
|
|
328
|
+
```typescript
|
|
329
|
+
const publicKey = env === 'production'
|
|
330
|
+
? process.env.FLUENT_WEBHOOK_PUBLIC_KEY_PROD
|
|
331
|
+
: process.env.FLUENT_WEBHOOK_PUBLIC_KEY_SANDBOX;
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### Q: Can I validate webhooks from other sources?
|
|
335
|
+
|
|
336
|
+
**A**: No. This service is specifically for Fluent Commerce Rubix workflows. Don't use it for webhooks from other systems.
|
|
337
|
+
|
|
338
|
+
### Q: What's the difference between validateWebhook and validateWebhookSignature?
|
|
339
|
+
|
|
340
|
+
**A**:
|
|
341
|
+
- `validateWebhook()`: Auto-detects algorithm from headers (recommended)
|
|
342
|
+
- `validateWebhookSignature()`: Explicit algorithm selection (advanced use cases)
|
|
343
|
+
|
|
344
|
+
### Q: How do I test validation locally?
|
|
345
|
+
|
|
346
|
+
**A**: Get a real webhook sample from Fluent Commerce test environment with valid signature. Don't try to generate signatures manually.
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## Security Considerations
|
|
351
|
+
|
|
352
|
+
### Public Key Security
|
|
353
|
+
|
|
354
|
+
- **Store in environment variables** or secrets management (AWS Secrets Manager, Azure Key Vault)
|
|
355
|
+
- **Never commit to version control**
|
|
356
|
+
- **Rotate periodically** per security policy
|
|
357
|
+
- **Use environment-specific keys** (prod/sandbox/UAT)
|
|
358
|
+
|
|
359
|
+
### Validation Security
|
|
360
|
+
|
|
361
|
+
- **Always validate before processing** webhook data
|
|
362
|
+
- **Return 401 for invalid signatures** (not detailed error messages)
|
|
363
|
+
- **Log validation failures** for security monitoring
|
|
364
|
+
- **Use HTTPS endpoints** in production
|
|
365
|
+
- **Never log raw signatures** (security risk)
|
|
366
|
+
|
|
367
|
+
### Implementation Security
|
|
368
|
+
|
|
369
|
+
```typescript
|
|
370
|
+
// ✅ CORRECT - Secure implementation
|
|
371
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
372
|
+
if (!result.isValid) {
|
|
373
|
+
logger.warn('Invalid signature'); // Log without details
|
|
374
|
+
return { statusCode: 401, body: 'Unauthorized' }; // Generic message
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// ❌ WRONG - Leaks information
|
|
378
|
+
if (!result.isValid) {
|
|
379
|
+
return {
|
|
380
|
+
statusCode: 401,
|
|
381
|
+
body: {
|
|
382
|
+
error: result.error, // Exposes error details
|
|
383
|
+
publicKey: publicKey, // Exposes key
|
|
384
|
+
signature: headers['fluent-signature'] // Exposes signature
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Performance Considerations
|
|
393
|
+
|
|
394
|
+
### Caching Validators
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
// ✅ GOOD - Reuse validator instance
|
|
398
|
+
const validator = WebhookValidationFactory.createProduction(logger);
|
|
399
|
+
|
|
400
|
+
app.post('/webhook', async (req, res) => {
|
|
401
|
+
const result = await validator.validateWebhook(...);
|
|
402
|
+
// ...
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// ❌ AVOID - Creating new validator per request
|
|
406
|
+
app.post('/webhook', async (req, res) => {
|
|
407
|
+
const validator = new WebhookValidationService({}, logger);
|
|
408
|
+
const result = await validator.validateWebhook(...);
|
|
409
|
+
});
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Async Validation
|
|
413
|
+
|
|
414
|
+
Validation is already async - no additional optimization needed:
|
|
415
|
+
```typescript
|
|
416
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## Migration Guide
|
|
422
|
+
|
|
423
|
+
### From Manual Crypto Validation
|
|
424
|
+
|
|
425
|
+
**Before**:
|
|
426
|
+
```typescript
|
|
427
|
+
const crypto = require('crypto');
|
|
428
|
+
const verify = crypto.createVerify('sha512');
|
|
429
|
+
verify.update(rawBody);
|
|
430
|
+
const isValid = verify.verify(publicKey, signature, 'base64');
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**After**:
|
|
434
|
+
```typescript
|
|
435
|
+
import {
|
|
436
|
+
WebhookValidationService,
|
|
437
|
+
createConsoleLogger,
|
|
438
|
+
toStructuredLogger,
|
|
439
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
440
|
+
|
|
441
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
442
|
+
const isValid = result.isValid;
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## Complete TypeScript Example
|
|
448
|
+
|
|
449
|
+
```typescript
|
|
450
|
+
import {
|
|
451
|
+
WebhookValidationService,
|
|
452
|
+
WebhookValidationFactory,
|
|
453
|
+
SignatureAlgorithm,
|
|
454
|
+
WebhookValidationResult,
|
|
455
|
+
WebhookValidationConfig,
|
|
456
|
+
createConsoleLogger,
|
|
457
|
+
toStructuredLogger
|
|
458
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
459
|
+
|
|
460
|
+
// Initialize services
|
|
461
|
+
const logger = toStructuredLogger(createConsoleLogger(), { service: 'webhook' });
|
|
462
|
+
|
|
463
|
+
// Create validator (choose one)
|
|
464
|
+
const validator1 = WebhookValidationFactory.createProduction(logger);
|
|
465
|
+
const validator2 = new WebhookValidationService({
|
|
466
|
+
strictValidation: true,
|
|
467
|
+
algorithm: SignatureAlgorithm.SHA512_WITH_RSA
|
|
468
|
+
}, logger);
|
|
469
|
+
|
|
470
|
+
// Validate webhook
|
|
471
|
+
async function handleWebhook(
|
|
472
|
+
rawBody: string,
|
|
473
|
+
headers: Record<string, string>,
|
|
474
|
+
publicKey: string
|
|
475
|
+
): Promise<void> {
|
|
476
|
+
const result: WebhookValidationResult = await validator1.validateWebhook(
|
|
477
|
+
rawBody,
|
|
478
|
+
headers,
|
|
479
|
+
publicKey
|
|
480
|
+
);
|
|
481
|
+
|
|
482
|
+
if (!result.isValid) {
|
|
483
|
+
throw new Error(`Validation failed: ${result.error}`);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
console.log('Valid webhook using:', result.algorithm);
|
|
487
|
+
const data = JSON.parse(rawBody);
|
|
488
|
+
// Process webhook
|
|
489
|
+
}
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## Key Takeaways
|
|
495
|
+
|
|
496
|
+
- **Use factory methods** for common scenarios
|
|
497
|
+
- **Auto-detection is preferred** - let SDK choose algorithm
|
|
498
|
+
- **Raw body is mandatory** - never parse before validation
|
|
499
|
+
- **Log security events** - track validation failures
|
|
500
|
+
- **Return 401 for invalid signatures** - proper HTTP semantics
|
|
501
|
+
- **Cache validator instances** - don't create per request
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## Related Documentation
|
|
506
|
+
|
|
507
|
+
- [Module 1: Foundations](../../auto-pagination/modules/auto-pagination-01-foundations.md) - Core concepts
|
|
508
|
+
- [Module 2: Quick Start](../../auto-pagination/modules/auto-pagination-02-quick-start.md) - Basic usage
|
|
509
|
+
- [Module 5: Configuration](./webhook-validation-05-configuration.md) - Configuration options
|
|
510
|
+
- [Module 6: Error Handling](./webhook-validation-06-error-handling.md) - Error handling patterns
|
|
511
|
+
- [Quick Reference](../../advanced-services/advanced-services-quick-reference.md) - One-page cheat sheet
|