@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,432 +1,432 @@
|
|
|
1
|
-
# Module 9: Rubix Event Webhooks vs HTTP Call Webhooks
|
|
2
|
-
|
|
3
|
-
**Level:** Intermediate
|
|
4
|
-
**Estimated Time:** 15 minutes
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This module clarifies the **TWO types of webhooks** that can come from Fluent Commerce Rubix workflows and which validation method to use for each.
|
|
9
|
-
|
|
10
|
-
**CRITICAL DISTINCTION**: Rubix workflows can send webhooks in two different ways, with different payload structures and validation requirements.
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Two Types of Rubix Webhooks
|
|
15
|
-
|
|
16
|
-
### 1. Fluent Commerce Event Webhooks
|
|
17
|
-
|
|
18
|
-
**Trigger:** Rubix workflow event system (automatic event firing)
|
|
19
|
-
|
|
20
|
-
**Payload Structure:** Standardized Fluent Commerce event format
|
|
21
|
-
|
|
22
|
-
**Example:**
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"id": "2a43a5d2-0c8f-484d-a0cf-c5353d040997",
|
|
26
|
-
"name": "order_webhook_status",
|
|
27
|
-
"accountId": "
|
|
28
|
-
"retailerId": "2",
|
|
29
|
-
"entityId": "6469",
|
|
30
|
-
"entityRef": "HD_G_FROM_POSTMAN_WEBHOOK_TEST",
|
|
31
|
-
"entityType": "ORDER",
|
|
32
|
-
"entitySubtype": "HD",
|
|
33
|
-
"entityStatus": "RECEIVED",
|
|
34
|
-
"type": "NORMAL",
|
|
35
|
-
"attributes": { ... },
|
|
36
|
-
"meta": { ... }
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
**Key Fields:**
|
|
41
|
-
- ✓ `name` - Event name (e.g., "order_webhook_status")
|
|
42
|
-
- ✓ `id` - Event ID (UUID)
|
|
43
|
-
- ✓ `retailerId` - Retailer ID
|
|
44
|
-
|
|
45
|
-
**Headers:**
|
|
46
|
-
```
|
|
47
|
-
fluent-signature: C5W1vJHfJm44pejcN4C/Pch+mb62s8SjgTsmLIHzTLWh0Ew4d5No...
|
|
48
|
-
flex.signature: V1YNn0KexNIjmLzAdcum2jNi8CX2ar1HN/ZiCrta7A7vDIl/8FY4...
|
|
49
|
-
content-type: application/json
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
---
|
|
53
|
-
|
|
54
|
-
### 2. Rubix HTTP Call Webhooks
|
|
55
|
-
|
|
56
|
-
**Trigger:** Manual HTTP Call action in Rubix workflow
|
|
57
|
-
|
|
58
|
-
**Payload Structure:** Custom (user-defined in Rubix)
|
|
59
|
-
|
|
60
|
-
**Example:**
|
|
61
|
-
```json
|
|
62
|
-
{
|
|
63
|
-
"entityId": "order-123",
|
|
64
|
-
"entityRef": "ORD-001",
|
|
65
|
-
"entityType": "order",
|
|
66
|
-
"triggerSource": "ORDER_FULFILLMENT",
|
|
67
|
-
"retailerId": "1",
|
|
68
|
-
"timestamp": "2025-11-07T12:34:56.789Z"
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
**Key Fields:**
|
|
73
|
-
- ✗ NO `name` field
|
|
74
|
-
- ✗ NO `id` field (usually has `entityId` instead)
|
|
75
|
-
- ✓ `retailerId` (if you include it)
|
|
76
|
-
|
|
77
|
-
**Headers:** Same as Event webhooks
|
|
78
|
-
```
|
|
79
|
-
fluent-signature: ...
|
|
80
|
-
flex.signature: ...
|
|
81
|
-
content-type: application/json
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Which Validation Method to Use?
|
|
87
|
-
|
|
88
|
-
### Option 1: WebhookValidationService (Works for BOTH)
|
|
89
|
-
|
|
90
|
-
```typescript
|
|
91
|
-
import { WebhookValidationService } from '@fluentcommerce/fc-connect-sdk';
|
|
92
|
-
|
|
93
|
-
// ✅ Works for Event webhooks
|
|
94
|
-
// ✅ Works for HTTP Call webhooks
|
|
95
|
-
// ✅ Recommended for flexibility
|
|
96
|
-
// ✅ Versori log can be passed directly (no wrapper needed)
|
|
97
|
-
|
|
98
|
-
const validator = new WebhookValidationService({ strictValidation: true }, log);
|
|
99
|
-
|
|
100
|
-
const result = await validator.validateWebhook(
|
|
101
|
-
rawBodyString, // Raw payload
|
|
102
|
-
headers, // Headers
|
|
103
|
-
publicKey // Public key
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
if (!result.isValid) {
|
|
107
|
-
return { status: 401, body: { error: 'Invalid signature' } };
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// Parse payload AFTER validation
|
|
111
|
-
const payload = JSON.parse(rawBodyString);
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**Use when:**
|
|
115
|
-
- Building flexible webhook handlers that accept both types
|
|
116
|
-
- Using Rubix HTTP Call action with custom payloads
|
|
117
|
-
- You want one consistent pattern for all webhooks
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
### Option 2: FluentClient.validateWebhook() (Event Webhooks Only)
|
|
122
|
-
|
|
123
|
-
```typescript
|
|
124
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
125
|
-
|
|
126
|
-
// ✅ Works for Event webhooks (has name, id, retailerId)
|
|
127
|
-
// ❌ FAILS for HTTP Call webhooks (missing required fields)
|
|
128
|
-
|
|
129
|
-
const client = await createClient({ ...ctx, log, connections });
|
|
130
|
-
|
|
131
|
-
const payload = JSON.parse(rawBodyString); // Parse first
|
|
132
|
-
|
|
133
|
-
const isValid = await client.validateWebhook(
|
|
134
|
-
payload, // FluentWebhookPayload object
|
|
135
|
-
signature, // Signature string
|
|
136
|
-
rawBodyString // Raw payload string
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
if (!isValid) {
|
|
140
|
-
return { status: 401, body: { error: 'Invalid signature' } };
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Process validated payload
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**Use when:**
|
|
147
|
-
- You KNOW you're receiving Event webhooks only
|
|
148
|
-
- Payload has `name`, `id`, and `retailerId` fields
|
|
149
|
-
- You want additional field validation
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## Decision Matrix
|
|
154
|
-
|
|
155
|
-
| Webhook Type | Has `name`, `id`, `retailerId`? | Use WebhookValidationService | Use FluentClient.validateWebhook |
|
|
156
|
-
|--------------|--------------------------------|------------------------------|----------------------------------|
|
|
157
|
-
| **Event Webhook** | ✓ Yes | ✅ Recommended | ✅ Acceptable |
|
|
158
|
-
| **HTTP Call Webhook** | ✗ No | ✅ Required | ❌ Will fail |
|
|
159
|
-
| **Mixed (Both Types)** | ⚠️ Varies | ✅ Use this | ❌ Won't work for all |
|
|
160
|
-
|
|
161
|
-
---
|
|
162
|
-
|
|
163
|
-
## Real-World Example Analysis
|
|
164
|
-
|
|
165
|
-
### Your Webhook Sample (Event Webhook)
|
|
166
|
-
|
|
167
|
-
```json
|
|
168
|
-
{
|
|
169
|
-
"id": "2a43a5d2-0c8f-484d-a0cf-c5353d040997", // ✓ Has id
|
|
170
|
-
"name": "order_webhook_status", // ✓ Has name
|
|
171
|
-
"retailerId": "2", // ✓ Has retailerId
|
|
172
|
-
"entityId": "6469",
|
|
173
|
-
"entityRef": "HD_G_FROM_POSTMAN_WEBHOOK_TEST"
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
**Analysis:**
|
|
178
|
-
- This is a **Fluent Commerce Event webhook**
|
|
179
|
-
- Has all required fields: `name`, `id`, `retailerId`
|
|
180
|
-
- Can use EITHER validation method
|
|
181
|
-
- Sent automatically by Rubix event system
|
|
182
|
-
|
|
183
|
-
**Headers:**
|
|
184
|
-
```
|
|
185
|
-
fluent-signature: C5W1vJHfJm44pejcN4C/Pch+mb62s8SjgTsmLIHzTLWh0Ew4d5No...
|
|
186
|
-
flex.signature: V1YNn0KexNIjmLzAdcum2jNi8CX2ar1HN/ZiCrta7A7vDIl/8FY4...
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
Both signatures present (as documented).
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## Implementation Examples
|
|
194
|
-
|
|
195
|
-
### Pattern 1: WebhookValidationService (Flexible)
|
|
196
|
-
|
|
197
|
-
```typescript
|
|
198
|
-
import { webhook, http } from '@versori/run';
|
|
199
|
-
import {
|
|
200
|
-
createClient,
|
|
201
|
-
WebhookValidationService,
|
|
202
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
203
|
-
|
|
204
|
-
export const flexibleWebhook = webhook('flexible-webhook', {
|
|
205
|
-
response: { mode: 'sync' },
|
|
206
|
-
}).then(
|
|
207
|
-
http('handler', { connection: 'fluent_commerce' }, async ctx => {
|
|
208
|
-
const { log, activation, connections } = ctx;
|
|
209
|
-
|
|
210
|
-
// Get configuration
|
|
211
|
-
const publicKey = activation.getVariable('fluentPublicKey');
|
|
212
|
-
const rawBody = activation.body || JSON.stringify(ctx.data);
|
|
213
|
-
const headers = activation.headers || {};
|
|
214
|
-
|
|
215
|
-
// Validate with WebhookValidationService (works for both types)
|
|
216
|
-
// Versori log can be passed directly (no wrapper needed)
|
|
217
|
-
const validator = new WebhookValidationService({ strictValidation: true }, log);
|
|
218
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
219
|
-
|
|
220
|
-
if (!result.isValid) {
|
|
221
|
-
log.error('Invalid signature', { error: result.error });
|
|
222
|
-
return { status: 401, body: { error: result.error } };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
log.info('✅ Signature validated', { algorithm: result.algorithm });
|
|
226
|
-
|
|
227
|
-
// Parse payload
|
|
228
|
-
const payload = JSON.parse(rawBody);
|
|
229
|
-
|
|
230
|
-
// Determine webhook type
|
|
231
|
-
if (payload.name && payload.id && payload.retailerId) {
|
|
232
|
-
log.info('Processing Event webhook', { eventName: payload.name });
|
|
233
|
-
// Handle Event webhook
|
|
234
|
-
return await processEventWebhook(payload, ctx);
|
|
235
|
-
} else if (payload.entityId || payload.entityRef) {
|
|
236
|
-
log.info('Processing HTTP Call webhook', { entityRef: payload.entityRef });
|
|
237
|
-
// Handle HTTP Call webhook
|
|
238
|
-
return await processHttpCallWebhook(payload, ctx);
|
|
239
|
-
} else {
|
|
240
|
-
log.error('Unknown webhook type', { payloadKeys: Object.keys(payload) });
|
|
241
|
-
return { status: 400, body: { error: 'Unknown webhook type' } };
|
|
242
|
-
}
|
|
243
|
-
})
|
|
244
|
-
);
|
|
245
|
-
|
|
246
|
-
async function processEventWebhook(payload: any, ctx: any) {
|
|
247
|
-
// Process Event webhook with standard fields
|
|
248
|
-
return { status: 200, body: { success: true, type: 'event' } };
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
async function processHttpCallWebhook(payload: any, ctx: any) {
|
|
252
|
-
// Process HTTP Call webhook with custom fields
|
|
253
|
-
return { status: 200, body: { success: true, type: 'http_call' } };
|
|
254
|
-
}
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
---
|
|
258
|
-
|
|
259
|
-
### Pattern 2: FluentClient.validateWebhook() (Event Webhooks Only)
|
|
260
|
-
|
|
261
|
-
```typescript
|
|
262
|
-
import { webhook, http } from '@versori/run';
|
|
263
|
-
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
264
|
-
|
|
265
|
-
export const eventWebhook = webhook('event-webhook', {
|
|
266
|
-
response: { mode: 'sync' },
|
|
267
|
-
}).then(
|
|
268
|
-
http('handler', { connection: 'fluent_commerce' }, async ctx => {
|
|
269
|
-
const { log, activation, connections } = ctx;
|
|
270
|
-
|
|
271
|
-
// Get raw body
|
|
272
|
-
const rawBody = activation.body || JSON.stringify(ctx.data);
|
|
273
|
-
const headers = activation.headers || {};
|
|
274
|
-
|
|
275
|
-
// Parse payload first
|
|
276
|
-
const payload = JSON.parse(rawBody);
|
|
277
|
-
|
|
278
|
-
// Verify this is an Event webhook
|
|
279
|
-
if (!payload.name || !payload.id || !payload.retailerId) {
|
|
280
|
-
log.error('Not an Event webhook', { payloadKeys: Object.keys(payload) });
|
|
281
|
-
return { status: 400, body: { error: 'Expected Event webhook with name, id, retailerId' } };
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Get signature
|
|
285
|
-
const signature = headers['fluent-signature'] || headers['flex.signature'];
|
|
286
|
-
|
|
287
|
-
// Create Fluent client
|
|
288
|
-
const client = await createClient({ ...ctx, log, connections });
|
|
289
|
-
|
|
290
|
-
// Validate using FluentClient (Event webhooks only)
|
|
291
|
-
const isValid = await client.validateWebhook(payload, signature, rawBody);
|
|
292
|
-
|
|
293
|
-
if (!isValid) {
|
|
294
|
-
log.error('Invalid Event webhook signature');
|
|
295
|
-
return { status: 401, body: { error: 'Invalid signature' } };
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
log.info('✅ Event webhook validated', { eventName: payload.name });
|
|
299
|
-
|
|
300
|
-
// Process Event webhook
|
|
301
|
-
return { status: 200, body: { success: true, eventId: payload.id } };
|
|
302
|
-
})
|
|
303
|
-
);
|
|
304
|
-
```
|
|
305
|
-
|
|
306
|
-
---
|
|
307
|
-
|
|
308
|
-
## How to Identify Webhook Type
|
|
309
|
-
|
|
310
|
-
### Method 1: Check Payload Structure
|
|
311
|
-
|
|
312
|
-
```typescript
|
|
313
|
-
const payload = JSON.parse(rawBody);
|
|
314
|
-
|
|
315
|
-
if (payload.name && payload.id && payload.retailerId) {
|
|
316
|
-
// This is an Event webhook
|
|
317
|
-
console.log('Type: Event webhook');
|
|
318
|
-
console.log('Event name:', payload.name);
|
|
319
|
-
} else if (payload.entityId || payload.entityRef) {
|
|
320
|
-
// This is an HTTP Call webhook
|
|
321
|
-
console.log('Type: HTTP Call webhook');
|
|
322
|
-
console.log('Entity ref:', payload.entityRef);
|
|
323
|
-
} else {
|
|
324
|
-
// Unknown type
|
|
325
|
-
console.warn('Unknown webhook type');
|
|
326
|
-
}
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### Method 2: Check Rubix Configuration
|
|
330
|
-
|
|
331
|
-
**Event Webhooks:**
|
|
332
|
-
- Configured in: Fluent Commerce dashboard → Events → Webhook subscriptions
|
|
333
|
-
- Trigger: Automatic (when events fire)
|
|
334
|
-
- Payload: Standard Fluent event format
|
|
335
|
-
|
|
336
|
-
**HTTP Call Webhooks:**
|
|
337
|
-
- Configured in: Rubix workflow → Add HTTP Call action
|
|
338
|
-
- Trigger: Manual (you configure when to send)
|
|
339
|
-
- Payload: Custom (you define the JSON structure)
|
|
340
|
-
|
|
341
|
-
---
|
|
342
|
-
|
|
343
|
-
## Best Practices
|
|
344
|
-
|
|
345
|
-
### 1. Use WebhookValidationService for New Implementations
|
|
346
|
-
|
|
347
|
-
```typescript
|
|
348
|
-
// ✅ RECOMMENDED - Works for all webhook types
|
|
349
|
-
const validator = new WebhookValidationService({}, logger);
|
|
350
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
**Why:**
|
|
354
|
-
- Flexible (works for both types)
|
|
355
|
-
- Consistent validation pattern
|
|
356
|
-
- No payload structure assumptions
|
|
357
|
-
|
|
358
|
-
### 2. Only Use FluentClient.validateWebhook() if You're Sure
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
// ⚠️ USE ONLY IF you know it's an Event webhook
|
|
362
|
-
if (payload.name && payload.id && payload.retailerId) {
|
|
363
|
-
const isValid = await client.validateWebhook(payload, sig, raw);
|
|
364
|
-
}
|
|
365
|
-
```
|
|
366
|
-
|
|
367
|
-
**Why:**
|
|
368
|
-
- Adds additional field validation
|
|
369
|
-
- Won't work for HTTP Call webhooks
|
|
370
|
-
|
|
371
|
-
### 3. Validate BEFORE Parsing
|
|
372
|
-
|
|
373
|
-
```typescript
|
|
374
|
-
// ✅ CORRECT
|
|
375
|
-
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
376
|
-
if (result.isValid) {
|
|
377
|
-
const payload = JSON.parse(rawBody);
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// ❌ WRONG (except when using FluentClient.validateWebhook)
|
|
381
|
-
const payload = JSON.parse(rawBody);
|
|
382
|
-
const result = await validator.validateWebhook(JSON.stringify(payload), headers, publicKey);
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
---
|
|
386
|
-
|
|
387
|
-
## Summary
|
|
388
|
-
|
|
389
|
-
| Aspect | Event Webhook | HTTP Call Webhook |
|
|
390
|
-
|--------|--------------|-------------------|
|
|
391
|
-
| **Trigger** | Automatic (Fluent events) | Manual (HTTP Call action) |
|
|
392
|
-
| **Payload** | Standard (name, id, retailerId) | Custom (user-defined) |
|
|
393
|
-
| **Validation Method** | Both methods work | WebhookValidationService only |
|
|
394
|
-
| **Signature Headers** | Both (fluent-signature, flex.signature) | Both (fluent-signature, flex.signature) |
|
|
395
|
-
| **Public Key** | Required (x509 base64) | Required (x509 base64) |
|
|
396
|
-
| **Use Case** | Event-driven integrations | Custom workflow integrations |
|
|
397
|
-
|
|
398
|
-
---
|
|
399
|
-
|
|
400
|
-
## Key Takeaways
|
|
401
|
-
|
|
402
|
-
1. **Two Types of Rubix Webhooks:**
|
|
403
|
-
- Event webhooks (standardized payload)
|
|
404
|
-
- HTTP Call webhooks (custom payload)
|
|
405
|
-
|
|
406
|
-
2. **WebhookValidationService:**
|
|
407
|
-
- ✅ Works for BOTH types
|
|
408
|
-
- ✅ Recommended for flexibility
|
|
409
|
-
- ✅ Consistent validation pattern
|
|
410
|
-
|
|
411
|
-
3. **FluentClient.validateWebhook():**
|
|
412
|
-
- ✅ Works for Event webhooks only
|
|
413
|
-
- ❌ Fails for HTTP Call webhooks
|
|
414
|
-
- ⚠️ Use only if you know webhook type
|
|
415
|
-
|
|
416
|
-
4. **Signature Validation:**
|
|
417
|
-
- Both types send both signatures (fluent-signature, flex.signature)
|
|
418
|
-
- Same public key used for both types
|
|
419
|
-
- SDK auto-detects algorithm (SHA512 → MD5)
|
|
420
|
-
|
|
421
|
-
5. **Identification:**
|
|
422
|
-
- Check for `name`, `id`, `retailerId` fields
|
|
423
|
-
- Event webhooks have all three
|
|
424
|
-
- HTTP Call webhooks have custom structure
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## Related Documentation
|
|
429
|
-
|
|
430
|
-
- [Module 2: Quick Start](./webhook-validation-02-quick-start.md) - Basic webhook validation
|
|
431
|
-
- [Module 8: Rubix Webhooks](./webhook-validation-08-rubix-webhooks.md) - HTTP Call webhook patterns
|
|
432
|
-
- [Rubix Webhook Template](../../../01-TEMPLATES/versori/workflows/rubix-webhooks/template-fluent-rubix-webhook-pattern.md) - Production example
|
|
1
|
+
# Module 9: Rubix Event Webhooks vs HTTP Call Webhooks
|
|
2
|
+
|
|
3
|
+
**Level:** Intermediate
|
|
4
|
+
**Estimated Time:** 15 minutes
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This module clarifies the **TWO types of webhooks** that can come from Fluent Commerce Rubix workflows and which validation method to use for each.
|
|
9
|
+
|
|
10
|
+
**CRITICAL DISTINCTION**: Rubix workflows can send webhooks in two different ways, with different payload structures and validation requirements.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Two Types of Rubix Webhooks
|
|
15
|
+
|
|
16
|
+
### 1. Fluent Commerce Event Webhooks
|
|
17
|
+
|
|
18
|
+
**Trigger:** Rubix workflow event system (automatic event firing)
|
|
19
|
+
|
|
20
|
+
**Payload Structure:** Standardized Fluent Commerce event format
|
|
21
|
+
|
|
22
|
+
**Example:**
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"id": "2a43a5d2-0c8f-484d-a0cf-c5353d040997",
|
|
26
|
+
"name": "order_webhook_status",
|
|
27
|
+
"accountId": "SAGIRISH",
|
|
28
|
+
"retailerId": "2",
|
|
29
|
+
"entityId": "6469",
|
|
30
|
+
"entityRef": "HD_G_FROM_POSTMAN_WEBHOOK_TEST",
|
|
31
|
+
"entityType": "ORDER",
|
|
32
|
+
"entitySubtype": "HD",
|
|
33
|
+
"entityStatus": "RECEIVED",
|
|
34
|
+
"type": "NORMAL",
|
|
35
|
+
"attributes": { ... },
|
|
36
|
+
"meta": { ... }
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Key Fields:**
|
|
41
|
+
- ✓ `name` - Event name (e.g., "order_webhook_status")
|
|
42
|
+
- ✓ `id` - Event ID (UUID)
|
|
43
|
+
- ✓ `retailerId` - Retailer ID
|
|
44
|
+
|
|
45
|
+
**Headers:**
|
|
46
|
+
```
|
|
47
|
+
fluent-signature: C5W1vJHfJm44pejcN4C/Pch+mb62s8SjgTsmLIHzTLWh0Ew4d5No...
|
|
48
|
+
flex.signature: V1YNn0KexNIjmLzAdcum2jNi8CX2ar1HN/ZiCrta7A7vDIl/8FY4...
|
|
49
|
+
content-type: application/json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 2. Rubix HTTP Call Webhooks
|
|
55
|
+
|
|
56
|
+
**Trigger:** Manual HTTP Call action in Rubix workflow
|
|
57
|
+
|
|
58
|
+
**Payload Structure:** Custom (user-defined in Rubix)
|
|
59
|
+
|
|
60
|
+
**Example:**
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"entityId": "order-123",
|
|
64
|
+
"entityRef": "ORD-001",
|
|
65
|
+
"entityType": "order",
|
|
66
|
+
"triggerSource": "ORDER_FULFILLMENT",
|
|
67
|
+
"retailerId": "1",
|
|
68
|
+
"timestamp": "2025-11-07T12:34:56.789Z"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Key Fields:**
|
|
73
|
+
- ✗ NO `name` field
|
|
74
|
+
- ✗ NO `id` field (usually has `entityId` instead)
|
|
75
|
+
- ✓ `retailerId` (if you include it)
|
|
76
|
+
|
|
77
|
+
**Headers:** Same as Event webhooks
|
|
78
|
+
```
|
|
79
|
+
fluent-signature: ...
|
|
80
|
+
flex.signature: ...
|
|
81
|
+
content-type: application/json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Which Validation Method to Use?
|
|
87
|
+
|
|
88
|
+
### Option 1: WebhookValidationService (Works for BOTH)
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import { WebhookValidationService } from '@fluentcommerce/fc-connect-sdk';
|
|
92
|
+
|
|
93
|
+
// ✅ Works for Event webhooks
|
|
94
|
+
// ✅ Works for HTTP Call webhooks
|
|
95
|
+
// ✅ Recommended for flexibility
|
|
96
|
+
// ✅ Versori log can be passed directly (no wrapper needed)
|
|
97
|
+
|
|
98
|
+
const validator = new WebhookValidationService({ strictValidation: true }, log);
|
|
99
|
+
|
|
100
|
+
const result = await validator.validateWebhook(
|
|
101
|
+
rawBodyString, // Raw payload
|
|
102
|
+
headers, // Headers
|
|
103
|
+
publicKey // Public key
|
|
104
|
+
);
|
|
105
|
+
|
|
106
|
+
if (!result.isValid) {
|
|
107
|
+
return { status: 401, body: { error: 'Invalid signature' } };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Parse payload AFTER validation
|
|
111
|
+
const payload = JSON.parse(rawBodyString);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Use when:**
|
|
115
|
+
- Building flexible webhook handlers that accept both types
|
|
116
|
+
- Using Rubix HTTP Call action with custom payloads
|
|
117
|
+
- You want one consistent pattern for all webhooks
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
### Option 2: FluentClient.validateWebhook() (Event Webhooks Only)
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
125
|
+
|
|
126
|
+
// ✅ Works for Event webhooks (has name, id, retailerId)
|
|
127
|
+
// ❌ FAILS for HTTP Call webhooks (missing required fields)
|
|
128
|
+
|
|
129
|
+
const client = await createClient({ ...ctx, log, connections });
|
|
130
|
+
|
|
131
|
+
const payload = JSON.parse(rawBodyString); // Parse first
|
|
132
|
+
|
|
133
|
+
const isValid = await client.validateWebhook(
|
|
134
|
+
payload, // FluentWebhookPayload object
|
|
135
|
+
signature, // Signature string
|
|
136
|
+
rawBodyString // Raw payload string
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
if (!isValid) {
|
|
140
|
+
return { status: 401, body: { error: 'Invalid signature' } };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Process validated payload
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Use when:**
|
|
147
|
+
- You KNOW you're receiving Event webhooks only
|
|
148
|
+
- Payload has `name`, `id`, and `retailerId` fields
|
|
149
|
+
- You want additional field validation
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Decision Matrix
|
|
154
|
+
|
|
155
|
+
| Webhook Type | Has `name`, `id`, `retailerId`? | Use WebhookValidationService | Use FluentClient.validateWebhook |
|
|
156
|
+
|--------------|--------------------------------|------------------------------|----------------------------------|
|
|
157
|
+
| **Event Webhook** | ✓ Yes | ✅ Recommended | ✅ Acceptable |
|
|
158
|
+
| **HTTP Call Webhook** | ✗ No | ✅ Required | ❌ Will fail |
|
|
159
|
+
| **Mixed (Both Types)** | ⚠️ Varies | ✅ Use this | ❌ Won't work for all |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Real-World Example Analysis
|
|
164
|
+
|
|
165
|
+
### Your Webhook Sample (Event Webhook)
|
|
166
|
+
|
|
167
|
+
```json
|
|
168
|
+
{
|
|
169
|
+
"id": "2a43a5d2-0c8f-484d-a0cf-c5353d040997", // ✓ Has id
|
|
170
|
+
"name": "order_webhook_status", // ✓ Has name
|
|
171
|
+
"retailerId": "2", // ✓ Has retailerId
|
|
172
|
+
"entityId": "6469",
|
|
173
|
+
"entityRef": "HD_G_FROM_POSTMAN_WEBHOOK_TEST"
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Analysis:**
|
|
178
|
+
- This is a **Fluent Commerce Event webhook**
|
|
179
|
+
- Has all required fields: `name`, `id`, `retailerId`
|
|
180
|
+
- Can use EITHER validation method
|
|
181
|
+
- Sent automatically by Rubix event system
|
|
182
|
+
|
|
183
|
+
**Headers:**
|
|
184
|
+
```
|
|
185
|
+
fluent-signature: C5W1vJHfJm44pejcN4C/Pch+mb62s8SjgTsmLIHzTLWh0Ew4d5No...
|
|
186
|
+
flex.signature: V1YNn0KexNIjmLzAdcum2jNi8CX2ar1HN/ZiCrta7A7vDIl/8FY4...
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Both signatures present (as documented).
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Implementation Examples
|
|
194
|
+
|
|
195
|
+
### Pattern 1: WebhookValidationService (Flexible)
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
import { webhook, http } from '@versori/run';
|
|
199
|
+
import {
|
|
200
|
+
createClient,
|
|
201
|
+
WebhookValidationService,
|
|
202
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
203
|
+
|
|
204
|
+
export const flexibleWebhook = webhook('flexible-webhook', {
|
|
205
|
+
response: { mode: 'sync' },
|
|
206
|
+
}).then(
|
|
207
|
+
http('handler', { connection: 'fluent_commerce' }, async ctx => {
|
|
208
|
+
const { log, activation, connections } = ctx;
|
|
209
|
+
|
|
210
|
+
// Get configuration
|
|
211
|
+
const publicKey = activation.getVariable('fluentPublicKey');
|
|
212
|
+
const rawBody = activation.body || JSON.stringify(ctx.data);
|
|
213
|
+
const headers = activation.headers || {};
|
|
214
|
+
|
|
215
|
+
// Validate with WebhookValidationService (works for both types)
|
|
216
|
+
// Versori log can be passed directly (no wrapper needed)
|
|
217
|
+
const validator = new WebhookValidationService({ strictValidation: true }, log);
|
|
218
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
219
|
+
|
|
220
|
+
if (!result.isValid) {
|
|
221
|
+
log.error('Invalid signature', { error: result.error });
|
|
222
|
+
return { status: 401, body: { error: result.error } };
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
log.info('✅ Signature validated', { algorithm: result.algorithm });
|
|
226
|
+
|
|
227
|
+
// Parse payload
|
|
228
|
+
const payload = JSON.parse(rawBody);
|
|
229
|
+
|
|
230
|
+
// Determine webhook type
|
|
231
|
+
if (payload.name && payload.id && payload.retailerId) {
|
|
232
|
+
log.info('Processing Event webhook', { eventName: payload.name });
|
|
233
|
+
// Handle Event webhook
|
|
234
|
+
return await processEventWebhook(payload, ctx);
|
|
235
|
+
} else if (payload.entityId || payload.entityRef) {
|
|
236
|
+
log.info('Processing HTTP Call webhook', { entityRef: payload.entityRef });
|
|
237
|
+
// Handle HTTP Call webhook
|
|
238
|
+
return await processHttpCallWebhook(payload, ctx);
|
|
239
|
+
} else {
|
|
240
|
+
log.error('Unknown webhook type', { payloadKeys: Object.keys(payload) });
|
|
241
|
+
return { status: 400, body: { error: 'Unknown webhook type' } };
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
async function processEventWebhook(payload: any, ctx: any) {
|
|
247
|
+
// Process Event webhook with standard fields
|
|
248
|
+
return { status: 200, body: { success: true, type: 'event' } };
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async function processHttpCallWebhook(payload: any, ctx: any) {
|
|
252
|
+
// Process HTTP Call webhook with custom fields
|
|
253
|
+
return { status: 200, body: { success: true, type: 'http_call' } };
|
|
254
|
+
}
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
### Pattern 2: FluentClient.validateWebhook() (Event Webhooks Only)
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
import { webhook, http } from '@versori/run';
|
|
263
|
+
import { createClient } from '@fluentcommerce/fc-connect-sdk';
|
|
264
|
+
|
|
265
|
+
export const eventWebhook = webhook('event-webhook', {
|
|
266
|
+
response: { mode: 'sync' },
|
|
267
|
+
}).then(
|
|
268
|
+
http('handler', { connection: 'fluent_commerce' }, async ctx => {
|
|
269
|
+
const { log, activation, connections } = ctx;
|
|
270
|
+
|
|
271
|
+
// Get raw body
|
|
272
|
+
const rawBody = activation.body || JSON.stringify(ctx.data);
|
|
273
|
+
const headers = activation.headers || {};
|
|
274
|
+
|
|
275
|
+
// Parse payload first
|
|
276
|
+
const payload = JSON.parse(rawBody);
|
|
277
|
+
|
|
278
|
+
// Verify this is an Event webhook
|
|
279
|
+
if (!payload.name || !payload.id || !payload.retailerId) {
|
|
280
|
+
log.error('Not an Event webhook', { payloadKeys: Object.keys(payload) });
|
|
281
|
+
return { status: 400, body: { error: 'Expected Event webhook with name, id, retailerId' } };
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Get signature
|
|
285
|
+
const signature = headers['fluent-signature'] || headers['flex.signature'];
|
|
286
|
+
|
|
287
|
+
// Create Fluent client
|
|
288
|
+
const client = await createClient({ ...ctx, log, connections });
|
|
289
|
+
|
|
290
|
+
// Validate using FluentClient (Event webhooks only)
|
|
291
|
+
const isValid = await client.validateWebhook(payload, signature, rawBody);
|
|
292
|
+
|
|
293
|
+
if (!isValid) {
|
|
294
|
+
log.error('Invalid Event webhook signature');
|
|
295
|
+
return { status: 401, body: { error: 'Invalid signature' } };
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
log.info('✅ Event webhook validated', { eventName: payload.name });
|
|
299
|
+
|
|
300
|
+
// Process Event webhook
|
|
301
|
+
return { status: 200, body: { success: true, eventId: payload.id } };
|
|
302
|
+
})
|
|
303
|
+
);
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## How to Identify Webhook Type
|
|
309
|
+
|
|
310
|
+
### Method 1: Check Payload Structure
|
|
311
|
+
|
|
312
|
+
```typescript
|
|
313
|
+
const payload = JSON.parse(rawBody);
|
|
314
|
+
|
|
315
|
+
if (payload.name && payload.id && payload.retailerId) {
|
|
316
|
+
// This is an Event webhook
|
|
317
|
+
console.log('Type: Event webhook');
|
|
318
|
+
console.log('Event name:', payload.name);
|
|
319
|
+
} else if (payload.entityId || payload.entityRef) {
|
|
320
|
+
// This is an HTTP Call webhook
|
|
321
|
+
console.log('Type: HTTP Call webhook');
|
|
322
|
+
console.log('Entity ref:', payload.entityRef);
|
|
323
|
+
} else {
|
|
324
|
+
// Unknown type
|
|
325
|
+
console.warn('Unknown webhook type');
|
|
326
|
+
}
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Method 2: Check Rubix Configuration
|
|
330
|
+
|
|
331
|
+
**Event Webhooks:**
|
|
332
|
+
- Configured in: Fluent Commerce dashboard → Events → Webhook subscriptions
|
|
333
|
+
- Trigger: Automatic (when events fire)
|
|
334
|
+
- Payload: Standard Fluent event format
|
|
335
|
+
|
|
336
|
+
**HTTP Call Webhooks:**
|
|
337
|
+
- Configured in: Rubix workflow → Add HTTP Call action
|
|
338
|
+
- Trigger: Manual (you configure when to send)
|
|
339
|
+
- Payload: Custom (you define the JSON structure)
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Best Practices
|
|
344
|
+
|
|
345
|
+
### 1. Use WebhookValidationService for New Implementations
|
|
346
|
+
|
|
347
|
+
```typescript
|
|
348
|
+
// ✅ RECOMMENDED - Works for all webhook types
|
|
349
|
+
const validator = new WebhookValidationService({}, logger);
|
|
350
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**Why:**
|
|
354
|
+
- Flexible (works for both types)
|
|
355
|
+
- Consistent validation pattern
|
|
356
|
+
- No payload structure assumptions
|
|
357
|
+
|
|
358
|
+
### 2. Only Use FluentClient.validateWebhook() if You're Sure
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// ⚠️ USE ONLY IF you know it's an Event webhook
|
|
362
|
+
if (payload.name && payload.id && payload.retailerId) {
|
|
363
|
+
const isValid = await client.validateWebhook(payload, sig, raw);
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
**Why:**
|
|
368
|
+
- Adds additional field validation
|
|
369
|
+
- Won't work for HTTP Call webhooks
|
|
370
|
+
|
|
371
|
+
### 3. Validate BEFORE Parsing
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
// ✅ CORRECT
|
|
375
|
+
const result = await validator.validateWebhook(rawBody, headers, publicKey);
|
|
376
|
+
if (result.isValid) {
|
|
377
|
+
const payload = JSON.parse(rawBody);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
// ❌ WRONG (except when using FluentClient.validateWebhook)
|
|
381
|
+
const payload = JSON.parse(rawBody);
|
|
382
|
+
const result = await validator.validateWebhook(JSON.stringify(payload), headers, publicKey);
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## Summary
|
|
388
|
+
|
|
389
|
+
| Aspect | Event Webhook | HTTP Call Webhook |
|
|
390
|
+
|--------|--------------|-------------------|
|
|
391
|
+
| **Trigger** | Automatic (Fluent events) | Manual (HTTP Call action) |
|
|
392
|
+
| **Payload** | Standard (name, id, retailerId) | Custom (user-defined) |
|
|
393
|
+
| **Validation Method** | Both methods work | WebhookValidationService only |
|
|
394
|
+
| **Signature Headers** | Both (fluent-signature, flex.signature) | Both (fluent-signature, flex.signature) |
|
|
395
|
+
| **Public Key** | Required (x509 base64) | Required (x509 base64) |
|
|
396
|
+
| **Use Case** | Event-driven integrations | Custom workflow integrations |
|
|
397
|
+
|
|
398
|
+
---
|
|
399
|
+
|
|
400
|
+
## Key Takeaways
|
|
401
|
+
|
|
402
|
+
1. **Two Types of Rubix Webhooks:**
|
|
403
|
+
- Event webhooks (standardized payload)
|
|
404
|
+
- HTTP Call webhooks (custom payload)
|
|
405
|
+
|
|
406
|
+
2. **WebhookValidationService:**
|
|
407
|
+
- ✅ Works for BOTH types
|
|
408
|
+
- ✅ Recommended for flexibility
|
|
409
|
+
- ✅ Consistent validation pattern
|
|
410
|
+
|
|
411
|
+
3. **FluentClient.validateWebhook():**
|
|
412
|
+
- ✅ Works for Event webhooks only
|
|
413
|
+
- ❌ Fails for HTTP Call webhooks
|
|
414
|
+
- ⚠️ Use only if you know webhook type
|
|
415
|
+
|
|
416
|
+
4. **Signature Validation:**
|
|
417
|
+
- Both types send both signatures (fluent-signature, flex.signature)
|
|
418
|
+
- Same public key used for both types
|
|
419
|
+
- SDK auto-detects algorithm (SHA512 → MD5)
|
|
420
|
+
|
|
421
|
+
5. **Identification:**
|
|
422
|
+
- Check for `name`, `id`, `retailerId` fields
|
|
423
|
+
- Event webhooks have all three
|
|
424
|
+
- HTTP Call webhooks have custom structure
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## Related Documentation
|
|
429
|
+
|
|
430
|
+
- [Module 2: Quick Start](./webhook-validation-02-quick-start.md) - Basic webhook validation
|
|
431
|
+
- [Module 8: Rubix Webhooks](./webhook-validation-08-rubix-webhooks.md) - HTTP Call webhook patterns
|
|
432
|
+
- [Rubix Webhook Template](../../../01-TEMPLATES/versori/workflows/rubix-webhooks/template-fluent-rubix-webhook-pattern.md) - Production example
|