- 🐛 fix regression in resource destruction order (#1091)
- 🐛 fix: move all task finalization into the scope destructor (#1085)
- 🐛 fix: destroy task scope when halting to prevent memory leak (#1081)
- Announcing Effection 4.0 https://frontside.com/blog/2025-12-23-announcing-effection-v4/
- run resources at the priority level of their caller #1017
- properly propagate errors from nested scopes #1014
- Add Effect.js benchmarks for performance comparison #979
- Fix type definition for call operation #973
- Fix missing tag issue #970
- Minor documentation improvements #971
- Remove unnecessary www from deploy preview URLs #969
- Add promise helpers #968
- Test against Node 16, 18, 20 versions #966
- Add documentation for scope #961
- Add documentation for errors #960
- Add documentation for call operation #954
- Add documentation for suspend operation #957
- Add documentation for constant operation #955
- Add withResolvers test #953
- Fix typo in documentation #952
- Add documentation for action operation #951
- Add contributors section to README #948
- Add JSR publishing capability #947
- Add withResolvers documentation #940
- Remove v2 documentation #938
- Add dynamic import for Node.js main #936
- Add scoped operation #933
- Export Result interface from API #920
- Add benchmark suite #919
- Add do-effect helper #918
- Use Deno 2.0 #917
- Make Task implement Operation #915
- Export async helpers in main API #913
- Initial v4 release with delimited continuations
- Do not bind SIGTERM in Windows #1031
- ✨ add interval() helper to consume a stream of intervals #1005
- 🐛 Fix Webpack compatibility through a specific comment to ignore the dynamic
node:processimport #1007
- Introducing until helper to replace call(promise) #988
- 🎒Backport Context.with() #982
- 🎒backport
each()🐛 fixes to v3 #980 - 🎒backport advanced scope helpers from v4 -> v3 #967
- 🐛 dynamically import node process #935
- Deprecate non-function invocations of call() #929
- backport
Context#expect()to v3 https://github.com/thefrontside/effection/commit/4d3be6c1be3f4c3c7dfbfd5435d07d754023800a
- this is just a placeholder release in order to workaround an issue. It is 100% functionally equivalent to 3.0.2
- fix typing of
all()function #873 - exit from
main()on SIGTERM as well as SIGINT #874 - various documentation fixes #875
-
remove stream helpers
first(),pipe(),map(), andfilter()#845 -
main()will now hold the event loop on Node and Deno so thatmain(suspend)will work #841 -
Scope.run() now behaves like
spawn()and will crash the scope if the operation fails #838 -
Powered up
call()operation can now invoke not just operation functions, but also async functions and vanilla JavaScript functions #832 -
Task.halt() now succeeds whenever the shutdown succeeds, regardless of whether the task itself failed #837
-
✨allow custom
Queueimpl whenever creating aSignal#826 -
📄Represent
eachas a function, not a variable in the API docs #825 -
📄Fixes to the
Channeldocumentation #821 -
✨Beef up the
call()to handle promises and async fns: #816 -
♻️ Make
QueueaSubscription#816 -
♻️ Make the
Streaminterface have an explicitsubscribe()method #809 -
♻️
each.nextis now a function #806 -
📄 Many fixes and improvements to the typedocs
-
📄Fill out type documentation to make more coherent #789
-
⚡️eliminate excess memory around the
Frameclass by consolidatingBlockandFrameinto a single concept. #768 -
⚡️improve performance of queues (and by proxy signals and channels) by making the entire lifetime of the subscription live the same frame. #771
-
✨Port
race()operation fromv2#757 -
✨Port
ensure()operation fromv2#761 -
✨Add
Signalinterface for creating streams out of JavaScript callbacks #756 -
🐞arguments were not being properly passed to NodeJS
main()#760 -
Make
ScopeAPI to make it more friendly for embedders #751 -
🐞fix typo in main for NodeJS #746
-
🐞fix NodeJS detection #744
-
✨for yield* each() loops #741
-
[fix] bug where
main()was failing without explicit exit #722 -
[feat] Make each task run in its own Frame. #729
-
add
main()method for setting up Effection to work properly in working in deno, browser, and node -
add
Context.set()andContext.get()operations to make working with Context convenient -
convert
Subscriptioninterface from a bare operation to an "iterator" style interface. Succintly:yield* subscription->yield* subscription.next(). For details #693 -
add
on()andonce()operations for events and subscriptions to values that implement the W3CEventTargetinterface. -
generate separate types for ESM modules (#702)
-
Rebuild with delimited continuations.
- delegate
errorandnameproperties to underlyingError. fixes #675)
- Expose
formatErrorso other packages can format errors the same way asmain
- Allow pass object with
Symbol.operationas an operation
- Remove redundant node-fetch from dependencies
- Extract
AbortSignalfrom@effection/fetchto@effection/coreas a resource
- workaround borked 2.0 release https://status.npmjs.org/incidents/wy4002vc8ryc
- Yielding to something which is not an operation no longer throws an internal error, but properly rejects the task.
- Fix a bug when using blockParent where the children are not getting halt on an explicit halt.
- Add Stream
toBufferand Streambufferedso we have both options on either accessing the buffer directly or returning the stream. - Stream
bufferreturns the actual buffer and gives direct access to it - Split off
Streamfrom subscription package into its own@effection/streampackage - Adjust the propagation of errors for resources to make it possible to catch
errors from
init - Enable support for resources in higher order operations
all,raceandwithTimeout. - Add shortcuts to create resolved/rejected/halted futures via Future.resolve(123), etc...
- Add @effection/fetch as a dependency and reexport it
- Share internal run loop among task, task future and task controller. Prevents race conditions which cause internal errors.
- Introduce task scope as an alternative to resources for being able to access the outer scope of an operation
- Add
toString()method to task for nicely formatted rendering of task structure - Allow channels to be named so their internal stream gets named
- Add esm builds
- remove accidentally compiled .js files from distributed sources
- 9998088: Spawn operation can accept task options
- d7c0eb1: Do not require implementation of full EventEmitter interface
- 2bce454: Simplify EventEmitter types on Controls.
- 1981b35: Collect trace of effection operations and propagate them along with the raised error
- 88dc59a: Remove
verboseoption from MainError - 88dc59a: Improve error output by including an Effection trace
- 625b521: Sleep operation can suspend indefinitely when called without duration
- a06c679: Add spawn as an operation via resources
- 625b521: Add ensure, timeout and withTimeout combinators
- 92f921e: Turn streams into resources which return a subscription
- 110a2cd: Add ignoreError option to prevent a task from propagating its errors to the parent
- 7216a21: Turn throwOnErrorEvent into an operation
- e2545b2: Remove delay on starting iterator/generator
- 2b92370: Prevent race condition in promise controller if promise resolves in the same tick as halt signal
- 00562fd: Fix race condition when halting a task while in between yield points
- 110a2cd: When yielded to an asynchronously halting task, wait for the task to be fully halted before proceeding
- 110a2cd: The sub task created by iterators is now linked to the parent task
- 02446ad: Add Resource to create an option for spawning tasks in the background in an operation
- 2bad074: Run destructors in reverse order and in series
- 3db7270: Make Queue a first class citizen
- 0dca571: Filter with a type predicate can narrow type of stream
- 9cf6053: Increase default value of max subscribers on channel
- 0b24415: Add WritableStream interface and implement it for channels
- 442f220: New API for exec and daemon which does not take scope directly
- 22e5230: Add
joinmethod on stream to return stream result - 70c358f: Store root in a global variable
- 3983202: Add
stringBuffermethod to stream which buffers stream to a string - 2c2749d: Add a
buffermethod on Stream to buffer stream contents for later replay - ab41f6a: Rename
SubscribabletoStream - ce76f15: Make channel splittable into send and stream ends
- 72f743c: Add
haltmethod onEffectionto halt root task - 53661b7: Reexport blessed packages from
effectionpackage - 3ca4cd4: Change
onto return subscribable, rather than taking scope - 3ca4cd4: Add
createSubscribableandSubscribableinterface - 3ca4cd4: Make Channel subscribable and add all subscribable methods
- 3ca4cd4: Change channel interface from
new Channel()tocreateChannel()
- b988025: Release effection 1.0.0
- f851981: Rename
maintorunand deprecatemain
- 0e8951f: Use unique symbol for effection resources
- 68c4dab: include typescript sources with package in order for sourcemaps to work.
- 60ed704: ## Fix sourcemaps and types entrypoint We saw strange errors while installing Effection from BigTest. One of the problems was that sourcemaps were not working. This was happening because sourcemaps referenced ts file which were not being included in the package. #119 We made a decision to ship generators in our distribution bundles because IE11 compatibility is not important to us. It's surprisingly difficult to get this to work. We tried using microbundle but that turned out to be even more complicated because their modern and cjs formats have mutually conflicting configuration](developit/microbundle#618) #120 All notable changes to this project will be documented in this file.
- fix bug where typescript type declarations were not being referenced properly
as part of the migration to
microbundle. #107
- fix bug where operations that returned
nullwas causing effection to crash: #98 effectionis now compiled with microbundle instead of pika. #100- removed custom publish scripts in order to fix releases 🙏
- Returning a context from a context passes links it to the parent context rather than halting it. #89
- Resources are a new feature in Effection which allow you to tie a context to any JavaScript object. #89
- Make Typescript Operation type generic over the returned value. Enables better type checking in Typescript. #81
- Catch errors raised in ensure blocks and print nasty warning #80
- For runtimes that do not use native generators, the code to recognize generator functions was broken which prevented effection from working in those environments. This was addressed with #77
jointo synchronize on a currently executing context.monitoroperation to propagate failuresspawncontrol function to create a "detached" process.- Refactored the
forkmethod to be an operation instead of a static function - Introduced a
mainfunction to enter a brand new context
- add a monotonic
idfield to every fork to help with debugging #32 - (fix) do not swallow some errors that are thrown inside of a yield point destructor: #37
- Make every fork conform to the Promises A+ API. E.g.
fork(operation).then()#38
- type signature for Exceution.halt() which is necessary in the construction of non-trivial async processes like servers. #24
- (fix) in certain cases, execution forks were being marked as completed when they actually were not. #21
- (fix) sometimes halted children were being kept around unecessarily, and while not running will cause memory leaks long-term #22
- unroll continuation and state classes in execution. This makes stack traces much smaller and easier to debug: #19
- remove some dead files that were not contributing to the API #18
-
unify the fork() and execute() methods. There is now a single API for initiating asynchronous execution, fork() which makes the mental model much simpler and the learning curve smaller. #14
-
make the fork() function static. Prior to this,
fork()was a method on theExecutionclass which made the API awkward and non-functional. #12 -
make generators (not just generator functions) valid operations. Before this change, you needed to use a utility function
call()in order to pass arguments to generator based operations. This lets you invoke generator functions directly and pass the resulting generator toyieldandforkdirectly thus simplifying code greatly. #13
- Typescript typings: Effection now officially supports TypeScript! From here on out, the project is committed to shipping precise and up-to-date typing information for its entire public API #8
- Test Suite, and functioning structured concurrency model