@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +11 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,385 +1,385 @@
|
|
|
1
|
-
# Pattern: State Management & Duplicate Prevention
|
|
2
|
-
|
|
3
|
-
**FC Connect SDK Use Case Guide**
|
|
4
|
-
|
|
5
|
-
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
-
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
-
|
|
8
|
-
**Context**: Focused guide on preventing duplicate processing and managing state
|
|
9
|
-
|
|
10
|
-
**Type**: Reusable Pattern
|
|
11
|
-
|
|
12
|
-
**Complexity**: Low-Medium
|
|
13
|
-
|
|
14
|
-
**Lines**: ~120 lines
|
|
15
|
-
|
|
16
|
-
## When to Use This Pattern
|
|
17
|
-
|
|
18
|
-
- **File processing workflows**: Track which files have been processed
|
|
19
|
-
- **Idempotent operations**: Ensure operations can be safely retried
|
|
20
|
-
- **Checkpoint/resume capabilities**: Save progress and resume after failures
|
|
21
|
-
- **Distributed processing**: Prevent multiple instances from processing the same data
|
|
22
|
-
- **Preventing duplicate records**: Avoid sending duplicate batches to Fluent Commerce
|
|
23
|
-
|
|
24
|
-
## SDK Methods
|
|
25
|
-
|
|
26
|
-
### StateService (Full-Featured)
|
|
27
|
-
|
|
28
|
-
- `StateService(logger)` - Comprehensive state management service
|
|
29
|
-
- `stateService.isFileProcessed(kv, fileName, workflowId?)` - Check file status
|
|
30
|
-
- `stateService.updateSyncState(kv, processedFiles, workflowId?)` - Update sync state
|
|
31
|
-
- `stateService.getSyncState(kv, workflowId?)` - Get current sync state
|
|
32
|
-
- `stateService.acquireLock(lockName, kv, timeoutMinutes)` - Distributed locking
|
|
33
|
-
- `stateService.releaseLock(lockName, kv)` - Release lock
|
|
34
|
-
- `stateService.getDailyJob(kv, workflowId)` - Get daily job (for DAILY strategy)
|
|
35
|
-
- `stateService.setDailyJob(kv, workflowId, jobId, expirationHours)` - Store daily job
|
|
36
|
-
|
|
37
|
-
### VersoriFileTracker (Simplified)
|
|
38
|
-
|
|
39
|
-
- `VersoriFileTracker(versoriKV, prefix)` - Simple file tracking for Versori
|
|
40
|
-
- `tracker.wasFileProcessed(fileName)` - Check if file was processed
|
|
41
|
-
- `tracker.markFileProcessed(fileName, metadata?)` - Mark file as processed
|
|
42
|
-
- `tracker.getLastProcessedFile()` - Get last processed file name
|
|
43
|
-
- `tracker.setLastProcessedFile(fileName)` - Update last processed file
|
|
44
|
-
|
|
45
|
-
### VersoriKVAdapter (Bridge)
|
|
46
|
-
|
|
47
|
-
- `VersoriKVAdapter(versoriKV)` - Adapts Versori KV to StateService's KVStore interface
|
|
48
|
-
- Enables using full StateService functionality in Versori platform
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## Pattern 1: File Duplicate Prevention (Simple)
|
|
53
|
-
|
|
54
|
-
**Use Case**: Prevent processing the same file twice in Versori workflows
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
// FC Connect SDK (latest)
|
|
58
|
-
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
59
|
-
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
60
|
-
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
61
|
-
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
62
|
-
|
|
63
|
-
// In your Versori workflow
|
|
64
|
-
fn('process-files', async ({ openKv }) => {
|
|
65
|
-
const kv = openKv();
|
|
66
|
-
const tracker = new VersoriFileTracker(kv, 'inventory-ingestion');
|
|
67
|
-
|
|
68
|
-
const files = await s3Client.listFiles({ bucket: 'inventory-files' });
|
|
69
|
-
|
|
70
|
-
for (const file of files) {
|
|
71
|
-
// Check if already processed
|
|
72
|
-
const wasProcessed = await tracker.wasFileProcessed(file.name);
|
|
73
|
-
if (wasProcessed) {
|
|
74
|
-
console.log(`Skipping already processed file: ${file.name}`);
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
try {
|
|
79
|
-
// Process file
|
|
80
|
-
await processInventoryFile(file);
|
|
81
|
-
|
|
82
|
-
// Mark as processed with metadata
|
|
83
|
-
await tracker.markFileProcessed(file.name, {
|
|
84
|
-
recordCount: file.recordCount,
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
console.log(`Successfully processed: ${file.name}`);
|
|
88
|
-
} catch (error) {
|
|
89
|
-
console.error(`Failed to process ${file.name}:`, error);
|
|
90
|
-
// Don't mark as processed on error - allow retry
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Key Benefits**:
|
|
97
|
-
|
|
98
|
-
- Simple API designed specifically for Versori
|
|
99
|
-
- Automatic timestamping of processed files
|
|
100
|
-
- Metadata tracking for audit trails
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Pattern 2: Checkpoint Save/Restore
|
|
105
|
-
|
|
106
|
-
**Use Case**: Save processing progress and resume after failures
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
110
|
-
|
|
111
|
-
fn('batch-processing-with-checkpoints', async ({ openKv, logger }) => {
|
|
112
|
-
const kv = new VersoriKVAdapter(openKv());
|
|
113
|
-
const stateService = new StateService(logger);
|
|
114
|
-
|
|
115
|
-
// Get last checkpoint
|
|
116
|
-
const syncState = await stateService.getSyncState(kv, 'batch-processor');
|
|
117
|
-
const lastProcessed = syncState.lastProcessedTimestamp;
|
|
118
|
-
logger.info('Resuming from checkpoint', { lastProcessed });
|
|
119
|
-
|
|
120
|
-
// Fetch records newer than last checkpoint
|
|
121
|
-
const records = await fetchRecordsSince(lastProcessed);
|
|
122
|
-
const processedFiles = [];
|
|
123
|
-
|
|
124
|
-
for (const batch of chunk(records, 1000)) {
|
|
125
|
-
try {
|
|
126
|
-
// Process batch
|
|
127
|
-
await sendBatchToFluent(batch);
|
|
128
|
-
|
|
129
|
-
// Save checkpoint after each successful batch
|
|
130
|
-
processedFiles.push({
|
|
131
|
-
fileName: `batch-${batch[0].id}-${batch[batch.length - 1].id}`,
|
|
132
|
-
lastModified: new Date().toISOString(),
|
|
133
|
-
recordCount: batch.length,
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
// Update checkpoint state
|
|
137
|
-
await stateService.updateSyncState(kv, processedFiles, 'batch-processor');
|
|
138
|
-
|
|
139
|
-
logger.info('Checkpoint saved', {
|
|
140
|
-
batchSize: batch.length,
|
|
141
|
-
totalProcessed: processedFiles.length,
|
|
142
|
-
});
|
|
143
|
-
} catch (error) {
|
|
144
|
-
logger.error('Batch failed, checkpoint preserved for retry', error);
|
|
145
|
-
throw error; // Workflow will resume from last successful checkpoint
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
**Key Benefits**:
|
|
152
|
-
|
|
153
|
-
- Resume exactly where you left off after failures
|
|
154
|
-
- Incremental sync tracking with timestamps
|
|
155
|
-
- Detailed processing history per file/batch
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## Pattern 3: Distributed Locking
|
|
160
|
-
|
|
161
|
-
**Use Case**: Prevent multiple workflow instances from running concurrently
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
165
|
-
|
|
166
|
-
fn('exclusive-ingestion', async ({ openKv, logger }) => {
|
|
167
|
-
const kv = new VersoriKVAdapter(openKv());
|
|
168
|
-
const stateService = new StateService(logger);
|
|
169
|
-
|
|
170
|
-
const lockName = 'inventory-ingestion';
|
|
171
|
-
const timeoutMinutes = 15;
|
|
172
|
-
|
|
173
|
-
// Try to acquire lock
|
|
174
|
-
const acquired = await stateService.acquireLock(lockName, kv, timeoutMinutes);
|
|
175
|
-
|
|
176
|
-
if (!acquired) {
|
|
177
|
-
logger.warn('Another instance is running, aborting');
|
|
178
|
-
return { skipped: true, reason: 'Lock held by another instance' };
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
try {
|
|
182
|
-
logger.info('Lock acquired, starting ingestion');
|
|
183
|
-
|
|
184
|
-
// Perform exclusive work
|
|
185
|
-
await performIngestion();
|
|
186
|
-
|
|
187
|
-
logger.info('Ingestion completed');
|
|
188
|
-
return { success: true };
|
|
189
|
-
} finally {
|
|
190
|
-
// Always release lock, even on error
|
|
191
|
-
await stateService.releaseLock(lockName, kv);
|
|
192
|
-
logger.info('Lock released');
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
**Key Benefits**:
|
|
198
|
-
|
|
199
|
-
- Prevents race conditions in distributed systems
|
|
200
|
-
- Automatic stale lock detection (overrides expired locks)
|
|
201
|
-
- Safe cleanup with finally blocks
|
|
202
|
-
|
|
203
|
-
---
|
|
204
|
-
|
|
205
|
-
## Pattern 4: Idempotency Keys
|
|
206
|
-
|
|
207
|
-
**Use Case**: Ensure batch operations can be safely retried
|
|
208
|
-
|
|
209
|
-
```typescript
|
|
210
|
-
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
211
|
-
|
|
212
|
-
fn('idempotent-batch-submission', async ({ openKv, logger }) => {
|
|
213
|
-
const tracker = new VersoriFileTracker(openKv(), 'batch-submissions');
|
|
214
|
-
const batches = prepareBatches();
|
|
215
|
-
|
|
216
|
-
for (const batch of batches) {
|
|
217
|
-
// Generate idempotency key from batch content
|
|
218
|
-
const batchKey = `job-${batch.jobId}-batch-${batch.batchIndex}`;
|
|
219
|
-
|
|
220
|
-
// Check if batch was already sent
|
|
221
|
-
if (await tracker.wasFileProcessed(batchKey)) {
|
|
222
|
-
logger.info(`Batch already sent, skipping: ${batchKey}`);
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
try {
|
|
227
|
-
// Send batch to Fluent Commerce
|
|
228
|
-
const response = await fluentClient.sendBatch(batch.jobId, {
|
|
229
|
-
entities: batch.entities,
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
// Mark as sent with response metadata
|
|
233
|
-
await tracker.markFileProcessed(batchKey, {
|
|
234
|
-
recordCount: batch.entities.length,
|
|
235
|
-
batchId: response.id,
|
|
236
|
-
status: response.status,
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
logger.info(`Batch sent successfully: ${batchKey}`);
|
|
240
|
-
} catch (error) {
|
|
241
|
-
logger.error(`Batch submission failed: ${batchKey}`, error);
|
|
242
|
-
// Don't mark as processed - will retry on next run
|
|
243
|
-
throw error;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
});
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**Key Benefits**:
|
|
250
|
-
|
|
251
|
-
- Safe retries after network failures
|
|
252
|
-
- Prevents duplicate batch submissions
|
|
253
|
-
- Audit trail of all batch submissions
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Pattern 5: Daily Job Reuse (DAILY Strategy)
|
|
258
|
-
|
|
259
|
-
**Use Case**: Reuse a single Fluent job for an entire day's batches
|
|
260
|
-
|
|
261
|
-
```typescript
|
|
262
|
-
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
263
|
-
|
|
264
|
-
fn('daily-job-strategy', async ({ openKv, logger }) => {
|
|
265
|
-
const kv = new VersoriKVAdapter(openKv());
|
|
266
|
-
const stateService = new StateService(logger);
|
|
267
|
-
const workflowId = 'inventory-sync';
|
|
268
|
-
|
|
269
|
-
// Check if we have a valid job for today
|
|
270
|
-
let dailyJob = await stateService.getDailyJob(kv, workflowId);
|
|
271
|
-
|
|
272
|
-
if (!dailyJob) {
|
|
273
|
-
// Create new job for today
|
|
274
|
-
const job = await fluentClient.createJob({
|
|
275
|
-
name: `inventory-sync-${new Date().toISOString().split('T')[0]}`,
|
|
276
|
-
retailerId: 'my-retailer',
|
|
277
|
-
});
|
|
278
|
-
|
|
279
|
-
// Store job for reuse (expires in 24 hours)
|
|
280
|
-
await stateService.setDailyJob(kv, workflowId, job.id, 24);
|
|
281
|
-
logger.info('Created new daily job', { jobId: job.id });
|
|
282
|
-
dailyJob = { jobId: job.id };
|
|
283
|
-
} else {
|
|
284
|
-
logger.info('Reusing existing daily job', { jobId: dailyJob.jobId });
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Use the job for batch submission
|
|
288
|
-
await fluentClient.sendBatch(dailyJob.jobId, {
|
|
289
|
-
entities: inventoryData,
|
|
290
|
-
});
|
|
291
|
-
});
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
**Key Benefits**:
|
|
295
|
-
|
|
296
|
-
- Reduces job creation overhead
|
|
297
|
-
- All daily batches grouped under single job
|
|
298
|
-
- Automatic expiration and renewal
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## Best Practices
|
|
303
|
-
|
|
304
|
-
### State Key Naming
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
// ✅ GOOD: Scoped, descriptive keys
|
|
308
|
-
const fileKey = `inventory-ingestion:processed-files:${fileName}`;
|
|
309
|
-
const lockKey = `locks:inventory-sync:${workflowId}`;
|
|
310
|
-
const checkpointKey = `checkpoints:extraction:${connectionId}`;
|
|
311
|
-
|
|
312
|
-
// ❌ BAD: Generic, collision-prone keys
|
|
313
|
-
const fileKey = fileName;
|
|
314
|
-
const lockKey = 'lock';
|
|
315
|
-
const checkpointKey = 'state';
|
|
316
|
-
```
|
|
317
|
-
|
|
318
|
-
### Error Handling
|
|
319
|
-
|
|
320
|
-
```typescript
|
|
321
|
-
// ✅ GOOD: Don't mark as processed on error
|
|
322
|
-
try {
|
|
323
|
-
await processFile(file);
|
|
324
|
-
await tracker.markFileProcessed(file.name);
|
|
325
|
-
} catch (error) {
|
|
326
|
-
logger.error('Processing failed, will retry', error);
|
|
327
|
-
// Don't mark as processed - allow retry
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
// ❌ BAD: Marking as processed before completion
|
|
331
|
-
await tracker.markFileProcessed(file.name); // Too early!
|
|
332
|
-
await processFile(file); // Might fail, but already marked
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
### Lock Cleanup
|
|
336
|
-
|
|
337
|
-
```typescript
|
|
338
|
-
// ✅ GOOD: Always release locks with finally
|
|
339
|
-
const acquired = await stateService.acquireLock('sync', kv, 15);
|
|
340
|
-
if (!acquired) return;
|
|
341
|
-
try {
|
|
342
|
-
await performWork();
|
|
343
|
-
} finally {
|
|
344
|
-
await stateService.releaseLock('sync', kv);
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
// ❌ BAD: Lock might not be released on error
|
|
348
|
-
const acquired = await stateService.acquireLock('sync', kv, 15);
|
|
349
|
-
await performWork();
|
|
350
|
-
await stateService.releaseLock('sync', kv); // Skipped if performWork throws!
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### Metadata Tracking
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
// ✅ GOOD: Rich metadata for debugging
|
|
357
|
-
await tracker.markFileProcessed(fileName, {
|
|
358
|
-
recordCount: records.length,
|
|
359
|
-
processingTime: Date.now() - startTime,
|
|
360
|
-
sourceSystem: 'SAP',
|
|
361
|
-
batchId: batchResponse.id,
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
// ❌ BAD: No metadata
|
|
365
|
-
await tracker.markFileProcessed(fileName);
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
---
|
|
369
|
-
|
|
370
|
-
## Common Pitfalls
|
|
371
|
-
|
|
372
|
-
1. **Forgetting to release locks**: Always use `finally` blocks
|
|
373
|
-
2. **Marking files processed too early**: Mark only after successful completion
|
|
374
|
-
3. **Not handling stale state**: Use lock timeouts and expiration
|
|
375
|
-
4. **Poor key naming**: Use descriptive, scoped keys to avoid collisions
|
|
376
|
-
5. **Missing error logging**: Track why processing failed for debugging
|
|
377
|
-
|
|
378
|
-
---
|
|
379
|
-
|
|
380
|
-
## See Also
|
|
381
|
-
|
|
382
|
-
- [Batch Processing Pattern](../../03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md)
|
|
383
|
-
- [Error Handling Pattern](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
384
|
-
- [StateService API Reference](../../02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md)
|
|
385
|
-
- [VersoriFileTracker API Reference](../../04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md)
|
|
1
|
+
# Pattern: State Management & Duplicate Prevention
|
|
2
|
+
|
|
3
|
+
**FC Connect SDK Use Case Guide**
|
|
4
|
+
|
|
5
|
+
> **SDK**: [@fluentcommerce/fc-connect-sdk](https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk)
|
|
6
|
+
> **Version**: Use latest - `npm install @fluentcommerce/fc-connect-sdk@latest`
|
|
7
|
+
|
|
8
|
+
**Context**: Focused guide on preventing duplicate processing and managing state
|
|
9
|
+
|
|
10
|
+
**Type**: Reusable Pattern
|
|
11
|
+
|
|
12
|
+
**Complexity**: Low-Medium
|
|
13
|
+
|
|
14
|
+
**Lines**: ~120 lines
|
|
15
|
+
|
|
16
|
+
## When to Use This Pattern
|
|
17
|
+
|
|
18
|
+
- **File processing workflows**: Track which files have been processed
|
|
19
|
+
- **Idempotent operations**: Ensure operations can be safely retried
|
|
20
|
+
- **Checkpoint/resume capabilities**: Save progress and resume after failures
|
|
21
|
+
- **Distributed processing**: Prevent multiple instances from processing the same data
|
|
22
|
+
- **Preventing duplicate records**: Avoid sending duplicate batches to Fluent Commerce
|
|
23
|
+
|
|
24
|
+
## SDK Methods
|
|
25
|
+
|
|
26
|
+
### StateService (Full-Featured)
|
|
27
|
+
|
|
28
|
+
- `StateService(logger)` - Comprehensive state management service
|
|
29
|
+
- `stateService.isFileProcessed(kv, fileName, workflowId?)` - Check file status
|
|
30
|
+
- `stateService.updateSyncState(kv, processedFiles, workflowId?)` - Update sync state
|
|
31
|
+
- `stateService.getSyncState(kv, workflowId?)` - Get current sync state
|
|
32
|
+
- `stateService.acquireLock(lockName, kv, timeoutMinutes)` - Distributed locking
|
|
33
|
+
- `stateService.releaseLock(lockName, kv)` - Release lock
|
|
34
|
+
- `stateService.getDailyJob(kv, workflowId)` - Get daily job (for DAILY strategy)
|
|
35
|
+
- `stateService.setDailyJob(kv, workflowId, jobId, expirationHours)` - Store daily job
|
|
36
|
+
|
|
37
|
+
### VersoriFileTracker (Simplified)
|
|
38
|
+
|
|
39
|
+
- `VersoriFileTracker(versoriKV, prefix)` - Simple file tracking for Versori
|
|
40
|
+
- `tracker.wasFileProcessed(fileName)` - Check if file was processed
|
|
41
|
+
- `tracker.markFileProcessed(fileName, metadata?)` - Mark file as processed
|
|
42
|
+
- `tracker.getLastProcessedFile()` - Get last processed file name
|
|
43
|
+
- `tracker.setLastProcessedFile(fileName)` - Update last processed file
|
|
44
|
+
|
|
45
|
+
### VersoriKVAdapter (Bridge)
|
|
46
|
+
|
|
47
|
+
- `VersoriKVAdapter(versoriKV)` - Adapts Versori KV to StateService's KVStore interface
|
|
48
|
+
- Enables using full StateService functionality in Versori platform
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Pattern 1: File Duplicate Prevention (Simple)
|
|
53
|
+
|
|
54
|
+
**Use Case**: Prevent processing the same file twice in Versori workflows
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// FC Connect SDK (latest)
|
|
58
|
+
// Install: npm install @fluentcommerce/fc-connect-sdk@latest
|
|
59
|
+
// Docs: https://www.npmjs.com/package/@fluentcommerce/fc-connect-sdk
|
|
60
|
+
// GitHub: https://github.com/fluentcommerce/fc-connect-sdk
|
|
61
|
+
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
62
|
+
|
|
63
|
+
// In your Versori workflow
|
|
64
|
+
fn('process-files', async ({ openKv }) => {
|
|
65
|
+
const kv = openKv();
|
|
66
|
+
const tracker = new VersoriFileTracker(kv, 'inventory-ingestion');
|
|
67
|
+
|
|
68
|
+
const files = await s3Client.listFiles({ bucket: 'inventory-files' });
|
|
69
|
+
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
// Check if already processed
|
|
72
|
+
const wasProcessed = await tracker.wasFileProcessed(file.name);
|
|
73
|
+
if (wasProcessed) {
|
|
74
|
+
console.log(`Skipping already processed file: ${file.name}`);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
// Process file
|
|
80
|
+
await processInventoryFile(file);
|
|
81
|
+
|
|
82
|
+
// Mark as processed with metadata
|
|
83
|
+
await tracker.markFileProcessed(file.name, {
|
|
84
|
+
recordCount: file.recordCount,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
console.log(`Successfully processed: ${file.name}`);
|
|
88
|
+
} catch (error) {
|
|
89
|
+
console.error(`Failed to process ${file.name}:`, error);
|
|
90
|
+
// Don't mark as processed on error - allow retry
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Key Benefits**:
|
|
97
|
+
|
|
98
|
+
- Simple API designed specifically for Versori
|
|
99
|
+
- Automatic timestamping of processed files
|
|
100
|
+
- Metadata tracking for audit trails
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Pattern 2: Checkpoint Save/Restore
|
|
105
|
+
|
|
106
|
+
**Use Case**: Save processing progress and resume after failures
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
110
|
+
|
|
111
|
+
fn('batch-processing-with-checkpoints', async ({ openKv, logger }) => {
|
|
112
|
+
const kv = new VersoriKVAdapter(openKv());
|
|
113
|
+
const stateService = new StateService(logger);
|
|
114
|
+
|
|
115
|
+
// Get last checkpoint
|
|
116
|
+
const syncState = await stateService.getSyncState(kv, 'batch-processor');
|
|
117
|
+
const lastProcessed = syncState.lastProcessedTimestamp;
|
|
118
|
+
logger.info('Resuming from checkpoint', { lastProcessed });
|
|
119
|
+
|
|
120
|
+
// Fetch records newer than last checkpoint
|
|
121
|
+
const records = await fetchRecordsSince(lastProcessed);
|
|
122
|
+
const processedFiles = [];
|
|
123
|
+
|
|
124
|
+
for (const batch of chunk(records, 1000)) {
|
|
125
|
+
try {
|
|
126
|
+
// Process batch
|
|
127
|
+
await sendBatchToFluent(batch);
|
|
128
|
+
|
|
129
|
+
// Save checkpoint after each successful batch
|
|
130
|
+
processedFiles.push({
|
|
131
|
+
fileName: `batch-${batch[0].id}-${batch[batch.length - 1].id}`,
|
|
132
|
+
lastModified: new Date().toISOString(),
|
|
133
|
+
recordCount: batch.length,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// Update checkpoint state
|
|
137
|
+
await stateService.updateSyncState(kv, processedFiles, 'batch-processor');
|
|
138
|
+
|
|
139
|
+
logger.info('Checkpoint saved', {
|
|
140
|
+
batchSize: batch.length,
|
|
141
|
+
totalProcessed: processedFiles.length,
|
|
142
|
+
});
|
|
143
|
+
} catch (error) {
|
|
144
|
+
logger.error('Batch failed, checkpoint preserved for retry', error);
|
|
145
|
+
throw error; // Workflow will resume from last successful checkpoint
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Key Benefits**:
|
|
152
|
+
|
|
153
|
+
- Resume exactly where you left off after failures
|
|
154
|
+
- Incremental sync tracking with timestamps
|
|
155
|
+
- Detailed processing history per file/batch
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Pattern 3: Distributed Locking
|
|
160
|
+
|
|
161
|
+
**Use Case**: Prevent multiple workflow instances from running concurrently
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
165
|
+
|
|
166
|
+
fn('exclusive-ingestion', async ({ openKv, logger }) => {
|
|
167
|
+
const kv = new VersoriKVAdapter(openKv());
|
|
168
|
+
const stateService = new StateService(logger);
|
|
169
|
+
|
|
170
|
+
const lockName = 'inventory-ingestion';
|
|
171
|
+
const timeoutMinutes = 15;
|
|
172
|
+
|
|
173
|
+
// Try to acquire lock
|
|
174
|
+
const acquired = await stateService.acquireLock(lockName, kv, timeoutMinutes);
|
|
175
|
+
|
|
176
|
+
if (!acquired) {
|
|
177
|
+
logger.warn('Another instance is running, aborting');
|
|
178
|
+
return { skipped: true, reason: 'Lock held by another instance' };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
logger.info('Lock acquired, starting ingestion');
|
|
183
|
+
|
|
184
|
+
// Perform exclusive work
|
|
185
|
+
await performIngestion();
|
|
186
|
+
|
|
187
|
+
logger.info('Ingestion completed');
|
|
188
|
+
return { success: true };
|
|
189
|
+
} finally {
|
|
190
|
+
// Always release lock, even on error
|
|
191
|
+
await stateService.releaseLock(lockName, kv);
|
|
192
|
+
logger.info('Lock released');
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Key Benefits**:
|
|
198
|
+
|
|
199
|
+
- Prevents race conditions in distributed systems
|
|
200
|
+
- Automatic stale lock detection (overrides expired locks)
|
|
201
|
+
- Safe cleanup with finally blocks
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Pattern 4: Idempotency Keys
|
|
206
|
+
|
|
207
|
+
**Use Case**: Ensure batch operations can be safely retried
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import { VersoriFileTracker } from '@fluentcommerce/fc-connect-sdk';
|
|
211
|
+
|
|
212
|
+
fn('idempotent-batch-submission', async ({ openKv, logger }) => {
|
|
213
|
+
const tracker = new VersoriFileTracker(openKv(), 'batch-submissions');
|
|
214
|
+
const batches = prepareBatches();
|
|
215
|
+
|
|
216
|
+
for (const batch of batches) {
|
|
217
|
+
// Generate idempotency key from batch content
|
|
218
|
+
const batchKey = `job-${batch.jobId}-batch-${batch.batchIndex}`;
|
|
219
|
+
|
|
220
|
+
// Check if batch was already sent
|
|
221
|
+
if (await tracker.wasFileProcessed(batchKey)) {
|
|
222
|
+
logger.info(`Batch already sent, skipping: ${batchKey}`);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
try {
|
|
227
|
+
// Send batch to Fluent Commerce
|
|
228
|
+
const response = await fluentClient.sendBatch(batch.jobId, {
|
|
229
|
+
entities: batch.entities,
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
// Mark as sent with response metadata
|
|
233
|
+
await tracker.markFileProcessed(batchKey, {
|
|
234
|
+
recordCount: batch.entities.length,
|
|
235
|
+
batchId: response.id,
|
|
236
|
+
status: response.status,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
logger.info(`Batch sent successfully: ${batchKey}`);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
logger.error(`Batch submission failed: ${batchKey}`, error);
|
|
242
|
+
// Don't mark as processed - will retry on next run
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
});
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
**Key Benefits**:
|
|
250
|
+
|
|
251
|
+
- Safe retries after network failures
|
|
252
|
+
- Prevents duplicate batch submissions
|
|
253
|
+
- Audit trail of all batch submissions
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Pattern 5: Daily Job Reuse (DAILY Strategy)
|
|
258
|
+
|
|
259
|
+
**Use Case**: Reuse a single Fluent job for an entire day's batches
|
|
260
|
+
|
|
261
|
+
```typescript
|
|
262
|
+
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
263
|
+
|
|
264
|
+
fn('daily-job-strategy', async ({ openKv, logger }) => {
|
|
265
|
+
const kv = new VersoriKVAdapter(openKv());
|
|
266
|
+
const stateService = new StateService(logger);
|
|
267
|
+
const workflowId = 'inventory-sync';
|
|
268
|
+
|
|
269
|
+
// Check if we have a valid job for today
|
|
270
|
+
let dailyJob = await stateService.getDailyJob(kv, workflowId);
|
|
271
|
+
|
|
272
|
+
if (!dailyJob) {
|
|
273
|
+
// Create new job for today
|
|
274
|
+
const job = await fluentClient.createJob({
|
|
275
|
+
name: `inventory-sync-${new Date().toISOString().split('T')[0]}`,
|
|
276
|
+
retailerId: 'my-retailer',
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Store job for reuse (expires in 24 hours)
|
|
280
|
+
await stateService.setDailyJob(kv, workflowId, job.id, 24);
|
|
281
|
+
logger.info('Created new daily job', { jobId: job.id });
|
|
282
|
+
dailyJob = { jobId: job.id };
|
|
283
|
+
} else {
|
|
284
|
+
logger.info('Reusing existing daily job', { jobId: dailyJob.jobId });
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// Use the job for batch submission
|
|
288
|
+
await fluentClient.sendBatch(dailyJob.jobId, {
|
|
289
|
+
entities: inventoryData,
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
**Key Benefits**:
|
|
295
|
+
|
|
296
|
+
- Reduces job creation overhead
|
|
297
|
+
- All daily batches grouped under single job
|
|
298
|
+
- Automatic expiration and renewal
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## Best Practices
|
|
303
|
+
|
|
304
|
+
### State Key Naming
|
|
305
|
+
|
|
306
|
+
```typescript
|
|
307
|
+
// ✅ GOOD: Scoped, descriptive keys
|
|
308
|
+
const fileKey = `inventory-ingestion:processed-files:${fileName}`;
|
|
309
|
+
const lockKey = `locks:inventory-sync:${workflowId}`;
|
|
310
|
+
const checkpointKey = `checkpoints:extraction:${connectionId}`;
|
|
311
|
+
|
|
312
|
+
// ❌ BAD: Generic, collision-prone keys
|
|
313
|
+
const fileKey = fileName;
|
|
314
|
+
const lockKey = 'lock';
|
|
315
|
+
const checkpointKey = 'state';
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
### Error Handling
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
// ✅ GOOD: Don't mark as processed on error
|
|
322
|
+
try {
|
|
323
|
+
await processFile(file);
|
|
324
|
+
await tracker.markFileProcessed(file.name);
|
|
325
|
+
} catch (error) {
|
|
326
|
+
logger.error('Processing failed, will retry', error);
|
|
327
|
+
// Don't mark as processed - allow retry
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// ❌ BAD: Marking as processed before completion
|
|
331
|
+
await tracker.markFileProcessed(file.name); // Too early!
|
|
332
|
+
await processFile(file); // Might fail, but already marked
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Lock Cleanup
|
|
336
|
+
|
|
337
|
+
```typescript
|
|
338
|
+
// ✅ GOOD: Always release locks with finally
|
|
339
|
+
const acquired = await stateService.acquireLock('sync', kv, 15);
|
|
340
|
+
if (!acquired) return;
|
|
341
|
+
try {
|
|
342
|
+
await performWork();
|
|
343
|
+
} finally {
|
|
344
|
+
await stateService.releaseLock('sync', kv);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// ❌ BAD: Lock might not be released on error
|
|
348
|
+
const acquired = await stateService.acquireLock('sync', kv, 15);
|
|
349
|
+
await performWork();
|
|
350
|
+
await stateService.releaseLock('sync', kv); // Skipped if performWork throws!
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Metadata Tracking
|
|
354
|
+
|
|
355
|
+
```typescript
|
|
356
|
+
// ✅ GOOD: Rich metadata for debugging
|
|
357
|
+
await tracker.markFileProcessed(fileName, {
|
|
358
|
+
recordCount: records.length,
|
|
359
|
+
processingTime: Date.now() - startTime,
|
|
360
|
+
sourceSystem: 'SAP',
|
|
361
|
+
batchId: batchResponse.id,
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// ❌ BAD: No metadata
|
|
365
|
+
await tracker.markFileProcessed(fileName);
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Common Pitfalls
|
|
371
|
+
|
|
372
|
+
1. **Forgetting to release locks**: Always use `finally` blocks
|
|
373
|
+
2. **Marking files processed too early**: Mark only after successful completion
|
|
374
|
+
3. **Not handling stale state**: Use lock timeouts and expiration
|
|
375
|
+
4. **Poor key naming**: Use descriptive, scoped keys to avoid collisions
|
|
376
|
+
5. **Missing error logging**: Track why processing failed for debugging
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## See Also
|
|
381
|
+
|
|
382
|
+
- [Batch Processing Pattern](../../03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md)
|
|
383
|
+
- [Error Handling Pattern](../../02-CORE-GUIDES/advanced-services/advanced-services-readme.md)
|
|
384
|
+
- [StateService API Reference](../../02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md)
|
|
385
|
+
- [VersoriFileTracker API Reference](../../04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md)
|