@fluentcommerce/fc-connect-sdk 0.1.53 → 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 +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- 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/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -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 -482
- 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
|
@@ -1,735 +1,735 @@
|
|
|
1
|
-
# Module 1: Foundations
|
|
2
|
-
|
|
3
|
-
Learn when to use S3 vs SFTP, understand the data source architecture, and master configuration patterns.
|
|
4
|
-
|
|
5
|
-
## Table of Contents
|
|
6
|
-
|
|
7
|
-
- [S3 vs SFTP: When to Use Each](#s3-vs-sftp-when-to-use-each)
|
|
8
|
-
- [Decision Guide](#decision-guide)
|
|
9
|
-
- [Architecture Overview](#04-REFERENCE/architecture-overview)
|
|
10
|
-
- [Configuration Fundamentals](#configuration-fundamentals)
|
|
11
|
-
- [Universal Interface Design](#universal-interface-design)
|
|
12
|
-
- [Real-World Scenarios](#real-world-scenarios)
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## S3 vs SFTP: When to Use Each
|
|
17
|
-
|
|
18
|
-
### Quick Comparison
|
|
19
|
-
|
|
20
|
-
| Aspect | S3DataSource | SftpDataSource |
|
|
21
|
-
| -------------------- | ----------------------------------------- | -------------------------------------------------- |
|
|
22
|
-
| **Use Case** | Cloud-native storage, scalable data lakes | Vendor integrations, enterprise systems |
|
|
23
|
-
| **Transport** | HTTPS (presigned URLs) | SSH (SFTP protocol) |
|
|
24
|
-
| **Authentication** | AWS IAM credentials | Password or SSH private key |
|
|
25
|
-
| **Scalability** | Unlimited (AWS managed) | Limited by vendor server capacity |
|
|
26
|
-
| **Cost Model** | Pay-per-GB storage + requests | Fixed vendor agreement |
|
|
27
|
-
| **Latency** | Low (global CDN) | Variable (depends on vendor infrastructure) |
|
|
28
|
-
| **Setup Complexity** | Low (AWS console or IaC) | Medium (SSH keys, firewall rules, IP whitelisting) |
|
|
29
|
-
| **Platform Support** | Node.js, Deno, Versori | Node.js, Deno, Versori |
|
|
30
|
-
| **Best For** | Internal integrations, modern cloud apps | External vendor/partner integrations |
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## Decision Guide
|
|
35
|
-
|
|
36
|
-
### Use S3 When:
|
|
37
|
-
|
|
38
|
-
#### ✅ Building Cloud-Native Integrations
|
|
39
|
-
|
|
40
|
-
**Scenario**: You're building a modern integration where you control both ends of the data pipeline.
|
|
41
|
-
|
|
42
|
-
```typescript
|
|
43
|
-
// S3 for cloud-native inventory ingestion
|
|
44
|
-
import { S3DataSource, CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
45
|
-
|
|
46
|
-
const s3Source = new S3DataSource(
|
|
47
|
-
{
|
|
48
|
-
type: 'S3_CSV',
|
|
49
|
-
s3Config: {
|
|
50
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
51
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
52
|
-
region: 'us-east-1',
|
|
53
|
-
bucket: 'my-bucket',
|
|
54
|
-
},
|
|
55
|
-
},
|
|
56
|
-
logger
|
|
57
|
-
);
|
|
58
|
-
|
|
59
|
-
// Read from your own S3 bucket
|
|
60
|
-
const csvContent = await s3Source.downloadFile('inventory.csv');
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Why S3?**
|
|
64
|
-
|
|
65
|
-
- You control the infrastructure
|
|
66
|
-
- Scalable to any data volume
|
|
67
|
-
- No vendor coordination needed
|
|
68
|
-
- Easy to monitor and debug
|
|
69
|
-
|
|
70
|
-
#### ✅ Need Scalable, Durable Storage
|
|
71
|
-
|
|
72
|
-
**Scenario**: Processing large datasets (GB to TB scale) with high durability requirements.
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
S3 Advantages:
|
|
76
|
-
┌────────────────────────────────────────────┐
|
|
77
|
-
│ Scalability: Unlimited storage │
|
|
78
|
-
│ Durability: 99.999999999% (11 nines) │
|
|
79
|
-
│ Availability: 99.99% SLA │
|
|
80
|
-
│ Versioning: Track file changes │
|
|
81
|
-
│ Lifecycle: Auto-archive to Glacier │
|
|
82
|
-
└────────────────────────────────────────────┘
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
**Example**: Multi-TB inventory extraction
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
// Extract millions of inventory records to S3
|
|
89
|
-
const s3Target = new S3DataSource(
|
|
90
|
-
{
|
|
91
|
-
type: 'S3_CSV',
|
|
92
|
-
s3Config: {
|
|
93
|
-
accessKeyId: process.env.TARGET_AWS_ACCESS_KEY_ID!,
|
|
94
|
-
secretAccessKey: process.env.TARGET_AWS_SECRET_ACCESS_KEY!,
|
|
95
|
-
region: 'us-west-2',
|
|
96
|
-
bucket: 'extraction-bucket',
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
logger
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
// S3 handles large files effortlessly
|
|
103
|
-
await s3Target.writeFile(
|
|
104
|
-
's3://extraction-bucket/inventory-full.parquet',
|
|
105
|
-
parquetData // 10+ GB file
|
|
106
|
-
);
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
#### ✅ Deploying to Serverless/Versori Platforms
|
|
110
|
-
|
|
111
|
-
**Scenario**: Running in AWS Lambda, Versori, or other serverless environments.
|
|
112
|
-
|
|
113
|
-
**Why S3?**
|
|
114
|
-
|
|
115
|
-
- No persistent connections needed (stateless HTTP)
|
|
116
|
-
- Presigned URLs work everywhere
|
|
117
|
-
- No network complexity (firewall rules, IP whitelisting)
|
|
118
|
-
- Native AWS integration
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
// Versori connector using S3 (zero connection config)
|
|
122
|
-
import { createClient, S3DataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
123
|
-
|
|
124
|
-
export const inventorySync = webhook('s3-inventory', async (ctx) => {
|
|
125
|
-
const client = await createClient(ctx); // Auto-detects Versori context
|
|
126
|
-
|
|
127
|
-
const s3Source = new S3DataSource(
|
|
128
|
-
{
|
|
129
|
-
type: 'S3_CSV',
|
|
130
|
-
s3Config: {
|
|
131
|
-
accessKeyId: activation.env.AWS_ACCESS_KEY_ID,
|
|
132
|
-
secretAccessKey: activation.env.AWS_SECRET_ACCESS_KEY,
|
|
133
|
-
region: 'us-east-1',
|
|
134
|
-
bucket: activation.env.S3_BUCKET,
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
log
|
|
138
|
-
);
|
|
139
|
-
|
|
140
|
-
// Works instantly - no connection pooling or SSH setup
|
|
141
|
-
const inventory = await s3Source.downloadFile('file.csv');
|
|
142
|
-
});
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
#### ✅ Need Global Distribution
|
|
146
|
-
|
|
147
|
-
**Scenario**: Multi-region deployments requiring low-latency access worldwide.
|
|
148
|
-
|
|
149
|
-
```
|
|
150
|
-
S3 + CloudFront Architecture:
|
|
151
|
-
┌─────────────────┐
|
|
152
|
-
│ S3 us-east-1 │◄─── Upload inventory files
|
|
153
|
-
└────────┬────────┘
|
|
154
|
-
│
|
|
155
|
-
▼
|
|
156
|
-
┌─────────────────┐
|
|
157
|
-
│ CloudFront CDN │◄─── Global edge caching
|
|
158
|
-
└────────┬────────┘
|
|
159
|
-
│
|
|
160
|
-
┌────┴────┬────────┬────────┐
|
|
161
|
-
▼ ▼ ▼ ▼
|
|
162
|
-
EU Asia-Pacific US LATAM
|
|
163
|
-
(low latency everywhere)
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
---
|
|
167
|
-
|
|
168
|
-
### Use SFTP When:
|
|
169
|
-
|
|
170
|
-
#### ✅ Integrating with Vendor/Partner Systems
|
|
171
|
-
|
|
172
|
-
**Scenario**: Your vendor provides inventory files via SFTP and won't change their process.
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
// Vendor requires SFTP pickup
|
|
176
|
-
import { SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
177
|
-
|
|
178
|
-
const vendorSftp = new SftpDataSource(
|
|
179
|
-
{
|
|
180
|
-
type: 'SFTP_CSV',
|
|
181
|
-
connectionId: 'vendor-abc',
|
|
182
|
-
settings: {
|
|
183
|
-
host: 'sftp.vendor-abc.com',
|
|
184
|
-
port: 22,
|
|
185
|
-
username: 'integration_user',
|
|
186
|
-
privateKey: process.env.VENDOR_SFTP_KEY,
|
|
187
|
-
remotePath: '/outbound/inventory',
|
|
188
|
-
filePattern: 'inventory_*.csv',
|
|
189
|
-
},
|
|
190
|
-
},
|
|
191
|
-
logger
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
// Read vendor's latest file
|
|
195
|
-
const files = await vendorSftp.listFiles();
|
|
196
|
-
const latestFile = files[0];
|
|
197
|
-
const inventory = await vendorSftp.downloadFile(latestFile.path);
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
**Why SFTP?**
|
|
201
|
-
|
|
202
|
-
- Vendor dictates the integration method
|
|
203
|
-
- No cloud infrastructure setup required on vendor side
|
|
204
|
-
- Works with any vendor (no AWS account needed)
|
|
205
|
-
- Standard protocol (RFC 4253) - universal compatibility
|
|
206
|
-
|
|
207
|
-
#### ✅ Working with Enterprise Systems
|
|
208
|
-
|
|
209
|
-
**Scenario**: Enterprise ERP system that only supports SFTP for data exchange.
|
|
210
|
-
|
|
211
|
-
```
|
|
212
|
-
Enterprise ERP Integration Pattern:
|
|
213
|
-
┌─────────────────┐
|
|
214
|
-
│ SAP / Oracle ERP│
|
|
215
|
-
│ │
|
|
216
|
-
│ SFTP Module │◄─── Only supported export method
|
|
217
|
-
└────────┬────────┘
|
|
218
|
-
│ (SFTP pickup required)
|
|
219
|
-
▼
|
|
220
|
-
┌─────────────────┐
|
|
221
|
-
│ SftpDataSource │
|
|
222
|
-
│ (SDK) │
|
|
223
|
-
└────────┬────────┘
|
|
224
|
-
│
|
|
225
|
-
▼
|
|
226
|
-
┌─────────────────┐
|
|
227
|
-
│ Fluent Commerce │
|
|
228
|
-
└─────────────────┘
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
**Example**: SAP inventory export
|
|
232
|
-
|
|
233
|
-
```typescript
|
|
234
|
-
const sapSftp = new SftpDataSource(
|
|
235
|
-
{
|
|
236
|
-
type: 'SFTP_CSV',
|
|
237
|
-
connectionId: 'sap-prod',
|
|
238
|
-
settings: {
|
|
239
|
-
host: 'sap-server.enterprise.internal',
|
|
240
|
-
port: 22,
|
|
241
|
-
username: 'fluent_integration',
|
|
242
|
-
password: process.env.SAP_SFTP_PASSWORD,
|
|
243
|
-
remotePath: '/exports/inventory',
|
|
244
|
-
filePattern: 'INV_*.csv',
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
logger
|
|
248
|
-
);
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
#### ✅ Required by Compliance/Security Policies
|
|
252
|
-
|
|
253
|
-
**Scenario**: Company security policy mandates SFTP for PII or financial data.
|
|
254
|
-
|
|
255
|
-
**SFTP Security Advantages**:
|
|
256
|
-
|
|
257
|
-
- Direct encrypted channel (SSH)
|
|
258
|
-
- No data stored in cloud
|
|
259
|
-
- Audit logs on company servers
|
|
260
|
-
- Fine-grained access control (SSH keys per user)
|
|
261
|
-
- No external cloud dependencies
|
|
262
|
-
|
|
263
|
-
```typescript
|
|
264
|
-
// HIPAA-compliant patient data transfer
|
|
265
|
-
const secureSftp = new SftpDataSource(
|
|
266
|
-
{
|
|
267
|
-
type: 'SFTP_CSV',
|
|
268
|
-
connectionId: 'hipaa-sftp',
|
|
269
|
-
settings: {
|
|
270
|
-
host: 'secure-sftp.healthcare.internal',
|
|
271
|
-
port: 2222, // Non-standard port for security
|
|
272
|
-
username: 'phi_integration',
|
|
273
|
-
privateKey: process.env.SFTP_PRIVATE_KEY,
|
|
274
|
-
passphrase: process.env.SFTP_KEY_PASSPHRASE,
|
|
275
|
-
remotePath: '/phi/exports',
|
|
276
|
-
strictHostKeyChecking: true,
|
|
277
|
-
knownHosts: process.env.SFTP_KNOWN_HOSTS,
|
|
278
|
-
},
|
|
279
|
-
},
|
|
280
|
-
logger
|
|
281
|
-
);
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
#### ✅ Vendor Provides SFTP-Only Access
|
|
285
|
-
|
|
286
|
-
**Scenario**: Third-party logistics (3PL) provider only offers SFTP for inventory updates.
|
|
287
|
-
|
|
288
|
-
**Example Decision Matrix**:
|
|
289
|
-
|
|
290
|
-
| Vendor Type | Typical Protocol | SDK Choice |
|
|
291
|
-
| ----------------- | ---------------- | ---------------- |
|
|
292
|
-
| 3PL / Warehouse | SFTP | `SftpDataSource` |
|
|
293
|
-
| Cloud Marketplace | REST API + S3 | `S3DataSource` |
|
|
294
|
-
| Enterprise Supplier | SFTP / FTP | `SftpDataSource` |
|
|
295
|
-
| Modern SaaS | Webhook + S3 | `S3DataSource` |
|
|
296
|
-
| Enterprise ERP | SFTP / EDI | `SftpDataSource` |
|
|
297
|
-
|
|
298
|
-
---
|
|
299
|
-
|
|
300
|
-
## Architecture Overview
|
|
301
|
-
|
|
302
|
-
### S3DataSource Architecture
|
|
303
|
-
|
|
304
|
-
```
|
|
305
|
-
┌──────────────────────────────────────────────────────────┐
|
|
306
|
-
│ S3DataSource │
|
|
307
|
-
│ (Presigned URL Architecture - Universal Compatibility) │
|
|
308
|
-
└──────────────────┬───────────────────────────────────────┘
|
|
309
|
-
│
|
|
310
|
-
┌─────────┴─────────┐
|
|
311
|
-
│ │
|
|
312
|
-
▼ ▼
|
|
313
|
-
┌─────────────────┐ ┌─────────────────┐
|
|
314
|
-
│ S3PresignService│ │ Native fetch() │
|
|
315
|
-
│ (SigV4 signing) │ │ (HTTP client) │
|
|
316
|
-
└────────┬────────┘ └────────┬────────┘
|
|
317
|
-
│ │
|
|
318
|
-
▼ ▼
|
|
319
|
-
Generate URL Execute Request
|
|
320
|
-
│ │
|
|
321
|
-
└──────────┬──────────┘
|
|
322
|
-
▼
|
|
323
|
-
┌─────────────────────┐
|
|
324
|
-
│ AWS S3 Bucket │
|
|
325
|
-
│ (HTTPS endpoint) │
|
|
326
|
-
└─────────────────────┘
|
|
327
|
-
|
|
328
|
-
Key Benefits:
|
|
329
|
-
✅ No AWS SDK bundling (smaller package size)
|
|
330
|
-
✅ Works in Node.js, Deno, Versori
|
|
331
|
-
✅ Simple fetch() API (standard Web API)
|
|
332
|
-
✅ Automatic signature generation
|
|
333
|
-
```
|
|
334
|
-
|
|
335
|
-
**Core Components**:
|
|
336
|
-
|
|
337
|
-
- `S3DataSource`: High-level file operations API
|
|
338
|
-
- `S3PresignService`: Generates signed URLs (AWS SigV4)
|
|
339
|
-
- Native `fetch()`: Executes HTTP requests to S3
|
|
340
|
-
|
|
341
|
-
**Why Presigned URLs?**
|
|
342
|
-
|
|
343
|
-
- Universal compatibility (no platform-specific code)
|
|
344
|
-
- Smaller bundle size (no AWS SDK)
|
|
345
|
-
- Simpler debugging (plain HTTP requests)
|
|
346
|
-
- Works with corporate proxies and firewalls
|
|
347
|
-
|
|
348
|
-
### SftpDataSource Architecture
|
|
349
|
-
|
|
350
|
-
```
|
|
351
|
-
┌──────────────────────────────────────────────────────────┐
|
|
352
|
-
│ SftpDataSource │
|
|
353
|
-
│ (Direct SSH - Connection Pooling) │
|
|
354
|
-
└──────────────────┬───────────────────────────────────────┘
|
|
355
|
-
│
|
|
356
|
-
┌─────────┴─────────┐
|
|
357
|
-
│ │
|
|
358
|
-
▼ ▼
|
|
359
|
-
┌─────────────────┐ ┌─────────────────┐
|
|
360
|
-
│ ssh2-sftp-client│ │ Connection Pool │
|
|
361
|
-
│ (SFTP protocol) │ │ (max 5 default) │
|
|
362
|
-
└────────┬────────┘ └────────┬────────┘
|
|
363
|
-
│ │
|
|
364
|
-
▼ ▼
|
|
365
|
-
SSH Handshake Reuse Connections
|
|
366
|
-
│ │
|
|
367
|
-
└──────────┬──────────┘
|
|
368
|
-
▼
|
|
369
|
-
┌─────────────────────┐
|
|
370
|
-
│ SFTP Server │
|
|
371
|
-
│ (SSH port 22) │
|
|
372
|
-
└─────────────────────┘
|
|
373
|
-
|
|
374
|
-
Key Benefits:
|
|
375
|
-
✅ Connection pooling (reduced overhead)
|
|
376
|
-
✅ Automatic retry with exponential backoff
|
|
377
|
-
✅ Password OR private key authentication
|
|
378
|
-
✅ Direct SSH encryption (no intermediary)
|
|
379
|
-
```
|
|
380
|
-
|
|
381
|
-
**Core Components**:
|
|
382
|
-
|
|
383
|
-
- `SftpDataSource`: High-level file operations API
|
|
384
|
-
- `ssh2-sftp-client`: SSH/SFTP protocol implementation
|
|
385
|
-
- Connection pool: Reuses SSH connections efficiently
|
|
386
|
-
|
|
387
|
-
**Why Direct SSH?**
|
|
388
|
-
|
|
389
|
-
- Industry standard for B2B file transfer
|
|
390
|
-
- No cloud infrastructure required
|
|
391
|
-
- Works with any vendor
|
|
392
|
-
- Strong encryption (SSH)
|
|
393
|
-
|
|
394
|
-
---
|
|
395
|
-
|
|
396
|
-
## Configuration Fundamentals
|
|
397
|
-
|
|
398
|
-
### S3 Configuration Pattern
|
|
399
|
-
|
|
400
|
-
```typescript
|
|
401
|
-
import {
|
|
402
|
-
S3DataSource,
|
|
403
|
-
createConsoleLogger,
|
|
404
|
-
toStructuredLogger
|
|
405
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
406
|
-
|
|
407
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
408
|
-
logLevel: 'info'
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
// Minimal S3 configuration
|
|
412
|
-
const s3Source = new S3DataSource(
|
|
413
|
-
{
|
|
414
|
-
type: 'S3_CSV', // S3_JSON, S3_XML, S3_PARQUET
|
|
415
|
-
s3Config: {
|
|
416
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
417
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
418
|
-
region: 'us-east-1',
|
|
419
|
-
// Optional
|
|
420
|
-
sessionToken: process.env.AWS_SESSION_TOKEN,
|
|
421
|
-
endpoint: process.env.AWS_ENDPOINT, // For LocalStack testing
|
|
422
|
-
},
|
|
423
|
-
},
|
|
424
|
-
logger
|
|
425
|
-
);
|
|
426
|
-
|
|
427
|
-
// Usage
|
|
428
|
-
const content = await s3Source.downloadFile('path/to/file.csv');
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
**Configuration Properties**:
|
|
432
|
-
|
|
433
|
-
| Property | Required | Description | Default |
|
|
434
|
-
| -------------------------- | -------- | ------------------ | ----------- |
|
|
435
|
-
| `type` | ✅ | Data source type | - |
|
|
436
|
-
| `s3Config.accessKeyId` | ✅ | AWS access key | - |
|
|
437
|
-
| `s3Config.secretAccessKey` | ✅ | AWS secret key | - |
|
|
438
|
-
| `s3Config.region` | ✅ | AWS region | - |
|
|
439
|
-
| `s3Config.sessionToken` | ❌ | STS session token | - |
|
|
440
|
-
| `s3Config.endpoint` | ❌ | Custom S3 endpoint | AWS default |
|
|
441
|
-
|
|
442
|
-
### SFTP Configuration Pattern
|
|
443
|
-
|
|
444
|
-
```typescript
|
|
445
|
-
import {
|
|
446
|
-
SftpDataSource,
|
|
447
|
-
createConsoleLogger,
|
|
448
|
-
toStructuredLogger
|
|
449
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
450
|
-
|
|
451
|
-
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
452
|
-
logLevel: 'info'
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
// Minimal SFTP configuration (password auth)
|
|
456
|
-
const sftpSource = new SftpDataSource(
|
|
457
|
-
{
|
|
458
|
-
type: 'SFTP_CSV', // SFTP_JSON, SFTP_JSONL, SFTP_PARQUET
|
|
459
|
-
connectionId: 'vendor-sftp',
|
|
460
|
-
name: 'Vendor SFTP Connection',
|
|
461
|
-
settings: {
|
|
462
|
-
host: 'sftp.vendor.com',
|
|
463
|
-
port: 22,
|
|
464
|
-
username: 'integration_user',
|
|
465
|
-
password: process.env.SFTP_PASSWORD,
|
|
466
|
-
remotePath: '/data/inventory',
|
|
467
|
-
filePattern: '*.csv',
|
|
468
|
-
},
|
|
469
|
-
},
|
|
470
|
-
logger
|
|
471
|
-
);
|
|
472
|
-
|
|
473
|
-
// Usage
|
|
474
|
-
const files = await sftpSource.listFiles();
|
|
475
|
-
const content = await sftpSource.downloadFile(files[0].path);
|
|
476
|
-
```
|
|
477
|
-
|
|
478
|
-
**Configuration Properties**:
|
|
479
|
-
|
|
480
|
-
| Property | Required | Description | Default |
|
|
481
|
-
| ---------------------------- | -------- | --------------------------------- | ------- |
|
|
482
|
-
| `type` | ✅ | Data source type | - |
|
|
483
|
-
| `connectionId` | ✅ | Unique connection ID | - |
|
|
484
|
-
| `settings.host` | ✅ | SFTP server hostname | - |
|
|
485
|
-
| `settings.port` | ❌ | SSH port | 22 |
|
|
486
|
-
| `settings.username` | ✅ | SSH username | - |
|
|
487
|
-
| `settings.password` | ✅\* | Password (or use privateKey) | - |
|
|
488
|
-
| `settings.privateKey` | ✅\* | SSH private key (or use password) | - |
|
|
489
|
-
| `settings.passphrase` | ❌ | Key passphrase (if encrypted) | - |
|
|
490
|
-
| `settings.remotePath` | ❌ | Remote directory path | `/` |
|
|
491
|
-
| `settings.filePattern` | ❌ | File glob pattern | `*` |
|
|
492
|
-
| `settings.maxConnections` | ❌ | Connection pool size | 5 |
|
|
493
|
-
| `settings.connectionTimeout` | ❌ | Connection timeout (ms) | 30000 |
|
|
494
|
-
|
|
495
|
-
\* Either `password` or `privateKey` required
|
|
496
|
-
|
|
497
|
-
---
|
|
498
|
-
|
|
499
|
-
## Universal Interface Design
|
|
500
|
-
|
|
501
|
-
Both `S3DataSource` and `SftpDataSource` implement the same core interface, making it easy to swap implementations:
|
|
502
|
-
|
|
503
|
-
```typescript
|
|
504
|
-
// Note: The two data sources expose similar high-level operations,
|
|
505
|
-
// but method names differ slightly.
|
|
506
|
-
// S3DataSource: listFiles, downloadFile, uploadFile, deleteFile, copyFile, moveFile, validateConnection
|
|
507
|
-
// SftpDataSource: listFiles, downloadFile, writeFile, uploadContent, deleteFile, copyFile, moveFile, createDirectory, fileExists, directoryExists, validateConnection
|
|
508
|
-
```
|
|
509
|
-
|
|
510
|
-
### Switching Between S3 and SFTP
|
|
511
|
-
|
|
512
|
-
**Example**: Switch from S3 to SFTP without changing business logic
|
|
513
|
-
|
|
514
|
-
```typescript
|
|
515
|
-
// Option 1: S3
|
|
516
|
-
const dataSource = new S3DataSource(
|
|
517
|
-
{
|
|
518
|
-
type: 'S3_CSV',
|
|
519
|
-
s3Config: {
|
|
520
|
-
/* ... */
|
|
521
|
-
},
|
|
522
|
-
},
|
|
523
|
-
logger
|
|
524
|
-
);
|
|
525
|
-
|
|
526
|
-
// Option 2: SFTP (same interface!)
|
|
527
|
-
const dataSource = new SftpDataSource(
|
|
528
|
-
{
|
|
529
|
-
type: 'SFTP_CSV',
|
|
530
|
-
connectionId: 'vendor',
|
|
531
|
-
settings: {
|
|
532
|
-
/* ... */
|
|
533
|
-
},
|
|
534
|
-
},
|
|
535
|
-
logger
|
|
536
|
-
);
|
|
537
|
-
|
|
538
|
-
// Business logic stays identical
|
|
539
|
-
const files = await dataSource.listFiles({ remotePath: 'inventory/' });
|
|
540
|
-
for (const file of files) {
|
|
541
|
-
const content = await dataSource.downloadFile(file.path);
|
|
542
|
-
const records = parseCSV(content as string);
|
|
543
|
-
await processRecords(records);
|
|
544
|
-
}
|
|
545
|
-
```
|
|
546
|
-
|
|
547
|
-
**Benefits**:
|
|
548
|
-
|
|
549
|
-
- Write business logic once
|
|
550
|
-
- Easy to test (swap for mock data source)
|
|
551
|
-
- Flexible deployment (change config, not code)
|
|
552
|
-
- Vendor migration (S3 → SFTP or vice versa)
|
|
553
|
-
|
|
554
|
-
Note: On SFTP, `parseParquetContent` is not implemented and throws. Use `ParquetParserService` after downloading the buffer.
|
|
555
|
-
|
|
556
|
-
---
|
|
557
|
-
|
|
558
|
-
## Real-World Scenarios
|
|
559
|
-
|
|
560
|
-
### Scenario 1: Modern E-Commerce Integration
|
|
561
|
-
|
|
562
|
-
**Requirements**:
|
|
563
|
-
|
|
564
|
-
- Ingest inventory from internal warehouse system
|
|
565
|
-
- High volume (100K+ SKUs daily)
|
|
566
|
-
- Need to scale globally
|
|
567
|
-
- Team controls infrastructure
|
|
568
|
-
|
|
569
|
-
**Decision**: **S3DataSource**
|
|
570
|
-
|
|
571
|
-
```typescript
|
|
572
|
-
// Why S3:
|
|
573
|
-
// ✅ Internal system (we control both ends)
|
|
574
|
-
// ✅ High volume (S3 scales infinitely)
|
|
575
|
-
// ✅ Global deployment (CloudFront distribution)
|
|
576
|
-
// ✅ No vendor coordination needed
|
|
577
|
-
|
|
578
|
-
const inventorySource = new S3DataSource(
|
|
579
|
-
{
|
|
580
|
-
type: 'S3_CSV',
|
|
581
|
-
s3Config: {
|
|
582
|
-
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
583
|
-
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
584
|
-
region: 'us-east-1',
|
|
585
|
-
},
|
|
586
|
-
},
|
|
587
|
-
logger
|
|
588
|
-
);
|
|
589
|
-
|
|
590
|
-
// Warehouse uploads to S3, we process
|
|
591
|
-
const inventory = await inventorySource.downloadFile('daily-inventory.csv');
|
|
592
|
-
```
|
|
593
|
-
|
|
594
|
-
---
|
|
595
|
-
|
|
596
|
-
### Scenario 2: Third-Party Logistics (3PL) Integration
|
|
597
|
-
|
|
598
|
-
**Requirements**:
|
|
599
|
-
|
|
600
|
-
- 3PL provides inventory via SFTP only
|
|
601
|
-
- Medium volume (10K SKUs, hourly updates)
|
|
602
|
-
- 3PL won't change their process
|
|
603
|
-
- Security: SSH key authentication required
|
|
604
|
-
|
|
605
|
-
**Decision**: **SftpDataSource**
|
|
606
|
-
|
|
607
|
-
```typescript
|
|
608
|
-
// Why SFTP:
|
|
609
|
-
// ✅ Vendor requirement (SFTP only)
|
|
610
|
-
// ✅ No control over vendor infrastructure
|
|
611
|
-
// ✅ Standard B2B integration protocol
|
|
612
|
-
// ✅ SSH key authentication supported
|
|
613
|
-
|
|
614
|
-
const threePlSftp = new SftpDataSource(
|
|
615
|
-
{
|
|
616
|
-
type: 'SFTP_CSV',
|
|
617
|
-
connectionId: '3pl-vendor',
|
|
618
|
-
settings: {
|
|
619
|
-
host: 'sftp.3plvendor.com',
|
|
620
|
-
port: 22,
|
|
621
|
-
username: 'fluent_integration',
|
|
622
|
-
privateKey: process.env.SFTP_PRIVATE_KEY,
|
|
623
|
-
remotePath: '/outbound/inventory',
|
|
624
|
-
filePattern: 'inventory_*.csv',
|
|
625
|
-
},
|
|
626
|
-
},
|
|
627
|
-
logger
|
|
628
|
-
);
|
|
629
|
-
|
|
630
|
-
// Poll for new files
|
|
631
|
-
const files = await threePlSftp.listFiles();
|
|
632
|
-
```
|
|
633
|
-
|
|
634
|
-
---
|
|
635
|
-
|
|
636
|
-
### Scenario 3: Hybrid Architecture
|
|
637
|
-
|
|
638
|
-
**Requirements**:
|
|
639
|
-
|
|
640
|
-
- Ingest from multiple vendors (S3 + SFTP)
|
|
641
|
-
- Extract to data lake (S3)
|
|
642
|
-
- Unified processing pipeline
|
|
643
|
-
|
|
644
|
-
**Decision**: **Both S3DataSource and SftpDataSource**
|
|
645
|
-
|
|
646
|
-
```typescript
|
|
647
|
-
// Vendor A: Provides S3 bucket
|
|
648
|
-
const vendorA = new S3DataSource(
|
|
649
|
-
{
|
|
650
|
-
type: 'S3_CSV',
|
|
651
|
-
s3Config: {
|
|
652
|
-
accessKeyId: process.env.VENDOR_A_KEY!,
|
|
653
|
-
secretAccessKey: process.env.VENDOR_A_SECRET!,
|
|
654
|
-
region: 'us-west-2',
|
|
655
|
-
},
|
|
656
|
-
},
|
|
657
|
-
logger
|
|
658
|
-
);
|
|
659
|
-
|
|
660
|
-
// Vendor B: Provides SFTP server
|
|
661
|
-
const vendorB = new SftpDataSource(
|
|
662
|
-
{
|
|
663
|
-
type: 'SFTP_CSV',
|
|
664
|
-
connectionId: 'vendor-b',
|
|
665
|
-
settings: {
|
|
666
|
-
host: 'sftp.vendorb.com',
|
|
667
|
-
username: 'integration',
|
|
668
|
-
privateKey: process.env.VENDOR_B_KEY,
|
|
669
|
-
},
|
|
670
|
-
},
|
|
671
|
-
logger
|
|
672
|
-
);
|
|
673
|
-
|
|
674
|
-
// Unified processing function (works with both!)
|
|
675
|
-
async function ingestInventory(dataSource: DataSource, prefix: string) {
|
|
676
|
-
const files = await dataSource.listFiles(prefix);
|
|
677
|
-
for (const file of files) {
|
|
678
|
-
const content = await dataSource.downloadFile(file.path);
|
|
679
|
-
await processInventory(content);
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
// Process both vendors with same code
|
|
684
|
-
await ingestInventory(vendorA, 'inventory/');
|
|
685
|
-
await ingestInventory(vendorB, 'inventory/');
|
|
686
|
-
```
|
|
687
|
-
|
|
688
|
-
---
|
|
689
|
-
|
|
690
|
-
## Summary
|
|
691
|
-
|
|
692
|
-
### Key Takeaways
|
|
693
|
-
|
|
694
|
-
1. **S3 for cloud-native**: When you control infrastructure and need scalability
|
|
695
|
-
2. **SFTP for vendor integrations**: When working with external partners or enterprise systems
|
|
696
|
-
3. **Universal interface**: Same API for both S3 and SFTP
|
|
697
|
-
4. **Presigned URLs (S3)**: Universal compatibility without AWS SDK bundling
|
|
698
|
-
5. **Direct SSH (SFTP)**: Standard protocol for B2B file exchange
|
|
699
|
-
|
|
700
|
-
### Decision Flowchart
|
|
701
|
-
|
|
702
|
-
```
|
|
703
|
-
Do you control the infrastructure?
|
|
704
|
-
│
|
|
705
|
-
┌────┴────┐
|
|
706
|
-
YES NO
|
|
707
|
-
│ │
|
|
708
|
-
│ └──► Use SFTP (vendor requirement)
|
|
709
|
-
│
|
|
710
|
-
Is this a cloud-native integration?
|
|
711
|
-
│
|
|
712
|
-
┌────┴────┐
|
|
713
|
-
YES NO
|
|
714
|
-
│ │
|
|
715
|
-
└──► S3 └──► Is volume high (>10K records/hour)?
|
|
716
|
-
│
|
|
717
|
-
┌────┴────┐
|
|
718
|
-
YES NO
|
|
719
|
-
│ │
|
|
720
|
-
└──► S3 └──► Either (your preference)
|
|
721
|
-
```
|
|
722
|
-
|
|
723
|
-
---
|
|
724
|
-
|
|
725
|
-
## Next Steps
|
|
726
|
-
|
|
727
|
-
**Ready for S3?** → [Module 2: S3 Operations](./data-sources-02-s3-operations.md)
|
|
728
|
-
|
|
729
|
-
**Ready for SFTP?** → [Module 3: SFTP Operations](./data-sources-03-sftp-operations.md)
|
|
730
|
-
|
|
731
|
-
**Need both?** → Read both modules, then [Module 4: File Processing Patterns](./data-sources-04-file-patterns.md)
|
|
732
|
-
|
|
733
|
-
---
|
|
734
|
-
|
|
735
|
-
[← Back to Guide](../data-sources-readme.md) | [Next: S3 Operations →](./data-sources-02-s3-operations.md)
|
|
1
|
+
# Module 1: Foundations
|
|
2
|
+
|
|
3
|
+
Learn when to use S3 vs SFTP, understand the data source architecture, and master configuration patterns.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [S3 vs SFTP: When to Use Each](#s3-vs-sftp-when-to-use-each)
|
|
8
|
+
- [Decision Guide](#decision-guide)
|
|
9
|
+
- [Architecture Overview](#04-REFERENCE/architecture-overview)
|
|
10
|
+
- [Configuration Fundamentals](#configuration-fundamentals)
|
|
11
|
+
- [Universal Interface Design](#universal-interface-design)
|
|
12
|
+
- [Real-World Scenarios](#real-world-scenarios)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## S3 vs SFTP: When to Use Each
|
|
17
|
+
|
|
18
|
+
### Quick Comparison
|
|
19
|
+
|
|
20
|
+
| Aspect | S3DataSource | SftpDataSource |
|
|
21
|
+
| -------------------- | ----------------------------------------- | -------------------------------------------------- |
|
|
22
|
+
| **Use Case** | Cloud-native storage, scalable data lakes | Vendor integrations, enterprise systems |
|
|
23
|
+
| **Transport** | HTTPS (presigned URLs) | SSH (SFTP protocol) |
|
|
24
|
+
| **Authentication** | AWS IAM credentials | Password or SSH private key |
|
|
25
|
+
| **Scalability** | Unlimited (AWS managed) | Limited by vendor server capacity |
|
|
26
|
+
| **Cost Model** | Pay-per-GB storage + requests | Fixed vendor agreement |
|
|
27
|
+
| **Latency** | Low (global CDN) | Variable (depends on vendor infrastructure) |
|
|
28
|
+
| **Setup Complexity** | Low (AWS console or IaC) | Medium (SSH keys, firewall rules, IP whitelisting) |
|
|
29
|
+
| **Platform Support** | Node.js, Deno, Versori | Node.js, Deno, Versori |
|
|
30
|
+
| **Best For** | Internal integrations, modern cloud apps | External vendor/partner integrations |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Decision Guide
|
|
35
|
+
|
|
36
|
+
### Use S3 When:
|
|
37
|
+
|
|
38
|
+
#### ✅ Building Cloud-Native Integrations
|
|
39
|
+
|
|
40
|
+
**Scenario**: You're building a modern integration where you control both ends of the data pipeline.
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
// S3 for cloud-native inventory ingestion
|
|
44
|
+
import { S3DataSource, CSVParserService } from '@fluentcommerce/fc-connect-sdk';
|
|
45
|
+
|
|
46
|
+
const s3Source = new S3DataSource(
|
|
47
|
+
{
|
|
48
|
+
type: 'S3_CSV',
|
|
49
|
+
s3Config: {
|
|
50
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
51
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
52
|
+
region: 'us-east-1',
|
|
53
|
+
bucket: 'my-bucket',
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
logger
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Read from your own S3 bucket
|
|
60
|
+
const csvContent = await s3Source.downloadFile('inventory.csv');
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Why S3?**
|
|
64
|
+
|
|
65
|
+
- You control the infrastructure
|
|
66
|
+
- Scalable to any data volume
|
|
67
|
+
- No vendor coordination needed
|
|
68
|
+
- Easy to monitor and debug
|
|
69
|
+
|
|
70
|
+
#### ✅ Need Scalable, Durable Storage
|
|
71
|
+
|
|
72
|
+
**Scenario**: Processing large datasets (GB to TB scale) with high durability requirements.
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
S3 Advantages:
|
|
76
|
+
┌────────────────────────────────────────────┐
|
|
77
|
+
│ Scalability: Unlimited storage │
|
|
78
|
+
│ Durability: 99.999999999% (11 nines) │
|
|
79
|
+
│ Availability: 99.99% SLA │
|
|
80
|
+
│ Versioning: Track file changes │
|
|
81
|
+
│ Lifecycle: Auto-archive to Glacier │
|
|
82
|
+
└────────────────────────────────────────────┘
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Example**: Multi-TB inventory extraction
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
// Extract millions of inventory records to S3
|
|
89
|
+
const s3Target = new S3DataSource(
|
|
90
|
+
{
|
|
91
|
+
type: 'S3_CSV',
|
|
92
|
+
s3Config: {
|
|
93
|
+
accessKeyId: process.env.TARGET_AWS_ACCESS_KEY_ID!,
|
|
94
|
+
secretAccessKey: process.env.TARGET_AWS_SECRET_ACCESS_KEY!,
|
|
95
|
+
region: 'us-west-2',
|
|
96
|
+
bucket: 'extraction-bucket',
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
logger
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// S3 handles large files effortlessly
|
|
103
|
+
await s3Target.writeFile(
|
|
104
|
+
's3://extraction-bucket/inventory-full.parquet',
|
|
105
|
+
parquetData // 10+ GB file
|
|
106
|
+
);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### ✅ Deploying to Serverless/Versori Platforms
|
|
110
|
+
|
|
111
|
+
**Scenario**: Running in AWS Lambda, Versori, or other serverless environments.
|
|
112
|
+
|
|
113
|
+
**Why S3?**
|
|
114
|
+
|
|
115
|
+
- No persistent connections needed (stateless HTTP)
|
|
116
|
+
- Presigned URLs work everywhere
|
|
117
|
+
- No network complexity (firewall rules, IP whitelisting)
|
|
118
|
+
- Native AWS integration
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// Versori connector using S3 (zero connection config)
|
|
122
|
+
import { createClient, S3DataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
123
|
+
|
|
124
|
+
export const inventorySync = webhook('s3-inventory', async (ctx) => {
|
|
125
|
+
const client = await createClient(ctx); // Auto-detects Versori context
|
|
126
|
+
|
|
127
|
+
const s3Source = new S3DataSource(
|
|
128
|
+
{
|
|
129
|
+
type: 'S3_CSV',
|
|
130
|
+
s3Config: {
|
|
131
|
+
accessKeyId: activation.env.AWS_ACCESS_KEY_ID,
|
|
132
|
+
secretAccessKey: activation.env.AWS_SECRET_ACCESS_KEY,
|
|
133
|
+
region: 'us-east-1',
|
|
134
|
+
bucket: activation.env.S3_BUCKET,
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
log
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Works instantly - no connection pooling or SSH setup
|
|
141
|
+
const inventory = await s3Source.downloadFile('file.csv');
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### ✅ Need Global Distribution
|
|
146
|
+
|
|
147
|
+
**Scenario**: Multi-region deployments requiring low-latency access worldwide.
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
S3 + CloudFront Architecture:
|
|
151
|
+
┌─────────────────┐
|
|
152
|
+
│ S3 us-east-1 │◄─── Upload inventory files
|
|
153
|
+
└────────┬────────┘
|
|
154
|
+
│
|
|
155
|
+
▼
|
|
156
|
+
┌─────────────────┐
|
|
157
|
+
│ CloudFront CDN │◄─── Global edge caching
|
|
158
|
+
└────────┬────────┘
|
|
159
|
+
│
|
|
160
|
+
┌────┴────┬────────┬────────┐
|
|
161
|
+
▼ ▼ ▼ ▼
|
|
162
|
+
EU Asia-Pacific US LATAM
|
|
163
|
+
(low latency everywhere)
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
### Use SFTP When:
|
|
169
|
+
|
|
170
|
+
#### ✅ Integrating with Vendor/Partner Systems
|
|
171
|
+
|
|
172
|
+
**Scenario**: Your vendor provides inventory files via SFTP and won't change their process.
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
// Vendor requires SFTP pickup
|
|
176
|
+
import { SftpDataSource } from '@fluentcommerce/fc-connect-sdk';
|
|
177
|
+
|
|
178
|
+
const vendorSftp = new SftpDataSource(
|
|
179
|
+
{
|
|
180
|
+
type: 'SFTP_CSV',
|
|
181
|
+
connectionId: 'vendor-abc',
|
|
182
|
+
settings: {
|
|
183
|
+
host: 'sftp.vendor-abc.com',
|
|
184
|
+
port: 22,
|
|
185
|
+
username: 'integration_user',
|
|
186
|
+
privateKey: process.env.VENDOR_SFTP_KEY,
|
|
187
|
+
remotePath: '/outbound/inventory',
|
|
188
|
+
filePattern: 'inventory_*.csv',
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
logger
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
// Read vendor's latest file
|
|
195
|
+
const files = await vendorSftp.listFiles();
|
|
196
|
+
const latestFile = files[0];
|
|
197
|
+
const inventory = await vendorSftp.downloadFile(latestFile.path);
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Why SFTP?**
|
|
201
|
+
|
|
202
|
+
- Vendor dictates the integration method
|
|
203
|
+
- No cloud infrastructure setup required on vendor side
|
|
204
|
+
- Works with any vendor (no AWS account needed)
|
|
205
|
+
- Standard protocol (RFC 4253) - universal compatibility
|
|
206
|
+
|
|
207
|
+
#### ✅ Working with Enterprise Systems
|
|
208
|
+
|
|
209
|
+
**Scenario**: Enterprise ERP system that only supports SFTP for data exchange.
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
Enterprise ERP Integration Pattern:
|
|
213
|
+
┌─────────────────┐
|
|
214
|
+
│ SAP / Oracle ERP│
|
|
215
|
+
│ │
|
|
216
|
+
│ SFTP Module │◄─── Only supported export method
|
|
217
|
+
└────────┬────────┘
|
|
218
|
+
│ (SFTP pickup required)
|
|
219
|
+
▼
|
|
220
|
+
┌─────────────────┐
|
|
221
|
+
│ SftpDataSource │
|
|
222
|
+
│ (SDK) │
|
|
223
|
+
└────────┬────────┘
|
|
224
|
+
│
|
|
225
|
+
▼
|
|
226
|
+
┌─────────────────┐
|
|
227
|
+
│ Fluent Commerce │
|
|
228
|
+
└─────────────────┘
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**Example**: SAP inventory export
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
const sapSftp = new SftpDataSource(
|
|
235
|
+
{
|
|
236
|
+
type: 'SFTP_CSV',
|
|
237
|
+
connectionId: 'sap-prod',
|
|
238
|
+
settings: {
|
|
239
|
+
host: 'sap-server.enterprise.internal',
|
|
240
|
+
port: 22,
|
|
241
|
+
username: 'fluent_integration',
|
|
242
|
+
password: process.env.SAP_SFTP_PASSWORD,
|
|
243
|
+
remotePath: '/exports/inventory',
|
|
244
|
+
filePattern: 'INV_*.csv',
|
|
245
|
+
},
|
|
246
|
+
},
|
|
247
|
+
logger
|
|
248
|
+
);
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
#### ✅ Required by Compliance/Security Policies
|
|
252
|
+
|
|
253
|
+
**Scenario**: Company security policy mandates SFTP for PII or financial data.
|
|
254
|
+
|
|
255
|
+
**SFTP Security Advantages**:
|
|
256
|
+
|
|
257
|
+
- Direct encrypted channel (SSH)
|
|
258
|
+
- No data stored in cloud
|
|
259
|
+
- Audit logs on company servers
|
|
260
|
+
- Fine-grained access control (SSH keys per user)
|
|
261
|
+
- No external cloud dependencies
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
// HIPAA-compliant patient data transfer
|
|
265
|
+
const secureSftp = new SftpDataSource(
|
|
266
|
+
{
|
|
267
|
+
type: 'SFTP_CSV',
|
|
268
|
+
connectionId: 'hipaa-sftp',
|
|
269
|
+
settings: {
|
|
270
|
+
host: 'secure-sftp.healthcare.internal',
|
|
271
|
+
port: 2222, // Non-standard port for security
|
|
272
|
+
username: 'phi_integration',
|
|
273
|
+
privateKey: process.env.SFTP_PRIVATE_KEY,
|
|
274
|
+
passphrase: process.env.SFTP_KEY_PASSPHRASE,
|
|
275
|
+
remotePath: '/phi/exports',
|
|
276
|
+
strictHostKeyChecking: true,
|
|
277
|
+
knownHosts: process.env.SFTP_KNOWN_HOSTS,
|
|
278
|
+
},
|
|
279
|
+
},
|
|
280
|
+
logger
|
|
281
|
+
);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
#### ✅ Vendor Provides SFTP-Only Access
|
|
285
|
+
|
|
286
|
+
**Scenario**: Third-party logistics (3PL) provider only offers SFTP for inventory updates.
|
|
287
|
+
|
|
288
|
+
**Example Decision Matrix**:
|
|
289
|
+
|
|
290
|
+
| Vendor Type | Typical Protocol | SDK Choice |
|
|
291
|
+
| ----------------- | ---------------- | ---------------- |
|
|
292
|
+
| 3PL / Warehouse | SFTP | `SftpDataSource` |
|
|
293
|
+
| Cloud Marketplace | REST API + S3 | `S3DataSource` |
|
|
294
|
+
| Enterprise Supplier | SFTP / FTP | `SftpDataSource` |
|
|
295
|
+
| Modern SaaS | Webhook + S3 | `S3DataSource` |
|
|
296
|
+
| Enterprise ERP | SFTP / EDI | `SftpDataSource` |
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Architecture Overview
|
|
301
|
+
|
|
302
|
+
### S3DataSource Architecture
|
|
303
|
+
|
|
304
|
+
```
|
|
305
|
+
┌──────────────────────────────────────────────────────────┐
|
|
306
|
+
│ S3DataSource │
|
|
307
|
+
│ (Presigned URL Architecture - Universal Compatibility) │
|
|
308
|
+
└──────────────────┬───────────────────────────────────────┘
|
|
309
|
+
│
|
|
310
|
+
┌─────────┴─────────┐
|
|
311
|
+
│ │
|
|
312
|
+
▼ ▼
|
|
313
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
314
|
+
│ S3PresignService│ │ Native fetch() │
|
|
315
|
+
│ (SigV4 signing) │ │ (HTTP client) │
|
|
316
|
+
└────────┬────────┘ └────────┬────────┘
|
|
317
|
+
│ │
|
|
318
|
+
▼ ▼
|
|
319
|
+
Generate URL Execute Request
|
|
320
|
+
│ │
|
|
321
|
+
└──────────┬──────────┘
|
|
322
|
+
▼
|
|
323
|
+
┌─────────────────────┐
|
|
324
|
+
│ AWS S3 Bucket │
|
|
325
|
+
│ (HTTPS endpoint) │
|
|
326
|
+
└─────────────────────┘
|
|
327
|
+
|
|
328
|
+
Key Benefits:
|
|
329
|
+
✅ No AWS SDK bundling (smaller package size)
|
|
330
|
+
✅ Works in Node.js, Deno, Versori
|
|
331
|
+
✅ Simple fetch() API (standard Web API)
|
|
332
|
+
✅ Automatic signature generation
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**Core Components**:
|
|
336
|
+
|
|
337
|
+
- `S3DataSource`: High-level file operations API
|
|
338
|
+
- `S3PresignService`: Generates signed URLs (AWS SigV4)
|
|
339
|
+
- Native `fetch()`: Executes HTTP requests to S3
|
|
340
|
+
|
|
341
|
+
**Why Presigned URLs?**
|
|
342
|
+
|
|
343
|
+
- Universal compatibility (no platform-specific code)
|
|
344
|
+
- Smaller bundle size (no AWS SDK)
|
|
345
|
+
- Simpler debugging (plain HTTP requests)
|
|
346
|
+
- Works with corporate proxies and firewalls
|
|
347
|
+
|
|
348
|
+
### SftpDataSource Architecture
|
|
349
|
+
|
|
350
|
+
```
|
|
351
|
+
┌──────────────────────────────────────────────────────────┐
|
|
352
|
+
│ SftpDataSource │
|
|
353
|
+
│ (Direct SSH - Connection Pooling) │
|
|
354
|
+
└──────────────────┬───────────────────────────────────────┘
|
|
355
|
+
│
|
|
356
|
+
┌─────────┴─────────┐
|
|
357
|
+
│ │
|
|
358
|
+
▼ ▼
|
|
359
|
+
┌─────────────────┐ ┌─────────────────┐
|
|
360
|
+
│ ssh2-sftp-client│ │ Connection Pool │
|
|
361
|
+
│ (SFTP protocol) │ │ (max 5 default) │
|
|
362
|
+
└────────┬────────┘ └────────┬────────┘
|
|
363
|
+
│ │
|
|
364
|
+
▼ ▼
|
|
365
|
+
SSH Handshake Reuse Connections
|
|
366
|
+
│ │
|
|
367
|
+
└──────────┬──────────┘
|
|
368
|
+
▼
|
|
369
|
+
┌─────────────────────┐
|
|
370
|
+
│ SFTP Server │
|
|
371
|
+
│ (SSH port 22) │
|
|
372
|
+
└─────────────────────┘
|
|
373
|
+
|
|
374
|
+
Key Benefits:
|
|
375
|
+
✅ Connection pooling (reduced overhead)
|
|
376
|
+
✅ Automatic retry with exponential backoff
|
|
377
|
+
✅ Password OR private key authentication
|
|
378
|
+
✅ Direct SSH encryption (no intermediary)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
**Core Components**:
|
|
382
|
+
|
|
383
|
+
- `SftpDataSource`: High-level file operations API
|
|
384
|
+
- `ssh2-sftp-client`: SSH/SFTP protocol implementation
|
|
385
|
+
- Connection pool: Reuses SSH connections efficiently
|
|
386
|
+
|
|
387
|
+
**Why Direct SSH?**
|
|
388
|
+
|
|
389
|
+
- Industry standard for B2B file transfer
|
|
390
|
+
- No cloud infrastructure required
|
|
391
|
+
- Works with any vendor
|
|
392
|
+
- Strong encryption (SSH)
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
## Configuration Fundamentals
|
|
397
|
+
|
|
398
|
+
### S3 Configuration Pattern
|
|
399
|
+
|
|
400
|
+
```typescript
|
|
401
|
+
import {
|
|
402
|
+
S3DataSource,
|
|
403
|
+
createConsoleLogger,
|
|
404
|
+
toStructuredLogger
|
|
405
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
406
|
+
|
|
407
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
408
|
+
logLevel: 'info'
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
// Minimal S3 configuration
|
|
412
|
+
const s3Source = new S3DataSource(
|
|
413
|
+
{
|
|
414
|
+
type: 'S3_CSV', // S3_JSON, S3_XML, S3_PARQUET
|
|
415
|
+
s3Config: {
|
|
416
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
417
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
418
|
+
region: 'us-east-1',
|
|
419
|
+
// Optional
|
|
420
|
+
sessionToken: process.env.AWS_SESSION_TOKEN,
|
|
421
|
+
endpoint: process.env.AWS_ENDPOINT, // For LocalStack testing
|
|
422
|
+
},
|
|
423
|
+
},
|
|
424
|
+
logger
|
|
425
|
+
);
|
|
426
|
+
|
|
427
|
+
// Usage
|
|
428
|
+
const content = await s3Source.downloadFile('path/to/file.csv');
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
**Configuration Properties**:
|
|
432
|
+
|
|
433
|
+
| Property | Required | Description | Default |
|
|
434
|
+
| -------------------------- | -------- | ------------------ | ----------- |
|
|
435
|
+
| `type` | ✅ | Data source type | - |
|
|
436
|
+
| `s3Config.accessKeyId` | ✅ | AWS access key | - |
|
|
437
|
+
| `s3Config.secretAccessKey` | ✅ | AWS secret key | - |
|
|
438
|
+
| `s3Config.region` | ✅ | AWS region | - |
|
|
439
|
+
| `s3Config.sessionToken` | ❌ | STS session token | - |
|
|
440
|
+
| `s3Config.endpoint` | ❌ | Custom S3 endpoint | AWS default |
|
|
441
|
+
|
|
442
|
+
### SFTP Configuration Pattern
|
|
443
|
+
|
|
444
|
+
```typescript
|
|
445
|
+
import {
|
|
446
|
+
SftpDataSource,
|
|
447
|
+
createConsoleLogger,
|
|
448
|
+
toStructuredLogger
|
|
449
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
450
|
+
|
|
451
|
+
const logger = toStructuredLogger(createConsoleLogger(), {
|
|
452
|
+
logLevel: 'info'
|
|
453
|
+
});
|
|
454
|
+
|
|
455
|
+
// Minimal SFTP configuration (password auth)
|
|
456
|
+
const sftpSource = new SftpDataSource(
|
|
457
|
+
{
|
|
458
|
+
type: 'SFTP_CSV', // SFTP_JSON, SFTP_JSONL, SFTP_PARQUET
|
|
459
|
+
connectionId: 'vendor-sftp',
|
|
460
|
+
name: 'Vendor SFTP Connection',
|
|
461
|
+
settings: {
|
|
462
|
+
host: 'sftp.vendor.com',
|
|
463
|
+
port: 22,
|
|
464
|
+
username: 'integration_user',
|
|
465
|
+
password: process.env.SFTP_PASSWORD,
|
|
466
|
+
remotePath: '/data/inventory',
|
|
467
|
+
filePattern: '*.csv',
|
|
468
|
+
},
|
|
469
|
+
},
|
|
470
|
+
logger
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
// Usage
|
|
474
|
+
const files = await sftpSource.listFiles();
|
|
475
|
+
const content = await sftpSource.downloadFile(files[0].path);
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
**Configuration Properties**:
|
|
479
|
+
|
|
480
|
+
| Property | Required | Description | Default |
|
|
481
|
+
| ---------------------------- | -------- | --------------------------------- | ------- |
|
|
482
|
+
| `type` | ✅ | Data source type | - |
|
|
483
|
+
| `connectionId` | ✅ | Unique connection ID | - |
|
|
484
|
+
| `settings.host` | ✅ | SFTP server hostname | - |
|
|
485
|
+
| `settings.port` | ❌ | SSH port | 22 |
|
|
486
|
+
| `settings.username` | ✅ | SSH username | - |
|
|
487
|
+
| `settings.password` | ✅\* | Password (or use privateKey) | - |
|
|
488
|
+
| `settings.privateKey` | ✅\* | SSH private key (or use password) | - |
|
|
489
|
+
| `settings.passphrase` | ❌ | Key passphrase (if encrypted) | - |
|
|
490
|
+
| `settings.remotePath` | ❌ | Remote directory path | `/` |
|
|
491
|
+
| `settings.filePattern` | ❌ | File glob pattern | `*` |
|
|
492
|
+
| `settings.maxConnections` | ❌ | Connection pool size | 5 |
|
|
493
|
+
| `settings.connectionTimeout` | ❌ | Connection timeout (ms) | 30000 |
|
|
494
|
+
|
|
495
|
+
\* Either `password` or `privateKey` required
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
## Universal Interface Design
|
|
500
|
+
|
|
501
|
+
Both `S3DataSource` and `SftpDataSource` implement the same core interface, making it easy to swap implementations:
|
|
502
|
+
|
|
503
|
+
```typescript
|
|
504
|
+
// Note: The two data sources expose similar high-level operations,
|
|
505
|
+
// but method names differ slightly.
|
|
506
|
+
// S3DataSource: listFiles, downloadFile, uploadFile, deleteFile, copyFile, moveFile, validateConnection
|
|
507
|
+
// SftpDataSource: listFiles, downloadFile, writeFile, uploadContent, deleteFile, copyFile, moveFile, createDirectory, fileExists, directoryExists, validateConnection
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
### Switching Between S3 and SFTP
|
|
511
|
+
|
|
512
|
+
**Example**: Switch from S3 to SFTP without changing business logic
|
|
513
|
+
|
|
514
|
+
```typescript
|
|
515
|
+
// Option 1: S3
|
|
516
|
+
const dataSource = new S3DataSource(
|
|
517
|
+
{
|
|
518
|
+
type: 'S3_CSV',
|
|
519
|
+
s3Config: {
|
|
520
|
+
/* ... */
|
|
521
|
+
},
|
|
522
|
+
},
|
|
523
|
+
logger
|
|
524
|
+
);
|
|
525
|
+
|
|
526
|
+
// Option 2: SFTP (same interface!)
|
|
527
|
+
const dataSource = new SftpDataSource(
|
|
528
|
+
{
|
|
529
|
+
type: 'SFTP_CSV',
|
|
530
|
+
connectionId: 'vendor',
|
|
531
|
+
settings: {
|
|
532
|
+
/* ... */
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
logger
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
// Business logic stays identical
|
|
539
|
+
const files = await dataSource.listFiles({ remotePath: 'inventory/' });
|
|
540
|
+
for (const file of files) {
|
|
541
|
+
const content = await dataSource.downloadFile(file.path);
|
|
542
|
+
const records = parseCSV(content as string);
|
|
543
|
+
await processRecords(records);
|
|
544
|
+
}
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
**Benefits**:
|
|
548
|
+
|
|
549
|
+
- Write business logic once
|
|
550
|
+
- Easy to test (swap for mock data source)
|
|
551
|
+
- Flexible deployment (change config, not code)
|
|
552
|
+
- Vendor migration (S3 → SFTP or vice versa)
|
|
553
|
+
|
|
554
|
+
Note: On SFTP, `parseParquetContent` is not implemented and throws. Use `ParquetParserService` after downloading the buffer.
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## Real-World Scenarios
|
|
559
|
+
|
|
560
|
+
### Scenario 1: Modern E-Commerce Integration
|
|
561
|
+
|
|
562
|
+
**Requirements**:
|
|
563
|
+
|
|
564
|
+
- Ingest inventory from internal warehouse system
|
|
565
|
+
- High volume (100K+ SKUs daily)
|
|
566
|
+
- Need to scale globally
|
|
567
|
+
- Team controls infrastructure
|
|
568
|
+
|
|
569
|
+
**Decision**: **S3DataSource**
|
|
570
|
+
|
|
571
|
+
```typescript
|
|
572
|
+
// Why S3:
|
|
573
|
+
// ✅ Internal system (we control both ends)
|
|
574
|
+
// ✅ High volume (S3 scales infinitely)
|
|
575
|
+
// ✅ Global deployment (CloudFront distribution)
|
|
576
|
+
// ✅ No vendor coordination needed
|
|
577
|
+
|
|
578
|
+
const inventorySource = new S3DataSource(
|
|
579
|
+
{
|
|
580
|
+
type: 'S3_CSV',
|
|
581
|
+
s3Config: {
|
|
582
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
|
|
583
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
|
|
584
|
+
region: 'us-east-1',
|
|
585
|
+
},
|
|
586
|
+
},
|
|
587
|
+
logger
|
|
588
|
+
);
|
|
589
|
+
|
|
590
|
+
// Warehouse uploads to S3, we process
|
|
591
|
+
const inventory = await inventorySource.downloadFile('daily-inventory.csv');
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
### Scenario 2: Third-Party Logistics (3PL) Integration
|
|
597
|
+
|
|
598
|
+
**Requirements**:
|
|
599
|
+
|
|
600
|
+
- 3PL provides inventory via SFTP only
|
|
601
|
+
- Medium volume (10K SKUs, hourly updates)
|
|
602
|
+
- 3PL won't change their process
|
|
603
|
+
- Security: SSH key authentication required
|
|
604
|
+
|
|
605
|
+
**Decision**: **SftpDataSource**
|
|
606
|
+
|
|
607
|
+
```typescript
|
|
608
|
+
// Why SFTP:
|
|
609
|
+
// ✅ Vendor requirement (SFTP only)
|
|
610
|
+
// ✅ No control over vendor infrastructure
|
|
611
|
+
// ✅ Standard B2B integration protocol
|
|
612
|
+
// ✅ SSH key authentication supported
|
|
613
|
+
|
|
614
|
+
const threePlSftp = new SftpDataSource(
|
|
615
|
+
{
|
|
616
|
+
type: 'SFTP_CSV',
|
|
617
|
+
connectionId: '3pl-vendor',
|
|
618
|
+
settings: {
|
|
619
|
+
host: 'sftp.3plvendor.com',
|
|
620
|
+
port: 22,
|
|
621
|
+
username: 'fluent_integration',
|
|
622
|
+
privateKey: process.env.SFTP_PRIVATE_KEY,
|
|
623
|
+
remotePath: '/outbound/inventory',
|
|
624
|
+
filePattern: 'inventory_*.csv',
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
logger
|
|
628
|
+
);
|
|
629
|
+
|
|
630
|
+
// Poll for new files
|
|
631
|
+
const files = await threePlSftp.listFiles();
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
---
|
|
635
|
+
|
|
636
|
+
### Scenario 3: Hybrid Architecture
|
|
637
|
+
|
|
638
|
+
**Requirements**:
|
|
639
|
+
|
|
640
|
+
- Ingest from multiple vendors (S3 + SFTP)
|
|
641
|
+
- Extract to data lake (S3)
|
|
642
|
+
- Unified processing pipeline
|
|
643
|
+
|
|
644
|
+
**Decision**: **Both S3DataSource and SftpDataSource**
|
|
645
|
+
|
|
646
|
+
```typescript
|
|
647
|
+
// Vendor A: Provides S3 bucket
|
|
648
|
+
const vendorA = new S3DataSource(
|
|
649
|
+
{
|
|
650
|
+
type: 'S3_CSV',
|
|
651
|
+
s3Config: {
|
|
652
|
+
accessKeyId: process.env.VENDOR_A_KEY!,
|
|
653
|
+
secretAccessKey: process.env.VENDOR_A_SECRET!,
|
|
654
|
+
region: 'us-west-2',
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
logger
|
|
658
|
+
);
|
|
659
|
+
|
|
660
|
+
// Vendor B: Provides SFTP server
|
|
661
|
+
const vendorB = new SftpDataSource(
|
|
662
|
+
{
|
|
663
|
+
type: 'SFTP_CSV',
|
|
664
|
+
connectionId: 'vendor-b',
|
|
665
|
+
settings: {
|
|
666
|
+
host: 'sftp.vendorb.com',
|
|
667
|
+
username: 'integration',
|
|
668
|
+
privateKey: process.env.VENDOR_B_KEY,
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
logger
|
|
672
|
+
);
|
|
673
|
+
|
|
674
|
+
// Unified processing function (works with both!)
|
|
675
|
+
async function ingestInventory(dataSource: DataSource, prefix: string) {
|
|
676
|
+
const files = await dataSource.listFiles(prefix);
|
|
677
|
+
for (const file of files) {
|
|
678
|
+
const content = await dataSource.downloadFile(file.path);
|
|
679
|
+
await processInventory(content);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// Process both vendors with same code
|
|
684
|
+
await ingestInventory(vendorA, 'inventory/');
|
|
685
|
+
await ingestInventory(vendorB, 'inventory/');
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
---
|
|
689
|
+
|
|
690
|
+
## Summary
|
|
691
|
+
|
|
692
|
+
### Key Takeaways
|
|
693
|
+
|
|
694
|
+
1. **S3 for cloud-native**: When you control infrastructure and need scalability
|
|
695
|
+
2. **SFTP for vendor integrations**: When working with external partners or enterprise systems
|
|
696
|
+
3. **Universal interface**: Same API for both S3 and SFTP
|
|
697
|
+
4. **Presigned URLs (S3)**: Universal compatibility without AWS SDK bundling
|
|
698
|
+
5. **Direct SSH (SFTP)**: Standard protocol for B2B file exchange
|
|
699
|
+
|
|
700
|
+
### Decision Flowchart
|
|
701
|
+
|
|
702
|
+
```
|
|
703
|
+
Do you control the infrastructure?
|
|
704
|
+
│
|
|
705
|
+
┌────┴────┐
|
|
706
|
+
YES NO
|
|
707
|
+
│ │
|
|
708
|
+
│ └──► Use SFTP (vendor requirement)
|
|
709
|
+
│
|
|
710
|
+
Is this a cloud-native integration?
|
|
711
|
+
│
|
|
712
|
+
┌────┴────┐
|
|
713
|
+
YES NO
|
|
714
|
+
│ │
|
|
715
|
+
└──► S3 └──► Is volume high (>10K records/hour)?
|
|
716
|
+
│
|
|
717
|
+
┌────┴────┐
|
|
718
|
+
YES NO
|
|
719
|
+
│ │
|
|
720
|
+
└──► S3 └──► Either (your preference)
|
|
721
|
+
```
|
|
722
|
+
|
|
723
|
+
---
|
|
724
|
+
|
|
725
|
+
## Next Steps
|
|
726
|
+
|
|
727
|
+
**Ready for S3?** → [Module 2: S3 Operations](./data-sources-02-s3-operations.md)
|
|
728
|
+
|
|
729
|
+
**Ready for SFTP?** → [Module 3: SFTP Operations](./data-sources-03-sftp-operations.md)
|
|
730
|
+
|
|
731
|
+
**Need both?** → Read both modules, then [Module 4: File Processing Patterns](./data-sources-04-file-patterns.md)
|
|
732
|
+
|
|
733
|
+
---
|
|
734
|
+
|
|
735
|
+
[← Back to Guide](../data-sources-readme.md) | [Next: S3 Operations →](./data-sources-02-s3-operations.md)
|