@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,501 +1,501 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Event-Driven Ingestion Example
|
|
3
|
-
*
|
|
4
|
-
* Demonstrates event-driven inventory ingestion using webhooks and Fluent events.
|
|
5
|
-
* Supports both Versori platform webhooks and standalone webhook handlers.
|
|
6
|
-
*
|
|
7
|
-
* Use Cases:
|
|
8
|
-
* - Real-time inventory updates from WMS
|
|
9
|
-
* - Webhook-triggered ingestion from external systems
|
|
10
|
-
* - Event-based inventory adjustments
|
|
11
|
-
* - Fluent event processing for downstream systems
|
|
12
|
-
*
|
|
13
|
-
* Prerequisites:
|
|
14
|
-
* - npm install @fluentcommerce/fc-connect-sdk
|
|
15
|
-
* - Configure webhook endpoint (Versori or standalone)
|
|
16
|
-
*
|
|
17
|
-
* Usage:
|
|
18
|
-
* npx tsx examples/event-driven.ts
|
|
19
|
-
*/
|
|
20
|
-
|
|
21
|
-
import {
|
|
22
|
-
createClient,
|
|
23
|
-
UniversalMapper,
|
|
24
|
-
StateService,
|
|
25
|
-
SimpleKVStore,
|
|
26
|
-
FluentClient,
|
|
27
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
28
|
-
|
|
29
|
-
// ============================================================================
|
|
30
|
-
// Configuration
|
|
31
|
-
// ============================================================================
|
|
32
|
-
|
|
33
|
-
const config = {
|
|
34
|
-
fluent: {
|
|
35
|
-
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
36
|
-
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
37
|
-
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
38
|
-
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
39
|
-
},
|
|
40
|
-
webhook: {
|
|
41
|
-
port: parseInt(process.env.WEBHOOK_PORT || '3000'),
|
|
42
|
-
path: '/webhook/inventory',
|
|
43
|
-
secret: process.env.WEBHOOK_SECRET || 'your-webhook-secret',
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
// Field mapping for inventory updates
|
|
48
|
-
const mappingConfig = {
|
|
49
|
-
fields: {
|
|
50
|
-
ref: {
|
|
51
|
-
source: 'sku',
|
|
52
|
-
required: true,
|
|
53
|
-
comment: 'Inventory position reference',
|
|
54
|
-
},
|
|
55
|
-
productRef: {
|
|
56
|
-
source: 'sku',
|
|
57
|
-
required: true,
|
|
58
|
-
comment: 'Product SKU reference',
|
|
59
|
-
},
|
|
60
|
-
locationRef: {
|
|
61
|
-
source: 'location',
|
|
62
|
-
required: true,
|
|
63
|
-
comment: 'Warehouse location code',
|
|
64
|
-
},
|
|
65
|
-
qty: {
|
|
66
|
-
source: 'quantity',
|
|
67
|
-
resolver: 'sdk.parseInt',
|
|
68
|
-
required: true,
|
|
69
|
-
comment: 'Available quantity',
|
|
70
|
-
},
|
|
71
|
-
status: {
|
|
72
|
-
source: 'status',
|
|
73
|
-
resolver: 'sdk.uppercase',
|
|
74
|
-
defaultValue: 'AVAILABLE',
|
|
75
|
-
comment: 'Inventory status',
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
// ============================================================================
|
|
81
|
-
// Event Handler Functions
|
|
82
|
-
// ============================================================================
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Process webhook payload for inventory update
|
|
86
|
-
*/
|
|
87
|
-
async function handleInventoryWebhook(payload: any): Promise<{
|
|
88
|
-
success: boolean;
|
|
89
|
-
jobId?: string;
|
|
90
|
-
records?: number;
|
|
91
|
-
errors?: string[];
|
|
92
|
-
}> {
|
|
93
|
-
console.log('๐ฅ Received inventory webhook event');
|
|
94
|
-
|
|
95
|
-
try {
|
|
96
|
-
// Initialize services
|
|
97
|
-
const client = await createClient({ config: config.fluent });
|
|
98
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
99
|
-
const state = new StateService(new SimpleKVStore());
|
|
100
|
-
|
|
101
|
-
// Extract inventory data from payload
|
|
102
|
-
const inventoryData = extractInventoryData(payload);
|
|
103
|
-
|
|
104
|
-
if (!inventoryData || inventoryData.length === 0) {
|
|
105
|
-
return {
|
|
106
|
-
success: false,
|
|
107
|
-
errors: ['No inventory data found in webhook payload'],
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
console.log(` Processing ${inventoryData.length} inventory records`);
|
|
112
|
-
|
|
113
|
-
// Generate unique event ID for deduplication
|
|
114
|
-
const eventId = generateEventId(payload);
|
|
115
|
-
|
|
116
|
-
// Check if event already processed
|
|
117
|
-
if (await state.isFileProcessed(eventId)) {
|
|
118
|
-
console.log(' โญ Event already processed (duplicate webhook)');
|
|
119
|
-
return {
|
|
120
|
-
success: true,
|
|
121
|
-
records: 0,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Acquire lock to prevent concurrent processing
|
|
126
|
-
const lock = await state.acquireLock(eventId, 30000); // 30s lock
|
|
127
|
-
|
|
128
|
-
if (!lock.acquired) {
|
|
129
|
-
console.log(' โธ Event locked by another process');
|
|
130
|
-
return {
|
|
131
|
-
success: false,
|
|
132
|
-
errors: ['Event is being processed by another worker'],
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
try {
|
|
137
|
-
// Transform data with UniversalMapper
|
|
138
|
-
const result = await mapper.map(inventoryData);
|
|
139
|
-
|
|
140
|
-
if (!result.success) {
|
|
141
|
-
console.error(' โ Mapping validation failed:', result.errors);
|
|
142
|
-
return {
|
|
143
|
-
success: false,
|
|
144
|
-
errors: result.errors,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
console.log(` โ Mapped ${result.data.length} valid records`);
|
|
149
|
-
|
|
150
|
-
// Create batch job
|
|
151
|
-
const job = await client.createJob({
|
|
152
|
-
name: `Webhook Import - ${eventId}`,
|
|
153
|
-
retailerId: config.fluent.retailerId,
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
console.log(` ๐ Created job: ${job.id}`);
|
|
157
|
-
|
|
158
|
-
// Send batch to Fluent Commerce
|
|
159
|
-
await client.sendBatch(job.id, {
|
|
160
|
-
action: 'UPSERT',
|
|
161
|
-
entityType: 'INVENTORY',
|
|
162
|
-
source: 'EVENT_DRIVEN_WEBHOOK',
|
|
163
|
-
event: 'INVENTORY_UPDATE',
|
|
164
|
-
entities: result.data,
|
|
165
|
-
});
|
|
166
|
-
|
|
167
|
-
// Mark event as processed
|
|
168
|
-
await state.markFileProcessed(eventId, {
|
|
169
|
-
jobId: job.id,
|
|
170
|
-
records: result.data.length,
|
|
171
|
-
processedAt: new Date().toISOString(),
|
|
172
|
-
eventType: payload.eventType || 'inventory.update',
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
console.log(` โ
Successfully ingested ${result.data.length} records`);
|
|
176
|
-
|
|
177
|
-
return {
|
|
178
|
-
success: true,
|
|
179
|
-
jobId: job.id,
|
|
180
|
-
records: result.data.length,
|
|
181
|
-
};
|
|
182
|
-
} finally {
|
|
183
|
-
// Always release lock
|
|
184
|
-
await state.releaseLock(eventId);
|
|
185
|
-
}
|
|
186
|
-
} catch (error: any) {
|
|
187
|
-
console.error(' โ Webhook processing failed:', error.message);
|
|
188
|
-
return {
|
|
189
|
-
success: false,
|
|
190
|
-
errors: [error.message],
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* Process Fluent event for downstream systems
|
|
197
|
-
*/
|
|
198
|
-
async function handleFluentEvent(event: any): Promise<void> {
|
|
199
|
-
console.log('๐ฃ Received Fluent event:', event.type);
|
|
200
|
-
|
|
201
|
-
// Example: React to inventory position changes
|
|
202
|
-
if (event.type === 'INVENTORY_UPDATED' || event.type === 'INVENTORY_POSITION_UPDATED') {
|
|
203
|
-
const { ref, qty, locationRef } = event.data;
|
|
204
|
-
|
|
205
|
-
console.log(` Inventory updated: ${ref} at ${locationRef} โ ${qty} units`);
|
|
206
|
-
|
|
207
|
-
// Example: Trigger downstream actions
|
|
208
|
-
if (qty < 10) {
|
|
209
|
-
console.log(` โ Low stock alert for ${ref}`);
|
|
210
|
-
// Send alert to external system
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
if (qty === 0) {
|
|
214
|
-
console.log(` ๐ซ Out of stock for ${ref}`);
|
|
215
|
-
// Notify e-commerce platform
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// Example: React to batch job completion
|
|
220
|
-
if (event.type === 'BATCH_JOB_COMPLETED') {
|
|
221
|
-
const { jobId, status, recordsProcessed } = event.data;
|
|
222
|
-
|
|
223
|
-
console.log(` Batch job ${jobId} completed: ${status}`);
|
|
224
|
-
console.log(` Records processed: ${recordsProcessed}`);
|
|
225
|
-
|
|
226
|
-
// Update external monitoring system
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Extract inventory data from webhook payload
|
|
232
|
-
*/
|
|
233
|
-
function extractInventoryData(payload: any): any[] {
|
|
234
|
-
// Handle different payload formats
|
|
235
|
-
|
|
236
|
-
// Format 1: Direct array
|
|
237
|
-
if (Array.isArray(payload)) {
|
|
238
|
-
return payload;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// Format 2: Nested in 'data' field
|
|
242
|
-
if (payload.data && Array.isArray(payload.data)) {
|
|
243
|
-
return payload.data;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
// Format 3: Single inventory update
|
|
247
|
-
if (payload.inventory) {
|
|
248
|
-
return Array.isArray(payload.inventory) ? payload.inventory : [payload.inventory];
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// Format 4: WMS event structure
|
|
252
|
-
if (payload.eventType === 'inventory.updated' && payload.items) {
|
|
253
|
-
return payload.items;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
return [];
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* Generate unique event ID for deduplication
|
|
261
|
-
*/
|
|
262
|
-
function generateEventId(payload: any): string {
|
|
263
|
-
// Use webhook event ID if provided
|
|
264
|
-
if (payload.eventId) {
|
|
265
|
-
return `webhook-${payload.eventId}`;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Use timestamp + hash for custom events
|
|
269
|
-
const timestamp = payload.timestamp || new Date().toISOString();
|
|
270
|
-
const hash = hashPayload(payload);
|
|
271
|
-
|
|
272
|
-
return `webhook-${timestamp}-${hash}`;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* Simple hash function for payload deduplication
|
|
277
|
-
*/
|
|
278
|
-
function hashPayload(payload: any): string {
|
|
279
|
-
const str = JSON.stringify(payload);
|
|
280
|
-
let hash = 0;
|
|
281
|
-
|
|
282
|
-
for (let i = 0; i < str.length; i++) {
|
|
283
|
-
const char = str.charCodeAt(i);
|
|
284
|
-
hash = (hash << 5) - hash + char;
|
|
285
|
-
hash = hash & hash; // Convert to 32-bit integer
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
return Math.abs(hash).toString(36);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
// ============================================================================
|
|
292
|
-
// Standalone Webhook Server (Express Example)
|
|
293
|
-
// ============================================================================
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Standalone webhook server for non-Versori deployments
|
|
297
|
-
*/
|
|
298
|
-
async function startWebhookServer() {
|
|
299
|
-
// Note: This requires 'express' package
|
|
300
|
-
// npm install express
|
|
301
|
-
|
|
302
|
-
const express = require('express');
|
|
303
|
-
const app = express();
|
|
304
|
-
|
|
305
|
-
app.use(express.json());
|
|
306
|
-
|
|
307
|
-
// Webhook endpoint
|
|
308
|
-
app.post(config.webhook.path, async (req: any, res: any) => {
|
|
309
|
-
const startTime = Date.now();
|
|
310
|
-
|
|
311
|
-
// Verify webhook signature (optional but recommended)
|
|
312
|
-
const signature = req.headers['x-webhook-signature'];
|
|
313
|
-
if (!verifyWebhookSignature(req.body, signature)) {
|
|
314
|
-
return res.status(401).json({
|
|
315
|
-
success: false,
|
|
316
|
-
error: 'Invalid webhook signature',
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Process webhook
|
|
321
|
-
const result = await handleInventoryWebhook(req.body);
|
|
322
|
-
|
|
323
|
-
const duration = Date.now() - startTime;
|
|
324
|
-
|
|
325
|
-
if (result.success) {
|
|
326
|
-
res.status(200).json({
|
|
327
|
-
success: true,
|
|
328
|
-
jobId: result.jobId,
|
|
329
|
-
records: result.records,
|
|
330
|
-
processingTime: `${duration}ms`,
|
|
331
|
-
});
|
|
332
|
-
} else {
|
|
333
|
-
res.status(400).json({
|
|
334
|
-
success: false,
|
|
335
|
-
errors: result.errors,
|
|
336
|
-
processingTime: `${duration}ms`,
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
// Health check endpoint
|
|
342
|
-
app.get('/health', (req: any, res: any) => {
|
|
343
|
-
res.status(200).json({
|
|
344
|
-
status: 'healthy',
|
|
345
|
-
timestamp: new Date().toISOString(),
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
// Start server
|
|
350
|
-
app.listen(config.webhook.port, () => {
|
|
351
|
-
console.log(`๐ Webhook server listening on port ${config.webhook.port}`);
|
|
352
|
-
console.log(
|
|
353
|
-
`๐ Webhook endpoint: http://localhost:${config.webhook.port}${config.webhook.path}`
|
|
354
|
-
);
|
|
355
|
-
console.log(`๐ Health check: http://localhost:${config.webhook.port}/health`);
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Verify webhook signature (HMAC SHA256)
|
|
361
|
-
*/
|
|
362
|
-
function verifyWebhookSignature(payload: any, signature?: string): boolean {
|
|
363
|
-
if (!signature) return false;
|
|
364
|
-
|
|
365
|
-
const crypto = require('crypto');
|
|
366
|
-
|
|
367
|
-
const expectedSignature = crypto
|
|
368
|
-
.createHmac('sha256', config.webhook.secret)
|
|
369
|
-
.update(JSON.stringify(payload))
|
|
370
|
-
.digest('hex');
|
|
371
|
-
|
|
372
|
-
return signature === expectedSignature;
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// ============================================================================
|
|
376
|
-
// Versori Platform Integration
|
|
377
|
-
// ============================================================================
|
|
378
|
-
|
|
379
|
-
/**
|
|
380
|
-
* Versori webhook handler
|
|
381
|
-
*
|
|
382
|
-
* Deploy this to Versori platform:
|
|
383
|
-
*
|
|
384
|
-
* import { webhook } from '@versori/run';
|
|
385
|
-
*
|
|
386
|
-
* export const inventoryWebhook = webhook('inventory-update', async ({ data }) => {
|
|
387
|
-
* const result = await handleInventoryWebhook(data);
|
|
388
|
-
* return result;
|
|
389
|
-
* });
|
|
390
|
-
*/
|
|
391
|
-
|
|
392
|
-
// ============================================================================
|
|
393
|
-
// Test Utilities
|
|
394
|
-
// ============================================================================
|
|
395
|
-
|
|
396
|
-
/**
|
|
397
|
-
* Simulate webhook event for testing
|
|
398
|
-
*/
|
|
399
|
-
async function testWebhookEvent() {
|
|
400
|
-
console.log('๐งช Testing webhook event handler\n');
|
|
401
|
-
|
|
402
|
-
const testPayload = {
|
|
403
|
-
eventId: 'test-event-001',
|
|
404
|
-
eventType: 'inventory.updated',
|
|
405
|
-
timestamp: new Date().toISOString(),
|
|
406
|
-
items: [
|
|
407
|
-
{
|
|
408
|
-
sku: 'SKU-001',
|
|
409
|
-
location: 'WH-001',
|
|
410
|
-
quantity: '150',
|
|
411
|
-
status: 'available',
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
sku: 'SKU-002',
|
|
415
|
-
location: 'WH-001',
|
|
416
|
-
quantity: '75',
|
|
417
|
-
status: 'available',
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
sku: 'SKU-003',
|
|
421
|
-
location: 'WH-002',
|
|
422
|
-
quantity: '200',
|
|
423
|
-
status: 'available',
|
|
424
|
-
},
|
|
425
|
-
],
|
|
426
|
-
};
|
|
427
|
-
|
|
428
|
-
const result = await handleInventoryWebhook(testPayload);
|
|
429
|
-
|
|
430
|
-
console.log('\n๐ Test Results:');
|
|
431
|
-
console.log(' Success:', result.success);
|
|
432
|
-
console.log(' Job ID:', result.jobId);
|
|
433
|
-
console.log(' Records:', result.records);
|
|
434
|
-
|
|
435
|
-
if (result.errors) {
|
|
436
|
-
console.log(' Errors:', result.errors);
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
/**
|
|
441
|
-
* Simulate Fluent event for testing
|
|
442
|
-
*/
|
|
443
|
-
async function testFluentEvent() {
|
|
444
|
-
console.log('\n๐งช Testing Fluent event handler\n');
|
|
445
|
-
|
|
446
|
-
const testEvent = {
|
|
447
|
-
type: 'INVENTORY_POSITION_UPDATED',
|
|
448
|
-
timestamp: new Date().toISOString(),
|
|
449
|
-
data: {
|
|
450
|
-
ref: 'SKU-001',
|
|
451
|
-
locationRef: 'WH-001',
|
|
452
|
-
qty: 5,
|
|
453
|
-
previousQty: 150,
|
|
454
|
-
},
|
|
455
|
-
};
|
|
456
|
-
|
|
457
|
-
await handleFluentEvent(testEvent);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
// ============================================================================
|
|
461
|
-
// Main Entry Point
|
|
462
|
-
// ============================================================================
|
|
463
|
-
|
|
464
|
-
async function main() {
|
|
465
|
-
const mode = process.argv[2] || 'test';
|
|
466
|
-
|
|
467
|
-
switch (mode) {
|
|
468
|
-
case 'server':
|
|
469
|
-
// Start webhook server
|
|
470
|
-
await startWebhookServer();
|
|
471
|
-
break;
|
|
472
|
-
|
|
473
|
-
case 'test':
|
|
474
|
-
// Run tests
|
|
475
|
-
await testWebhookEvent();
|
|
476
|
-
await testFluentEvent();
|
|
477
|
-
break;
|
|
478
|
-
|
|
479
|
-
default:
|
|
480
|
-
console.log('Usage:');
|
|
481
|
-
console.log(' npx tsx examples/event-driven.ts test # Test webhook handlers');
|
|
482
|
-
console.log(' npx tsx examples/event-driven.ts server # Start webhook server');
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
// Run if executed directly
|
|
487
|
-
if (require.main === module) {
|
|
488
|
-
main().catch(error => {
|
|
489
|
-
console.error('Fatal error:', error);
|
|
490
|
-
process.exit(1);
|
|
491
|
-
});
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// Export for use in other modules
|
|
495
|
-
export {
|
|
496
|
-
handleInventoryWebhook,
|
|
497
|
-
handleFluentEvent,
|
|
498
|
-
extractInventoryData,
|
|
499
|
-
generateEventId,
|
|
500
|
-
verifyWebhookSignature,
|
|
501
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Event-Driven Ingestion Example
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates event-driven inventory ingestion using webhooks and Fluent events.
|
|
5
|
+
* Supports both Versori platform webhooks and standalone webhook handlers.
|
|
6
|
+
*
|
|
7
|
+
* Use Cases:
|
|
8
|
+
* - Real-time inventory updates from WMS
|
|
9
|
+
* - Webhook-triggered ingestion from external systems
|
|
10
|
+
* - Event-based inventory adjustments
|
|
11
|
+
* - Fluent event processing for downstream systems
|
|
12
|
+
*
|
|
13
|
+
* Prerequisites:
|
|
14
|
+
* - npm install @fluentcommerce/fc-connect-sdk
|
|
15
|
+
* - Configure webhook endpoint (Versori or standalone)
|
|
16
|
+
*
|
|
17
|
+
* Usage:
|
|
18
|
+
* npx tsx examples/event-driven.ts
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import {
|
|
22
|
+
createClient,
|
|
23
|
+
UniversalMapper,
|
|
24
|
+
StateService,
|
|
25
|
+
SimpleKVStore,
|
|
26
|
+
FluentClient,
|
|
27
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
28
|
+
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Configuration
|
|
31
|
+
// ============================================================================
|
|
32
|
+
|
|
33
|
+
const config = {
|
|
34
|
+
fluent: {
|
|
35
|
+
baseUrl: process.env.FLUENT_BASE_URL!,
|
|
36
|
+
clientId: process.env.FLUENT_CLIENT_ID!,
|
|
37
|
+
clientSecret: process.env.FLUENT_CLIENT_SECRET!,
|
|
38
|
+
retailerId: process.env.FLUENT_RETAILER_ID!,
|
|
39
|
+
},
|
|
40
|
+
webhook: {
|
|
41
|
+
port: parseInt(process.env.WEBHOOK_PORT || '3000'),
|
|
42
|
+
path: '/webhook/inventory',
|
|
43
|
+
secret: process.env.WEBHOOK_SECRET || 'your-webhook-secret',
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// Field mapping for inventory updates
|
|
48
|
+
const mappingConfig = {
|
|
49
|
+
fields: {
|
|
50
|
+
ref: {
|
|
51
|
+
source: 'sku',
|
|
52
|
+
required: true,
|
|
53
|
+
comment: 'Inventory position reference',
|
|
54
|
+
},
|
|
55
|
+
productRef: {
|
|
56
|
+
source: 'sku',
|
|
57
|
+
required: true,
|
|
58
|
+
comment: 'Product SKU reference',
|
|
59
|
+
},
|
|
60
|
+
locationRef: {
|
|
61
|
+
source: 'location',
|
|
62
|
+
required: true,
|
|
63
|
+
comment: 'Warehouse location code',
|
|
64
|
+
},
|
|
65
|
+
qty: {
|
|
66
|
+
source: 'quantity',
|
|
67
|
+
resolver: 'sdk.parseInt',
|
|
68
|
+
required: true,
|
|
69
|
+
comment: 'Available quantity',
|
|
70
|
+
},
|
|
71
|
+
status: {
|
|
72
|
+
source: 'status',
|
|
73
|
+
resolver: 'sdk.uppercase',
|
|
74
|
+
defaultValue: 'AVAILABLE',
|
|
75
|
+
comment: 'Inventory status',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Event Handler Functions
|
|
82
|
+
// ============================================================================
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Process webhook payload for inventory update
|
|
86
|
+
*/
|
|
87
|
+
async function handleInventoryWebhook(payload: any): Promise<{
|
|
88
|
+
success: boolean;
|
|
89
|
+
jobId?: string;
|
|
90
|
+
records?: number;
|
|
91
|
+
errors?: string[];
|
|
92
|
+
}> {
|
|
93
|
+
console.log('๐ฅ Received inventory webhook event');
|
|
94
|
+
|
|
95
|
+
try {
|
|
96
|
+
// Initialize services
|
|
97
|
+
const client = await createClient({ config: config.fluent });
|
|
98
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
99
|
+
const state = new StateService(new SimpleKVStore());
|
|
100
|
+
|
|
101
|
+
// Extract inventory data from payload
|
|
102
|
+
const inventoryData = extractInventoryData(payload);
|
|
103
|
+
|
|
104
|
+
if (!inventoryData || inventoryData.length === 0) {
|
|
105
|
+
return {
|
|
106
|
+
success: false,
|
|
107
|
+
errors: ['No inventory data found in webhook payload'],
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
console.log(` Processing ${inventoryData.length} inventory records`);
|
|
112
|
+
|
|
113
|
+
// Generate unique event ID for deduplication
|
|
114
|
+
const eventId = generateEventId(payload);
|
|
115
|
+
|
|
116
|
+
// Check if event already processed
|
|
117
|
+
if (await state.isFileProcessed(eventId)) {
|
|
118
|
+
console.log(' โญ Event already processed (duplicate webhook)');
|
|
119
|
+
return {
|
|
120
|
+
success: true,
|
|
121
|
+
records: 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// Acquire lock to prevent concurrent processing
|
|
126
|
+
const lock = await state.acquireLock(eventId, 30000); // 30s lock
|
|
127
|
+
|
|
128
|
+
if (!lock.acquired) {
|
|
129
|
+
console.log(' โธ Event locked by another process');
|
|
130
|
+
return {
|
|
131
|
+
success: false,
|
|
132
|
+
errors: ['Event is being processed by another worker'],
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
// Transform data with UniversalMapper
|
|
138
|
+
const result = await mapper.map(inventoryData);
|
|
139
|
+
|
|
140
|
+
if (!result.success) {
|
|
141
|
+
console.error(' โ Mapping validation failed:', result.errors);
|
|
142
|
+
return {
|
|
143
|
+
success: false,
|
|
144
|
+
errors: result.errors,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
console.log(` โ Mapped ${result.data.length} valid records`);
|
|
149
|
+
|
|
150
|
+
// Create batch job
|
|
151
|
+
const job = await client.createJob({
|
|
152
|
+
name: `Webhook Import - ${eventId}`,
|
|
153
|
+
retailerId: config.fluent.retailerId,
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
console.log(` ๐ Created job: ${job.id}`);
|
|
157
|
+
|
|
158
|
+
// Send batch to Fluent Commerce
|
|
159
|
+
await client.sendBatch(job.id, {
|
|
160
|
+
action: 'UPSERT',
|
|
161
|
+
entityType: 'INVENTORY',
|
|
162
|
+
source: 'EVENT_DRIVEN_WEBHOOK',
|
|
163
|
+
event: 'INVENTORY_UPDATE',
|
|
164
|
+
entities: result.data,
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Mark event as processed
|
|
168
|
+
await state.markFileProcessed(eventId, {
|
|
169
|
+
jobId: job.id,
|
|
170
|
+
records: result.data.length,
|
|
171
|
+
processedAt: new Date().toISOString(),
|
|
172
|
+
eventType: payload.eventType || 'inventory.update',
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
console.log(` โ
Successfully ingested ${result.data.length} records`);
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
success: true,
|
|
179
|
+
jobId: job.id,
|
|
180
|
+
records: result.data.length,
|
|
181
|
+
};
|
|
182
|
+
} finally {
|
|
183
|
+
// Always release lock
|
|
184
|
+
await state.releaseLock(eventId);
|
|
185
|
+
}
|
|
186
|
+
} catch (error: any) {
|
|
187
|
+
console.error(' โ Webhook processing failed:', error.message);
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
errors: [error.message],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Process Fluent event for downstream systems
|
|
197
|
+
*/
|
|
198
|
+
async function handleFluentEvent(event: any): Promise<void> {
|
|
199
|
+
console.log('๐ฃ Received Fluent event:', event.type);
|
|
200
|
+
|
|
201
|
+
// Example: React to inventory position changes
|
|
202
|
+
if (event.type === 'INVENTORY_UPDATED' || event.type === 'INVENTORY_POSITION_UPDATED') {
|
|
203
|
+
const { ref, qty, locationRef } = event.data;
|
|
204
|
+
|
|
205
|
+
console.log(` Inventory updated: ${ref} at ${locationRef} โ ${qty} units`);
|
|
206
|
+
|
|
207
|
+
// Example: Trigger downstream actions
|
|
208
|
+
if (qty < 10) {
|
|
209
|
+
console.log(` โ Low stock alert for ${ref}`);
|
|
210
|
+
// Send alert to external system
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (qty === 0) {
|
|
214
|
+
console.log(` ๐ซ Out of stock for ${ref}`);
|
|
215
|
+
// Notify e-commerce platform
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Example: React to batch job completion
|
|
220
|
+
if (event.type === 'BATCH_JOB_COMPLETED') {
|
|
221
|
+
const { jobId, status, recordsProcessed } = event.data;
|
|
222
|
+
|
|
223
|
+
console.log(` Batch job ${jobId} completed: ${status}`);
|
|
224
|
+
console.log(` Records processed: ${recordsProcessed}`);
|
|
225
|
+
|
|
226
|
+
// Update external monitoring system
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Extract inventory data from webhook payload
|
|
232
|
+
*/
|
|
233
|
+
function extractInventoryData(payload: any): any[] {
|
|
234
|
+
// Handle different payload formats
|
|
235
|
+
|
|
236
|
+
// Format 1: Direct array
|
|
237
|
+
if (Array.isArray(payload)) {
|
|
238
|
+
return payload;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Format 2: Nested in 'data' field
|
|
242
|
+
if (payload.data && Array.isArray(payload.data)) {
|
|
243
|
+
return payload.data;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Format 3: Single inventory update
|
|
247
|
+
if (payload.inventory) {
|
|
248
|
+
return Array.isArray(payload.inventory) ? payload.inventory : [payload.inventory];
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Format 4: WMS event structure
|
|
252
|
+
if (payload.eventType === 'inventory.updated' && payload.items) {
|
|
253
|
+
return payload.items;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Generate unique event ID for deduplication
|
|
261
|
+
*/
|
|
262
|
+
function generateEventId(payload: any): string {
|
|
263
|
+
// Use webhook event ID if provided
|
|
264
|
+
if (payload.eventId) {
|
|
265
|
+
return `webhook-${payload.eventId}`;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Use timestamp + hash for custom events
|
|
269
|
+
const timestamp = payload.timestamp || new Date().toISOString();
|
|
270
|
+
const hash = hashPayload(payload);
|
|
271
|
+
|
|
272
|
+
return `webhook-${timestamp}-${hash}`;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Simple hash function for payload deduplication
|
|
277
|
+
*/
|
|
278
|
+
function hashPayload(payload: any): string {
|
|
279
|
+
const str = JSON.stringify(payload);
|
|
280
|
+
let hash = 0;
|
|
281
|
+
|
|
282
|
+
for (let i = 0; i < str.length; i++) {
|
|
283
|
+
const char = str.charCodeAt(i);
|
|
284
|
+
hash = (hash << 5) - hash + char;
|
|
285
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return Math.abs(hash).toString(36);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// ============================================================================
|
|
292
|
+
// Standalone Webhook Server (Express Example)
|
|
293
|
+
// ============================================================================
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Standalone webhook server for non-Versori deployments
|
|
297
|
+
*/
|
|
298
|
+
async function startWebhookServer() {
|
|
299
|
+
// Note: This requires 'express' package
|
|
300
|
+
// npm install express
|
|
301
|
+
|
|
302
|
+
const express = require('express');
|
|
303
|
+
const app = express();
|
|
304
|
+
|
|
305
|
+
app.use(express.json());
|
|
306
|
+
|
|
307
|
+
// Webhook endpoint
|
|
308
|
+
app.post(config.webhook.path, async (req: any, res: any) => {
|
|
309
|
+
const startTime = Date.now();
|
|
310
|
+
|
|
311
|
+
// Verify webhook signature (optional but recommended)
|
|
312
|
+
const signature = req.headers['x-webhook-signature'];
|
|
313
|
+
if (!verifyWebhookSignature(req.body, signature)) {
|
|
314
|
+
return res.status(401).json({
|
|
315
|
+
success: false,
|
|
316
|
+
error: 'Invalid webhook signature',
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
// Process webhook
|
|
321
|
+
const result = await handleInventoryWebhook(req.body);
|
|
322
|
+
|
|
323
|
+
const duration = Date.now() - startTime;
|
|
324
|
+
|
|
325
|
+
if (result.success) {
|
|
326
|
+
res.status(200).json({
|
|
327
|
+
success: true,
|
|
328
|
+
jobId: result.jobId,
|
|
329
|
+
records: result.records,
|
|
330
|
+
processingTime: `${duration}ms`,
|
|
331
|
+
});
|
|
332
|
+
} else {
|
|
333
|
+
res.status(400).json({
|
|
334
|
+
success: false,
|
|
335
|
+
errors: result.errors,
|
|
336
|
+
processingTime: `${duration}ms`,
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
// Health check endpoint
|
|
342
|
+
app.get('/health', (req: any, res: any) => {
|
|
343
|
+
res.status(200).json({
|
|
344
|
+
status: 'healthy',
|
|
345
|
+
timestamp: new Date().toISOString(),
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
// Start server
|
|
350
|
+
app.listen(config.webhook.port, () => {
|
|
351
|
+
console.log(`๐ Webhook server listening on port ${config.webhook.port}`);
|
|
352
|
+
console.log(
|
|
353
|
+
`๐ Webhook endpoint: http://localhost:${config.webhook.port}${config.webhook.path}`
|
|
354
|
+
);
|
|
355
|
+
console.log(`๐ Health check: http://localhost:${config.webhook.port}/health`);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/**
|
|
360
|
+
* Verify webhook signature (HMAC SHA256)
|
|
361
|
+
*/
|
|
362
|
+
function verifyWebhookSignature(payload: any, signature?: string): boolean {
|
|
363
|
+
if (!signature) return false;
|
|
364
|
+
|
|
365
|
+
const crypto = require('crypto');
|
|
366
|
+
|
|
367
|
+
const expectedSignature = crypto
|
|
368
|
+
.createHmac('sha256', config.webhook.secret)
|
|
369
|
+
.update(JSON.stringify(payload))
|
|
370
|
+
.digest('hex');
|
|
371
|
+
|
|
372
|
+
return signature === expectedSignature;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// ============================================================================
|
|
376
|
+
// Versori Platform Integration
|
|
377
|
+
// ============================================================================
|
|
378
|
+
|
|
379
|
+
/**
|
|
380
|
+
* Versori webhook handler
|
|
381
|
+
*
|
|
382
|
+
* Deploy this to Versori platform:
|
|
383
|
+
*
|
|
384
|
+
* import { webhook } from '@versori/run';
|
|
385
|
+
*
|
|
386
|
+
* export const inventoryWebhook = webhook('inventory-update', async ({ data }) => {
|
|
387
|
+
* const result = await handleInventoryWebhook(data);
|
|
388
|
+
* return result;
|
|
389
|
+
* });
|
|
390
|
+
*/
|
|
391
|
+
|
|
392
|
+
// ============================================================================
|
|
393
|
+
// Test Utilities
|
|
394
|
+
// ============================================================================
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Simulate webhook event for testing
|
|
398
|
+
*/
|
|
399
|
+
async function testWebhookEvent() {
|
|
400
|
+
console.log('๐งช Testing webhook event handler\n');
|
|
401
|
+
|
|
402
|
+
const testPayload = {
|
|
403
|
+
eventId: 'test-event-001',
|
|
404
|
+
eventType: 'inventory.updated',
|
|
405
|
+
timestamp: new Date().toISOString(),
|
|
406
|
+
items: [
|
|
407
|
+
{
|
|
408
|
+
sku: 'SKU-001',
|
|
409
|
+
location: 'WH-001',
|
|
410
|
+
quantity: '150',
|
|
411
|
+
status: 'available',
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
sku: 'SKU-002',
|
|
415
|
+
location: 'WH-001',
|
|
416
|
+
quantity: '75',
|
|
417
|
+
status: 'available',
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
sku: 'SKU-003',
|
|
421
|
+
location: 'WH-002',
|
|
422
|
+
quantity: '200',
|
|
423
|
+
status: 'available',
|
|
424
|
+
},
|
|
425
|
+
],
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
const result = await handleInventoryWebhook(testPayload);
|
|
429
|
+
|
|
430
|
+
console.log('\n๐ Test Results:');
|
|
431
|
+
console.log(' Success:', result.success);
|
|
432
|
+
console.log(' Job ID:', result.jobId);
|
|
433
|
+
console.log(' Records:', result.records);
|
|
434
|
+
|
|
435
|
+
if (result.errors) {
|
|
436
|
+
console.log(' Errors:', result.errors);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Simulate Fluent event for testing
|
|
442
|
+
*/
|
|
443
|
+
async function testFluentEvent() {
|
|
444
|
+
console.log('\n๐งช Testing Fluent event handler\n');
|
|
445
|
+
|
|
446
|
+
const testEvent = {
|
|
447
|
+
type: 'INVENTORY_POSITION_UPDATED',
|
|
448
|
+
timestamp: new Date().toISOString(),
|
|
449
|
+
data: {
|
|
450
|
+
ref: 'SKU-001',
|
|
451
|
+
locationRef: 'WH-001',
|
|
452
|
+
qty: 5,
|
|
453
|
+
previousQty: 150,
|
|
454
|
+
},
|
|
455
|
+
};
|
|
456
|
+
|
|
457
|
+
await handleFluentEvent(testEvent);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// ============================================================================
|
|
461
|
+
// Main Entry Point
|
|
462
|
+
// ============================================================================
|
|
463
|
+
|
|
464
|
+
async function main() {
|
|
465
|
+
const mode = process.argv[2] || 'test';
|
|
466
|
+
|
|
467
|
+
switch (mode) {
|
|
468
|
+
case 'server':
|
|
469
|
+
// Start webhook server
|
|
470
|
+
await startWebhookServer();
|
|
471
|
+
break;
|
|
472
|
+
|
|
473
|
+
case 'test':
|
|
474
|
+
// Run tests
|
|
475
|
+
await testWebhookEvent();
|
|
476
|
+
await testFluentEvent();
|
|
477
|
+
break;
|
|
478
|
+
|
|
479
|
+
default:
|
|
480
|
+
console.log('Usage:');
|
|
481
|
+
console.log(' npx tsx examples/event-driven.ts test # Test webhook handlers');
|
|
482
|
+
console.log(' npx tsx examples/event-driven.ts server # Start webhook server');
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Run if executed directly
|
|
487
|
+
if (require.main === module) {
|
|
488
|
+
main().catch(error => {
|
|
489
|
+
console.error('Fatal error:', error);
|
|
490
|
+
process.exit(1);
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
// Export for use in other modules
|
|
495
|
+
export {
|
|
496
|
+
handleInventoryWebhook,
|
|
497
|
+
handleFluentEvent,
|
|
498
|
+
extractInventoryData,
|
|
499
|
+
generateEventId,
|
|
500
|
+
verifyWebhookSignature,
|
|
501
|
+
};
|