@effect-app/infra 0.7.0
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/.eslintrc.cjs +11 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-314902b6271c341511f7398a50469024 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-3f072cc7afa09b6adaead0527ab9df83 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-74c3c295c110fc861b6a4c673afc3e24 +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-bf6dae8cb9ea9740ceb39aefaf12716c +0 -0
- package/.jest-cache/haste-map-369fa5ca2164cc35b19159bd76147276-e7a7ff05756c055cb63be97ba8537525-cf9d1486029526079a5f68f2041dea02 +0 -0
- package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-b4710ed9fb3d0757c4bf23045c585670 +0 -0
- package/.jest-cache/haste-map-4ca41cc04e60c616a19cbb483cbf487b-e2f1f4b6d87214e3c49442fed31f310c-ee17e5395bb1b7b36a4e2e22a6ae1449 +0 -0
- package/.jest-cache/haste-map-7dc16d7fae8c072843ed1c69eae73100-a8a4225b317477b49bca31f54559afb3-c16136699bb7f463be85273162b447c3 +0 -0
- package/.jest-cache/haste-map-9aa1e395a82e108eb49698982c574272-e2f1f4b6d87214e3c49442fed31f310c-f7435f46fc41ac5a13d06a49cae9a650 +0 -0
- package/.jest-cache/haste-map-9d206b45d610536c9ec65eec263c6964-a8a4225b317477b49bca31f54559afb3-3510506a330b44f1ae629033aac8fbb3 +0 -0
- package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-17b550b450b18840c25861aa6e835f0c +0 -0
- package/.jest-cache/haste-map-a00ab30d0d656f9d3990958a54b9ccfd-87603b0fc921b26b622a5859b4c92bed-4dc31290b1efc98335eb4c89167d75c3 +0 -0
- package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-997106edf4bbc31567a378146180e45e +0 -0
- package/.jest-cache/haste-map-ab843cb0ffbadfd0deea4adb182c7ecd-87603b0fc921b26b622a5859b4c92bed-f0cd25414f9ed16c446940ca3aa23c1b +0 -0
- package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-2cac07d09e6384e2d37c49714edad0ba +0 -0
- package/.jest-cache/haste-map-cf17f2edf0e949eebfdfca561816457c-e7a7ff05756c055cb63be97ba8537525-d7967c2976c5feac7161c964f0aa442f +0 -0
- package/.jest-cache/haste-map-fb1a173276d25bbff02f815600059283-938122bdc1c8836874b6585d7acb2e99-f705929cca05ce95ceaa6d520b560ce8 +0 -0
- package/.prettierignore +6 -0
- package/_cjs/_global.cjs +6 -0
- package/_cjs/_global.cjs.map +1 -0
- package/_cjs/_global.ext.cjs +6 -0
- package/_cjs/_global.ext.cjs.map +1 -0
- package/_cjs/_global.schema.cjs +5 -0
- package/_cjs/_global.schema.cjs.map +1 -0
- package/_cjs/errors.cjs +82 -0
- package/_cjs/errors.cjs.map +1 -0
- package/_cjs/ext.cjs +4 -0
- package/_cjs/ext.cjs.map +1 -0
- package/_cjs/index.cjs +6 -0
- package/_cjs/index.cjs.map +1 -0
- package/_cjs/lib/RequestContext.cjs +70 -0
- package/_cjs/lib/RequestContext.cjs.map +1 -0
- package/_cjs/lib/api/authorization.jwt.cjs +44 -0
- package/_cjs/lib/api/authorization.jwt.cjs.map +1 -0
- package/_cjs/lib/api/defaultErrorHandler.cjs +45 -0
- package/_cjs/lib/api/defaultErrorHandler.cjs.map +1 -0
- package/_cjs/lib/api/reportError.cjs +64 -0
- package/_cjs/lib/api/reportError.cjs.map +1 -0
- package/_cjs/lib/api/routing.cjs +262 -0
- package/_cjs/lib/api/routing.cjs.map +1 -0
- package/_cjs/lib/api/setupRequest.cjs +35 -0
- package/_cjs/lib/api/setupRequest.cjs.map +1 -0
- package/_cjs/lib/api/util.cjs +17 -0
- package/_cjs/lib/api/util.cjs.map +1 -0
- package/_cjs/lib/api/writeDocs.cjs +31 -0
- package/_cjs/lib/api/writeDocs.cjs.map +1 -0
- package/_cjs/lib/errorReporter.cjs +72 -0
- package/_cjs/lib/errorReporter.cjs.map +1 -0
- package/_cjs/lib/ext/Array.cjs +30 -0
- package/_cjs/lib/ext/Array.cjs.map +1 -0
- package/_cjs/lib/fileUtil.cjs +36 -0
- package/_cjs/lib/fileUtil.cjs.map +1 -0
- package/_cjs/lib/filter/types/errors.cjs +6 -0
- package/_cjs/lib/filter/types/errors.cjs.map +1 -0
- package/_cjs/lib/filter/types/fields.cjs +6 -0
- package/_cjs/lib/filter/types/fields.cjs.map +1 -0
- package/_cjs/lib/filter/types/index.cjs +61 -0
- package/_cjs/lib/filter/types/index.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/common.cjs +6 -0
- package/_cjs/lib/filter/types/path/common.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/eager.cjs +6 -0
- package/_cjs/lib/filter/types/path/eager.cjs.map +1 -0
- package/_cjs/lib/filter/types/path/index.cjs +8 -0
- package/_cjs/lib/filter/types/path/index.cjs.map +1 -0
- package/_cjs/lib/filter/types/utils.cjs +6 -0
- package/_cjs/lib/filter/types/utils.cjs.map +1 -0
- package/_cjs/lib/filter/types/validator.cjs +6 -0
- package/_cjs/lib/filter/types/validator.cjs.map +1 -0
- package/_cjs/lib/filter.cjs +238 -0
- package/_cjs/lib/filter.cjs.map +1 -0
- package/_cjs/lib/instrument.cjs +20 -0
- package/_cjs/lib/instrument.cjs.map +1 -0
- package/_cjs/lib/rateLimit.cjs +88 -0
- package/_cjs/lib/rateLimit.cjs.map +1 -0
- package/_cjs/services/CUPS/service.cjs +15 -0
- package/_cjs/services/CUPS/service.cjs.map +1 -0
- package/_cjs/services/CUPS.cjs +113 -0
- package/_cjs/services/CUPS.cjs.map +1 -0
- package/_cjs/services/Cache.cjs +39 -0
- package/_cjs/services/Cache.cjs.map +1 -0
- package/_cjs/services/Emailer/Sendgrid.cjs +112 -0
- package/_cjs/services/Emailer/Sendgrid.cjs.map +1 -0
- package/_cjs/services/Emailer/fake.cjs +24 -0
- package/_cjs/services/Emailer/fake.cjs.map +1 -0
- package/_cjs/services/Emailer/service.cjs +12 -0
- package/_cjs/services/Emailer/service.cjs.map +1 -0
- package/_cjs/services/Emailer.cjs +17 -0
- package/_cjs/services/Emailer.cjs.map +1 -0
- package/_cjs/services/Repository.cjs +247 -0
- package/_cjs/services/Repository.cjs.map +1 -0
- package/_cjs/services/ServiceBus.cjs +69 -0
- package/_cjs/services/ServiceBus.cjs.map +1 -0
- package/_cjs/services/Store/Cosmos.cjs +324 -0
- package/_cjs/services/Store/Cosmos.cjs.map +1 -0
- package/_cjs/services/Store/Cosmos.test.cjs +59 -0
- package/_cjs/services/Store/Cosmos.test.cjs.map +1 -0
- package/_cjs/services/Store/Disk.cjs +62 -0
- package/_cjs/services/Store/Disk.cjs.map +1 -0
- package/_cjs/services/Store/Memory.cjs +70 -0
- package/_cjs/services/Store/Memory.cjs.map +1 -0
- package/_cjs/services/Store/Redis.cjs +72 -0
- package/_cjs/services/Store/Redis.cjs.map +1 -0
- package/_cjs/services/Store/codeFilter.test.cjs +61 -0
- package/_cjs/services/Store/codeFilter.test.cjs.map +1 -0
- package/_cjs/services/Store/index.cjs +72 -0
- package/_cjs/services/Store/index.cjs.map +1 -0
- package/_cjs/services/Store/service.cjs +72 -0
- package/_cjs/services/Store/service.cjs.map +1 -0
- package/_cjs/services/Store/utils.cjs +78 -0
- package/_cjs/services/Store/utils.cjs.map +1 -0
- package/_cjs/services/Store.cjs +17 -0
- package/_cjs/services/Store.cjs.map +1 -0
- package/_cjs/services/memQueue.cjs +32 -0
- package/_cjs/services/memQueue.cjs.map +1 -0
- package/_cjs/test.arbs.cjs +32 -0
- package/_cjs/test.arbs.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs +14 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicBoolean.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs +29 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicNumber.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs +32 -0
- package/_cjs/vendor/Cache/Cache/_internal/AtomicReference.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs +266 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheInternal.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs +31 -0
- package/_cjs/vendor/Cache/Cache/_internal/CacheState.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs +67 -0
- package/_cjs/vendor/Cache/Cache/_internal/KeySet.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs +44 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapKey.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs +33 -0
- package/_cjs/vendor/Cache/Cache/_internal/MapValue.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/definition.cjs +13 -0
- package/_cjs/vendor/Cache/Cache/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations/make.cjs +20 -0
- package/_cjs/vendor/Cache/Cache/operations/make.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs +23 -0
- package/_cjs/vendor/Cache/Cache/operations/makeWith.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache/operations.cjs +28 -0
- package/_cjs/vendor/Cache/Cache/operations.cjs.map +1 -0
- package/_cjs/vendor/Cache/Cache.cjs +28 -0
- package/_cjs/vendor/Cache/Cache.cjs.map +1 -0
- package/_cjs/vendor/Cache/CacheStats/definition.cjs +13 -0
- package/_cjs/vendor/Cache/CacheStats/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/CacheStats.cjs +17 -0
- package/_cjs/vendor/Cache/CacheStats.cjs.map +1 -0
- package/_cjs/vendor/Cache/EntryStats/definition.cjs +11 -0
- package/_cjs/vendor/Cache/EntryStats/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/EntryStats.cjs +17 -0
- package/_cjs/vendor/Cache/EntryStats.cjs.map +1 -0
- package/_cjs/vendor/Cache/Lookup/definition.cjs +6 -0
- package/_cjs/vendor/Cache/Lookup/definition.cjs.map +1 -0
- package/_cjs/vendor/Cache/Lookup.cjs +17 -0
- package/_cjs/vendor/Cache/Lookup.cjs.map +1 -0
- package/_cjs/vendor/Cache/index.cjs +17 -0
- package/_cjs/vendor/Cache/index.cjs.map +1 -0
- package/_src/_global.ext.ts +34 -0
- package/_src/_global.schema.ts +10 -0
- package/_src/_global.ts +14 -0
- package/_src/errors.ts +50 -0
- package/_src/ext.ts +1 -0
- package/_src/index.ts +0 -0
- package/_src/lib/RequestContext.ts +132 -0
- package/_src/lib/api/authorization.jwt.ts +52 -0
- package/_src/lib/api/defaultErrorHandler.ts +92 -0
- package/_src/lib/api/reportError.ts +50 -0
- package/_src/lib/api/routing.ts +623 -0
- package/_src/lib/api/setupRequest.ts +22 -0
- package/_src/lib/api/util.ts +14 -0
- package/_src/lib/api/writeDocs.ts +26 -0
- package/_src/lib/errorReporter.ts +63 -0
- package/_src/lib/ext/Array.ts +32 -0
- package/_src/lib/fileUtil.ts +56 -0
- package/_src/lib/filter/types/errors.ts +47 -0
- package/_src/lib/filter/types/fields.ts +50 -0
- package/_src/lib/filter/types/index.ts +5 -0
- package/_src/lib/filter/types/path/common.ts +404 -0
- package/_src/lib/filter/types/path/eager.ts +146 -0
- package/_src/lib/filter/types/path/index.ts +14 -0
- package/_src/lib/filter/types/utils.ts +106 -0
- package/_src/lib/filter/types/validator.ts +46 -0
- package/_src/lib/filter.ts +323 -0
- package/_src/lib/instrument.ts +9 -0
- package/_src/lib/rateLimit.ts +126 -0
- package/_src/services/CUPS/service.ts +16 -0
- package/_src/services/CUPS.ts +105 -0
- package/_src/services/Cache.ts +45 -0
- package/_src/services/Emailer/Sendgrid.ts +123 -0
- package/_src/services/Emailer/fake.ts +14 -0
- package/_src/services/Emailer/service.ts +33 -0
- package/_src/services/Emailer.ts +1 -0
- package/_src/services/Repository.ts +513 -0
- package/_src/services/ServiceBus.ts +111 -0
- package/_src/services/Store/Cosmos.test.ts +91 -0
- package/_src/services/Store/Cosmos.ts +545 -0
- package/_src/services/Store/Disk.ts +81 -0
- package/_src/services/Store/Memory.ts +77 -0
- package/_src/services/Store/Redis.ts +92 -0
- package/_src/services/Store/codeFilter.test.ts +74 -0
- package/_src/services/Store/index.test.ts.bak +112 -0
- package/_src/services/Store/index.ts +62 -0
- package/_src/services/Store/service.ts +174 -0
- package/_src/services/Store/utils.ts +126 -0
- package/_src/services/Store.ts +1 -0
- package/_src/services/memQueue.ts +30 -0
- package/_src/test.arbs.ts +27 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicBoolean.ts +7 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicNumber.ts +28 -0
- package/_src/vendor/Cache/Cache/_internal/AtomicReference.ts +30 -0
- package/_src/vendor/Cache/Cache/_internal/CacheInternal.ts +293 -0
- package/_src/vendor/Cache/Cache/_internal/CacheState.ts +56 -0
- package/_src/vendor/Cache/Cache/_internal/KeySet.ts +58 -0
- package/_src/vendor/Cache/Cache/_internal/MapKey.ts +43 -0
- package/_src/vendor/Cache/Cache/_internal/MapValue.ts +39 -0
- package/_src/vendor/Cache/Cache/definition.ts +112 -0
- package/_src/vendor/Cache/Cache/operations/make.ts +17 -0
- package/_src/vendor/Cache/Cache/operations/makeWith.ts +32 -0
- package/_src/vendor/Cache/Cache/operations.ts +4 -0
- package/_src/vendor/Cache/Cache.ts +4 -0
- package/_src/vendor/Cache/CacheStats/definition.ts +23 -0
- package/_src/vendor/Cache/CacheStats.ts +3 -0
- package/_src/vendor/Cache/EntryStats/definition.ts +19 -0
- package/_src/vendor/Cache/EntryStats.ts +3 -0
- package/_src/vendor/Cache/Lookup/definition.ts +15 -0
- package/_src/vendor/Cache/Lookup.ts +3 -0
- package/_src/vendor/Cache/global.ts.bak +23 -0
- package/_src/vendor/Cache/index.ts +4 -0
- package/dist/_global.d.ts +10 -0
- package/dist/_global.d.ts.map +1 -0
- package/dist/_global.ext.d.ts +34 -0
- package/dist/_global.ext.d.ts.map +1 -0
- package/dist/_global.ext.js +2 -0
- package/dist/_global.js +12 -0
- package/dist/_global.schema.d.ts +6 -0
- package/dist/_global.schema.d.ts.map +1 -0
- package/dist/_global.schema.js +9 -0
- package/dist/errors.d.ts +41 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/ext.d.ts +2 -0
- package/dist/ext.d.ts.map +1 -0
- package/dist/ext.js +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/lib/RequestContext.d.ts +122 -0
- package/dist/lib/RequestContext.d.ts.map +1 -0
- package/dist/lib/RequestContext.js +52 -0
- package/dist/lib/api/authorization.jwt.d.ts +7 -0
- package/dist/lib/api/authorization.jwt.d.ts.map +1 -0
- package/dist/lib/api/authorization.jwt.js +32 -0
- package/dist/lib/api/defaultErrorHandler.d.ts +8 -0
- package/dist/lib/api/defaultErrorHandler.d.ts.map +1 -0
- package/dist/lib/api/defaultErrorHandler.js +37 -0
- package/dist/lib/api/reportError.d.ts +32 -0
- package/dist/lib/api/reportError.d.ts.map +1 -0
- package/dist/lib/api/reportError.js +44 -0
- package/dist/lib/api/routing.d.ts +100 -0
- package/dist/lib/api/routing.d.ts.map +1 -0
- package/dist/lib/api/routing.js +248 -0
- package/dist/lib/api/setupRequest.d.ts +13 -0
- package/dist/lib/api/setupRequest.d.ts.map +1 -0
- package/dist/lib/api/setupRequest.js +25 -0
- package/dist/lib/api/util.d.ts +3 -0
- package/dist/lib/api/util.d.ts.map +1 -0
- package/dist/lib/api/util.js +14 -0
- package/dist/lib/api/writeDocs.d.ts +3 -0
- package/dist/lib/api/writeDocs.d.ts.map +1 -0
- package/dist/lib/api/writeDocs.js +23 -0
- package/dist/lib/errorReporter.d.ts +8 -0
- package/dist/lib/errorReporter.d.ts.map +1 -0
- package/dist/lib/errorReporter.js +45 -0
- package/dist/lib/ext/Array.d.ts +19 -0
- package/dist/lib/ext/Array.d.ts.map +1 -0
- package/dist/lib/ext/Array.js +21 -0
- package/dist/lib/fileUtil.d.ts +22 -0
- package/dist/lib/fileUtil.d.ts.map +1 -0
- package/dist/lib/fileUtil.js +23 -0
- package/dist/lib/filter/types/errors.d.ts +30 -0
- package/dist/lib/filter/types/errors.d.ts.map +1 -0
- package/dist/lib/filter/types/errors.js +2 -0
- package/dist/lib/filter/types/fields.d.ts +29 -0
- package/dist/lib/filter/types/fields.d.ts.map +1 -0
- package/dist/lib/filter/types/fields.js +2 -0
- package/dist/lib/filter/types/index.d.ts +6 -0
- package/dist/lib/filter/types/index.d.ts.map +1 -0
- package/dist/lib/filter/types/index.js +6 -0
- package/dist/lib/filter/types/path/common.d.ts +316 -0
- package/dist/lib/filter/types/path/common.d.ts.map +1 -0
- package/dist/lib/filter/types/path/common.js +2 -0
- package/dist/lib/filter/types/path/eager.d.ts +95 -0
- package/dist/lib/filter/types/path/eager.d.ts.map +1 -0
- package/dist/lib/filter/types/path/eager.js +2 -0
- package/dist/lib/filter/types/path/index.d.ts +4 -0
- package/dist/lib/filter/types/path/index.d.ts.map +1 -0
- package/dist/lib/filter/types/path/index.js +4 -0
- package/dist/lib/filter/types/utils.d.ts +68 -0
- package/dist/lib/filter/types/utils.d.ts.map +1 -0
- package/dist/lib/filter/types/utils.js +2 -0
- package/dist/lib/filter/types/validator.d.ts +30 -0
- package/dist/lib/filter/types/validator.d.ts.map +1 -0
- package/dist/lib/filter/types/validator.js +2 -0
- package/dist/lib/filter.d.ts +133 -0
- package/dist/lib/filter.d.ts.map +1 -0
- package/dist/lib/filter.js +171 -0
- package/dist/lib/instrument.d.ts +7 -0
- package/dist/lib/instrument.d.ts.map +1 -0
- package/dist/lib/instrument.js +12 -0
- package/dist/lib/rateLimit.d.ts +43 -0
- package/dist/lib/rateLimit.d.ts.map +1 -0
- package/dist/lib/rateLimit.js +76 -0
- package/dist/services/CUPS/service.d.ts +19 -0
- package/dist/services/CUPS/service.d.ts.map +1 -0
- package/dist/services/CUPS/service.js +5 -0
- package/dist/services/CUPS.d.ts +10 -0
- package/dist/services/CUPS.d.ts.map +1 -0
- package/dist/services/CUPS.js +89 -0
- package/dist/services/Cache.d.ts +28 -0
- package/dist/services/Cache.d.ts.map +1 -0
- package/dist/services/Cache.js +28 -0
- package/dist/services/Emailer/Sendgrid.d.ts +180 -0
- package/dist/services/Emailer/Sendgrid.d.ts.map +1 -0
- package/dist/services/Emailer/Sendgrid.js +102 -0
- package/dist/services/Emailer/fake.d.ts +7 -0
- package/dist/services/Emailer/fake.d.ts.map +1 -0
- package/dist/services/Emailer/fake.js +15 -0
- package/dist/services/Emailer/service.d.ts +41 -0
- package/dist/services/Emailer/service.d.ts.map +1 -0
- package/dist/services/Emailer/service.js +3 -0
- package/dist/services/Emailer.d.ts +2 -0
- package/dist/services/Emailer.d.ts.map +1 -0
- package/dist/services/Emailer.js +2 -0
- package/dist/services/Repository.d.ts +300 -0
- package/dist/services/Repository.d.ts.map +1 -0
- package/dist/services/Repository.js +193 -0
- package/dist/services/ServiceBus.d.ts +26 -0
- package/dist/services/ServiceBus.d.ts.map +1 -0
- package/dist/services/ServiceBus.js +53 -0
- package/dist/services/Store/Cosmos.d.ts +56 -0
- package/dist/services/Store/Cosmos.d.ts.map +1 -0
- package/dist/services/Store/Cosmos.js +321 -0
- package/dist/services/Store/Cosmos.test.d.ts.map +1 -0
- package/dist/services/Store/Disk.d.ts +14 -0
- package/dist/services/Store/Disk.d.ts.map +1 -0
- package/dist/services/Store/Disk.js +52 -0
- package/dist/services/Store/Memory.d.ts +17 -0
- package/dist/services/Store/Memory.d.ts.map +1 -0
- package/dist/services/Store/Memory.js +60 -0
- package/dist/services/Store/Redis.d.ts +12 -0
- package/dist/services/Store/Redis.d.ts.map +1 -0
- package/dist/services/Store/Redis.js +59 -0
- package/dist/services/Store/codeFilter.test.d.ts.map +1 -0
- package/dist/services/Store/index.d.ts +10 -0
- package/dist/services/Store/index.d.ts.map +1 -0
- package/dist/services/Store/index.js +52 -0
- package/dist/services/Store/service.d.ts +113 -0
- package/dist/services/Store/service.d.ts.map +1 -0
- package/dist/services/Store/service.js +63 -0
- package/dist/services/Store/utils.d.ts +14 -0
- package/dist/services/Store/utils.d.ts.map +1 -0
- package/dist/services/Store/utils.js +103 -0
- package/dist/services/Store.d.ts +2 -0
- package/dist/services/Store.d.ts.map +1 -0
- package/dist/services/Store.js +2 -0
- package/dist/services/memQueue.d.ts +18 -0
- package/dist/services/memQueue.d.ts.map +1 -0
- package/dist/services/memQueue.js +24 -0
- package/dist/test.arbs.d.ts +13 -0
- package/dist/test.arbs.d.ts.map +1 -0
- package/dist/test.arbs.js +22 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts +5 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicBoolean.js +7 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts +8 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicNumber.js +22 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts +10 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/AtomicReference.js +25 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts +51 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/CacheInternal.js +253 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts +33 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/CacheState.js +21 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts +20 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/KeySet.js +61 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts +24 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/MapKey.js +37 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts +32 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/_internal/MapValue.js +24 -0
- package/dist/vendor/Cache/Cache/definition.d.ts +100 -0
- package/dist/vendor/Cache/Cache/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/definition.js +5 -0
- package/dist/vendor/Cache/Cache/operations/make.d.ts +12 -0
- package/dist/vendor/Cache/Cache/operations/make.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations/make.js +12 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts +14 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations/makeWith.js +15 -0
- package/dist/vendor/Cache/Cache/operations.d.ts +3 -0
- package/dist/vendor/Cache/Cache/operations.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache/operations.js +4 -0
- package/dist/vendor/Cache/Cache.d.ts +3 -0
- package/dist/vendor/Cache/Cache.d.ts.map +1 -0
- package/dist/vendor/Cache/Cache.js +4 -0
- package/dist/vendor/Cache/CacheStats/definition.d.ts +19 -0
- package/dist/vendor/Cache/CacheStats/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/CacheStats/definition.js +6 -0
- package/dist/vendor/Cache/CacheStats.d.ts +2 -0
- package/dist/vendor/Cache/CacheStats.d.ts.map +1 -0
- package/dist/vendor/Cache/CacheStats.js +3 -0
- package/dist/vendor/Cache/EntryStats/definition.d.ts +17 -0
- package/dist/vendor/Cache/EntryStats/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/EntryStats/definition.js +4 -0
- package/dist/vendor/Cache/EntryStats.d.ts +2 -0
- package/dist/vendor/Cache/EntryStats.d.ts.map +1 -0
- package/dist/vendor/Cache/EntryStats.js +3 -0
- package/dist/vendor/Cache/Lookup/definition.d.ts +17 -0
- package/dist/vendor/Cache/Lookup/definition.d.ts.map +1 -0
- package/dist/vendor/Cache/Lookup/definition.js +2 -0
- package/dist/vendor/Cache/Lookup.d.ts +2 -0
- package/dist/vendor/Cache/Lookup.d.ts.map +1 -0
- package/dist/vendor/Cache/Lookup.js +3 -0
- package/dist/vendor/Cache/index.d.ts +5 -0
- package/dist/vendor/Cache/index.d.ts.map +1 -0
- package/dist/vendor/Cache/index.js +5 -0
- package/package.json +756 -0
- package/tsconfig.json +107 -0
- package/tsconfig.json.bak +47 -0
- package/tsplus.config.json +6 -0
- package/types/modules.d.ts +1 -0
- package/vitest.config.ts +5 -0
- package/wallaby.cjs +1 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executes the specified effect, acquiring the specified number of permits
|
|
3
|
+
* immediately before the effect begins execution and releasing them
|
|
4
|
+
* delayed by duration after the effect completes execution, whether by success,
|
|
5
|
+
* failure, or interruption.
|
|
6
|
+
*
|
|
7
|
+
* @tsplus static effect/stm/TSemaphore.Ops withPermitsDuration
|
|
8
|
+
* @tsplus pipeable effect/stm/TSemaphore withPermitsDuration
|
|
9
|
+
*/
|
|
10
|
+
export function withPermitsDuration(permits: number, duration: DUR) {
|
|
11
|
+
return (self: TSemaphore): <R, E, A>(effect: Effect<R, E, A>) => Effect<R, E, A> => {
|
|
12
|
+
return effect =>
|
|
13
|
+
Effect.uninterruptibleMask(
|
|
14
|
+
restore =>
|
|
15
|
+
restore(self.acquireN(permits).commit)
|
|
16
|
+
> restore(effect)
|
|
17
|
+
.ensuring(
|
|
18
|
+
self.releaseN(permits)
|
|
19
|
+
.commit
|
|
20
|
+
.delay(duration)
|
|
21
|
+
)
|
|
22
|
+
)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Executes the specified effect, acquiring the specified number of permits
|
|
28
|
+
* immediately before the effect begins execution and releasing them
|
|
29
|
+
* delayed by duration after the effect completes execution, whether by success,
|
|
30
|
+
* failure, or interruption.
|
|
31
|
+
*
|
|
32
|
+
* @tsplus static effect/io/Effect/Semaphore.Ops withPermitsDuration
|
|
33
|
+
* @tsplus pipeable effect/io/Effect/Semaphore withPermitsDuration
|
|
34
|
+
*/
|
|
35
|
+
export function SEM_withPermitsDuration(permits: number, duration: DUR) {
|
|
36
|
+
return (self: Semaphore): <R, E, A>(effect: Effect<R, E, A>) => Effect<R, E, A> => {
|
|
37
|
+
return effect =>
|
|
38
|
+
Effect.uninterruptibleMask(
|
|
39
|
+
restore =>
|
|
40
|
+
restore(self.take(permits))
|
|
41
|
+
> restore(effect)
|
|
42
|
+
.ensuring(
|
|
43
|
+
self.release(permits)
|
|
44
|
+
.delay(duration)
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @tsplus pipeable Iterable batchNPar
|
|
52
|
+
* @tsplus static Collection.Aspects batchNPar
|
|
53
|
+
*/
|
|
54
|
+
export function batchNPar<R, E, A, R2, E2, A2, T>(
|
|
55
|
+
n: number,
|
|
56
|
+
forEachItem: (item: T, iWithinBatch: number, i: number) => Effect<R, E, A>,
|
|
57
|
+
forEachBatch: (a: Chunk<A>, i: number) => Effect<R2, E2, A2>
|
|
58
|
+
) {
|
|
59
|
+
return (items: Iterable<T>) =>
|
|
60
|
+
items.chunk(n)
|
|
61
|
+
.forEachEffectParWithIndex((_, i) =>
|
|
62
|
+
_.forEachParWithIndex((_, j) => forEachItem(_, j, i))
|
|
63
|
+
.flatMap(_ => forEachBatch(_, i))
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* @tsplus pipeable Iterable batch
|
|
69
|
+
* @tsplus static Collection.Aspects batch
|
|
70
|
+
*/
|
|
71
|
+
export function batch<R, E, A, R2, E2, A2, T>(
|
|
72
|
+
n: number,
|
|
73
|
+
forEachItem: (item: T, iWithinBatch: number, batchI: number) => Effect<R, E, A>,
|
|
74
|
+
forEachBatch: (a: Chunk<A>, i: number) => Effect<R2, E2, A2>
|
|
75
|
+
) {
|
|
76
|
+
return (items: Iterable<T>) =>
|
|
77
|
+
items.chunk(n)
|
|
78
|
+
.forEachEffectWithIndex((_, i) =>
|
|
79
|
+
_.forEachParWithIndex((_, j) => forEachItem(_, j, i))
|
|
80
|
+
.flatMap(_ => forEachBatch(_, i))
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// /**
|
|
85
|
+
// * @tsplus pipeable Iterable rateLimit
|
|
86
|
+
// * @tsplus static Collection.Aspects rateLimit
|
|
87
|
+
// */
|
|
88
|
+
// export function rateLimit(
|
|
89
|
+
// n: number,
|
|
90
|
+
// d: DUR
|
|
91
|
+
// ) {
|
|
92
|
+
// return <T>(items: Iterable<T>) =>
|
|
93
|
+
// <R, E, A, R2, E2, A2>(
|
|
94
|
+
// forEachItem: (i: T) => Effect<R, E, A>,
|
|
95
|
+
// forEachBatch: (a: Chunk<A>) => Effect<R2, E2, A2>
|
|
96
|
+
// ) =>
|
|
97
|
+
// Stream.fromCollection(items)
|
|
98
|
+
// .rechunk(n)
|
|
99
|
+
// .throttleShape(n, d, () => n)
|
|
100
|
+
// .mapChunksEffect(_ => _.forEachEffectPar(forEachItem).tap(forEachBatch))
|
|
101
|
+
// .runCollect
|
|
102
|
+
// }
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @tsplus pipeable Iterable naiveRateLimit
|
|
106
|
+
* @tsplus static Collection.Aspects naiveRateLimit
|
|
107
|
+
*/
|
|
108
|
+
|
|
109
|
+
export function naiveRateLimit(
|
|
110
|
+
n: number,
|
|
111
|
+
d: DUR
|
|
112
|
+
) {
|
|
113
|
+
return <T>(items: Iterable<T>) => (<R, E, A, R2, E2, A2>(
|
|
114
|
+
forEachItem: (i: T) => Effect<R, E, A>,
|
|
115
|
+
forEachBatch: (a: Chunk<A>) => Effect<R2, E2, A2>
|
|
116
|
+
) =>
|
|
117
|
+
items.chunk(n)
|
|
118
|
+
.forEachEffectWithIndex((batch, i) =>
|
|
119
|
+
((i === 0) ? Effect.unit : Effect.unit.delay(d))
|
|
120
|
+
.zipRight(
|
|
121
|
+
batch.forEachEffectPar(forEachItem)
|
|
122
|
+
.withParallelism(n)
|
|
123
|
+
.flatMap(forEachBatch)
|
|
124
|
+
)
|
|
125
|
+
))
|
|
126
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export const PrinterId = ReasonableString
|
|
2
|
+
export type PrinterId = ReasonableString
|
|
3
|
+
|
|
4
|
+
export interface CUPS {
|
|
5
|
+
print: (buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) => Effect<never, unknown, {
|
|
6
|
+
stdout: string
|
|
7
|
+
stderr: string
|
|
8
|
+
}>
|
|
9
|
+
getAvailablePrinters: Effect<never, unknown, ReasonableString[]>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @tsplus type CUPS.Ops
|
|
14
|
+
*/
|
|
15
|
+
export interface CUPSOps extends Tag<CUPS> {}
|
|
16
|
+
export const CUPS: CUPSOps = Tag<CUPS>()
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import cp from "child_process"
|
|
2
|
+
import util from "util"
|
|
3
|
+
import { tempFile } from "../lib/fileUtil.js"
|
|
4
|
+
|
|
5
|
+
import { isTruthy } from "@effect-app/core/utils"
|
|
6
|
+
import { ReasonableString } from "@effect-app/schema"
|
|
7
|
+
import { Effect } from "@effect/io/Effect"
|
|
8
|
+
import fs from "fs"
|
|
9
|
+
import os from "os"
|
|
10
|
+
import path from "path"
|
|
11
|
+
import type { PrinterId } from "./CUPS/service.js"
|
|
12
|
+
import { CUPS } from "./CUPS/service.js"
|
|
13
|
+
|
|
14
|
+
export * from "./CUPS/service.js"
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @tsplus static CUPS.Ops Live
|
|
18
|
+
*/
|
|
19
|
+
export function LiveCUPS(cupsServer?: URL) {
|
|
20
|
+
return makeCUPS(cupsServer).toLayer(CUPS)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function makeCUPS(cupsServer?: URL) {
|
|
24
|
+
return Effect(() => {
|
|
25
|
+
function print_(buffer: ArrayBuffer, printerId: PrinterId, ...options: string[]) {
|
|
26
|
+
const print = printBuffer({
|
|
27
|
+
id: printerId,
|
|
28
|
+
url: cupsServer
|
|
29
|
+
}, options)
|
|
30
|
+
return print(buffer)
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
print: print_,
|
|
34
|
+
getAvailablePrinters: getAvailablePrinters(cupsServer?.host)
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const exec_ = util.promisify(cp.exec)
|
|
40
|
+
const exec = (command: string) =>
|
|
41
|
+
Effect.logDebug(`Executing: ${command}`)
|
|
42
|
+
> Effect.tryPromise(() => exec_(command))
|
|
43
|
+
.tap(r => (Effect.logDebug(`Executed`).logAnnotate("result", r.$$.pretty)))
|
|
44
|
+
type PrinterConfig = { url?: URL; id: string }
|
|
45
|
+
|
|
46
|
+
function printFile(printer: PrinterConfig | undefined, options: string[]) {
|
|
47
|
+
return (filePath: string) => printFile_(filePath, printer, options)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function printFile_(filePath: string, printer: PrinterConfig | undefined, options: string[]) {
|
|
51
|
+
return exec(["lp", ...buildPrintArgs(filePath, printer, options)].join(" "))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function* buildPrintArgs(filePath: string, printer: PrinterConfig | undefined, options: string[]) {
|
|
55
|
+
if (printer) {
|
|
56
|
+
if (printer.url) {
|
|
57
|
+
yield `-h ${printer.url.host}`
|
|
58
|
+
if (printer.url.username) {
|
|
59
|
+
yield `-U ${printer.url.username}`
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
yield `-d "${printer.id}"`
|
|
63
|
+
for (const o of options) {
|
|
64
|
+
yield `-o ${o}`
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
yield `"${filePath}"`
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const prepareTempDir = Effect(() => {
|
|
71
|
+
// TODO
|
|
72
|
+
try {
|
|
73
|
+
fs.mkdirSync(path.join(os.tmpdir(), "effect-ts-app"))
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (`${err}`.includes("EEXIST")) {
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
throw err
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
const makeTempFile = tempFile("effect-ts-app")
|
|
83
|
+
const makePrintJobTempFile = makeTempFile("print-job")
|
|
84
|
+
|
|
85
|
+
function printBuffer(printer: PrinterConfig, options: string[]) {
|
|
86
|
+
return (buffer: ArrayBuffer) =>
|
|
87
|
+
makePrintJobTempFile(Buffer.from(buffer))
|
|
88
|
+
.flatMapScoped(printFile(printer, options))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function getAvailablePrinters(host?: string) {
|
|
92
|
+
return Do($ => {
|
|
93
|
+
const { stdout } = $(exec(["lpstat", ...buildListArgs({ host }), "-s"].join(" ")))
|
|
94
|
+
return [...stdout.matchAll(/device for (\w+):/g)]
|
|
95
|
+
.map(_ => _[1])
|
|
96
|
+
.filter(isTruthy)
|
|
97
|
+
.map(ReasonableString)
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function* buildListArgs(config?: { host?: string }) {
|
|
102
|
+
if (config?.host) {
|
|
103
|
+
yield `-h ${config.host}`
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Cache as _Cache } from "../vendor/Cache/Cache.js"
|
|
2
|
+
import { make as _make } from "../vendor/Cache/Cache.js"
|
|
3
|
+
import type { CacheState } from "../vendor/Cache/Cache/_internal/CacheState.js"
|
|
4
|
+
import type { Lookup } from "../vendor/Cache/Lookup.js"
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @tsplus type ets/cache/Cache
|
|
8
|
+
*/
|
|
9
|
+
export interface Cache<Key, Error, Value> extends _Cache<Key, Error, Value> {}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @tsplus type ets/cache/CacheOps
|
|
13
|
+
*/
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
15
|
+
export interface CacheOps {}
|
|
16
|
+
|
|
17
|
+
export const Cache: CacheOps = {}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @tsplus static ets/cache/CacheOps make
|
|
21
|
+
*/
|
|
22
|
+
export function make<Key, Environment, Error, Value>(
|
|
23
|
+
capacity: number,
|
|
24
|
+
duration: DUR,
|
|
25
|
+
lookup: Lookup<Key, Environment, Error, Value>
|
|
26
|
+
) {
|
|
27
|
+
return _make(capacity, duration, lookup) as Effect<Environment, never, Cache<Key, Error, Value>>
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @tsplus getter ets/cache/Cache results
|
|
32
|
+
*/
|
|
33
|
+
export function results<Key, Error, Value>(
|
|
34
|
+
self: Cache<Key, Error, Value>
|
|
35
|
+
): Effect<never, never, Chunk<[Key, Exit<Error, Value>]>> {
|
|
36
|
+
return Effect(() => {
|
|
37
|
+
const values: Array<[Key, Exit<Error, Value>]> = []
|
|
38
|
+
for (const [key, value] of ((self as any).cacheState as CacheState<Key, Error, Value>).map) {
|
|
39
|
+
if (value._tag === "Complete") {
|
|
40
|
+
values.push([key, value.exit])
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return Chunk.fromIterable(values)
|
|
44
|
+
})
|
|
45
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import type { EmailData } from "@sendgrid/helpers/classes/email-address.js"
|
|
2
|
+
import sgMail from "@sendgrid/mail"
|
|
3
|
+
import { inspect } from "util"
|
|
4
|
+
import { Emailer } from "./service.js"
|
|
5
|
+
import type { EmailMsg, EmailMsgOptionalFrom, SendgridConfig } from "./service.js"
|
|
6
|
+
|
|
7
|
+
const makeLiveSendgrid = ({ apiKey, defaultFrom, realMail, subjectPrefix }: SendgridConfig) =>
|
|
8
|
+
Effect(() => {
|
|
9
|
+
sgMail.setApiKey(apiKey.value)
|
|
10
|
+
|
|
11
|
+
return {
|
|
12
|
+
sendMail(msg_: EmailMsgOptionalFrom) {
|
|
13
|
+
return Effect.gen(function*($) {
|
|
14
|
+
const msg = { ...msg_, from: msg_.from ?? defaultFrom }
|
|
15
|
+
const render = renderMessage(!realMail)
|
|
16
|
+
|
|
17
|
+
const renderedMsg_ = render(msg)
|
|
18
|
+
const renderedMsg = { ...renderedMsg_, subject: `${subjectPrefix}${renderedMsg_.subject}` }
|
|
19
|
+
yield* $(Effect.logDebug("Sending email").logAnnotate("msg", inspect(renderedMsg, false, 5)))
|
|
20
|
+
|
|
21
|
+
const ret = yield* $(
|
|
22
|
+
Effect.async<
|
|
23
|
+
never,
|
|
24
|
+
Error | sgMail.ResponseError,
|
|
25
|
+
[sgMail.ClientResponse, Record<string, unknown>]
|
|
26
|
+
>(
|
|
27
|
+
cb =>
|
|
28
|
+
void sgMail.send(renderedMsg, false, (err, result) =>
|
|
29
|
+
err ?
|
|
30
|
+
cb(Effect.fail(err)) :
|
|
31
|
+
cb(Effect(result)))
|
|
32
|
+
)
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
// const event = {
|
|
36
|
+
// name: "EmailSent",
|
|
37
|
+
// properties: {
|
|
38
|
+
// templateId: msg.templateId
|
|
39
|
+
// }
|
|
40
|
+
// }
|
|
41
|
+
// yield* $(Effect.logDebug("Tracking email event").logAnnotate("event", event.$$.pretty))
|
|
42
|
+
// const { trackEvent } = yield* $(AiContextService.access)
|
|
43
|
+
// trackEvent(event)
|
|
44
|
+
return ret
|
|
45
|
+
})
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @tsplus static Emailer.Ops LiveSendgrid
|
|
52
|
+
*/
|
|
53
|
+
export function LiveSendgrid(config: Config<SendgridConfig>) {
|
|
54
|
+
return config.config
|
|
55
|
+
.flatMap(makeLiveSendgrid)
|
|
56
|
+
.toLayer(Emailer)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @hidden
|
|
61
|
+
*/
|
|
62
|
+
export function renderMessage(forceFake: boolean) {
|
|
63
|
+
let i = 0
|
|
64
|
+
const makeId = () => i++
|
|
65
|
+
return forceFake
|
|
66
|
+
? (msg: EmailMsg) => ({
|
|
67
|
+
...msg,
|
|
68
|
+
to: msg.to && renderFake(msg.to, makeId),
|
|
69
|
+
cc: msg.cc && renderFake(msg.cc, makeId),
|
|
70
|
+
bcc: msg.bcc && renderFake(msg.bcc, makeId)
|
|
71
|
+
})
|
|
72
|
+
: (msg: EmailMsg) => ({
|
|
73
|
+
...msg,
|
|
74
|
+
to: msg.to && renderFakeIfTest(msg.to, makeId),
|
|
75
|
+
cc: msg.cc && renderFakeIfTest(msg.cc, makeId),
|
|
76
|
+
bcc: msg.bcc && renderFakeIfTest(msg.bcc, makeId)
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @hidden
|
|
82
|
+
*/
|
|
83
|
+
export function isTestAddress(to: EmailData) {
|
|
84
|
+
return (
|
|
85
|
+
(typeof to === "string" && to.toLowerCase().endsWith(".test")) ||
|
|
86
|
+
(typeof to === "object" &&
|
|
87
|
+
"email" in to &&
|
|
88
|
+
to.email.toLowerCase().endsWith(".test"))
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function renderFake(addr: EmailData | EmailData[], makeId: () => number) {
|
|
93
|
+
return {
|
|
94
|
+
name: renderMailData(addr),
|
|
95
|
+
email: `test+${makeId()}@nomizz.com`
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const eq = Equal.string.contramap((to: { name?: string; email: string } | string) =>
|
|
99
|
+
typeof to === "string" ? to.toLowerCase() : to.email.toLowerCase()
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
// TODO: should just not add any already added email address
|
|
103
|
+
// https://stackoverflow.com/a/53603076/11595834
|
|
104
|
+
function renderFakeIfTest(addr: EmailData | EmailData[], makeId: () => number) {
|
|
105
|
+
return Array.isArray(addr)
|
|
106
|
+
? addr
|
|
107
|
+
.map(x => (isTestAddress(x) ? renderFake(x, makeId) : x))
|
|
108
|
+
.uniq(eq)
|
|
109
|
+
.toArray
|
|
110
|
+
: isTestAddress(addr)
|
|
111
|
+
? renderFake(addr, makeId)
|
|
112
|
+
: addr
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function renderMailData(md: NonNullable<EmailMsg["to"]>): string {
|
|
116
|
+
if (Array.isArray(md)) {
|
|
117
|
+
return md.map(renderMailData).join(", ")
|
|
118
|
+
}
|
|
119
|
+
if (typeof md === "string") {
|
|
120
|
+
return md
|
|
121
|
+
}
|
|
122
|
+
return md.email
|
|
123
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { pretty } from "@effect-app/prelude/utils"
|
|
2
|
+
import { Emailer } from "./service.js"
|
|
3
|
+
|
|
4
|
+
const makeFake = Effect.logDebug("FAKE Emailer Service enabled")
|
|
5
|
+
.map((): Emailer => ({
|
|
6
|
+
sendMail(msg) {
|
|
7
|
+
return Effect.logDebug(`Fake send mail`).logAnnotate("msg", pretty(msg))
|
|
8
|
+
}
|
|
9
|
+
}))
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @tsplus static Emailer.Ops Fake
|
|
13
|
+
*/
|
|
14
|
+
export const FakeSendgrid = makeFake.toLayer(Emailer)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MailContent, MailData } from "@sendgrid/helpers/classes/mail.js"
|
|
2
|
+
import type { ResponseError } from "@sendgrid/mail"
|
|
3
|
+
import type sgMail from "@sendgrid/mail"
|
|
4
|
+
|
|
5
|
+
import type { RequestContext } from "../../lib/RequestContext.js"
|
|
6
|
+
|
|
7
|
+
export interface Emailer {
|
|
8
|
+
sendMail: (msg: EmailMsgOptionalFrom) => Effect<RequestContext, Error | ResponseError, void>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @tsplus type Emailer.Ops
|
|
13
|
+
*/
|
|
14
|
+
export interface EmailerOps extends Tag<Emailer> {}
|
|
15
|
+
|
|
16
|
+
export interface SendgridConfig {
|
|
17
|
+
subjectPrefix: string
|
|
18
|
+
realMail: boolean
|
|
19
|
+
defaultFrom: Email | { name?: ReasonableString; email: Email }
|
|
20
|
+
apiKey: ConfigSecret
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const Emailer: EmailerOps = Tag<Emailer>()
|
|
24
|
+
|
|
25
|
+
export type EmailMsg = sgMail.MailDataRequired
|
|
26
|
+
export type EmailTemplateMsg = MailData & { templateId: string }
|
|
27
|
+
|
|
28
|
+
export type EmailMsgOptionalFrom =
|
|
29
|
+
& Omit<MailData, "from">
|
|
30
|
+
& (
|
|
31
|
+
{ text: string } | { html: string } | { templateId: string } | { content: NonEmptyReadonlyArray<MailContent> }
|
|
32
|
+
)
|
|
33
|
+
& Partial<Pick<EmailMsg, "from">>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./Emailer/service.js"
|