-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
fix(cloudflare): copy execution context in durable objects and handlers #17786
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
You should be able to run E2E tests locally:
This requires docker & pnpm to be setup! |
@0xbad0c0d3 is this ready for review? |
No, not yet, sorry for the delay. |
No worries, just wasn't sure :) When you're ready, please request me as a reviewer. |
and also |
a9af430
to
cb97187
Compare
@andreiborza so, it is ready |
Thanks! Will take a look in a bit. |
configurable: true, | ||
enumerable: true, | ||
set: newValue => { | ||
if (typeof newValue !== 'function') throw new Error('Cannot override non-function'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
h: I don't think that throwing an error is the right choice here since it could fail the entire call.
I'd be nice if there is a way to pass
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
h: I don't think that throwing an error is the right choice here since it could fail the entire call. I'd be nice if there is a way to pass
I was thinking of it, but then decided to do this way because I am checking the type before overriding and expecting overriding only callable objects. If, for some reason, function will be attempted to be overridden by non-function - the app will fail later, without the check. But it will fail.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would assume you mean it would fail on Cloudflare itself not on the SDK level, right? I couldn't think of a use case where it would make sense to fail right here. return false
would be sufficient as well if I am not mistaken.
In the getter we will anyways return the "methodFunction
", so I think it is safe to not error out here
@andreiborza any thoughts on this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would assume you mean it would fail on Cloudflare itself not on the SDK level, right? I couldn't think of a use case where it would make sense to fail right here.
return false
would be sufficient as well if I am not mistaken.In the getter we will anyways return the "
methodFunction
", so I think it is safe to not error out here@andreiborza any thoughts on this?
return false
is redundant and I removed this. But, anyway, I would agree with you after a bit more thinking. Why? Because we should not "brake" expected behaviour and if someone wants to set non-function to a method - it is not our concern to "prevent" of doing such. So, yes. I am going to remove error throwing here
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, definitely agree. Good catch @JPeer264 😄
Thanks a lot for creating a PR. I added two notes |
Updated test definitions across multiple suites to accept and pass abort signals (`signal`) for enhanced request handling. Adjusted the `start` method in the test runner to support optional abort signals.
Reworked `copyExecutionContext` to use a dynamic property descriptor approach, enabling method overrides without altering the original object. Expanded test cases to cover additional methods and verify override behavior.
Enhanced the descriptor logic to better handle non-function properties and prevent invalid method overrides. Fixed potential issues with binding non-function properties to the context.
Updated the `OverridesStore` type to strictly associate keys with context-specific methods, improving type safety. Renamed and enhanced the descriptor creation function to better handle method overriding and added checks for function-only properties.
Added `packages/**/*.junit.xml` to `.gitignore` to prevent JUnit report files from being tracked in the repository, keeping the working directory clean and avoiding unnecessary versioning of test artifacts.
Replaced direct usage of `ExecutionContext` with `copyExecutionContext` for consistency and improved flexibility. Applied changes across handlers, durable objects, and workflows to enhance context management and method overriding.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM. Waiting for @andreiborza for a second pair of eyes.
const [event, env, context] = args; | ||
const [event, env, ctx] = args; | ||
const context = copyExecutionContext(ctx); | ||
args[2] = context; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just leaving a note here for the record. Here we mutate the actual args directly and is often not safe to use, but since we are inside a Proxy it is fine and also a bit faster :)
Thanks again @0xbad0c0d3 for your contribution 🥳 |
This PR adds the external contributor to the CHANGELOG.md file, so that they are credited for their contribution. See #17786 Co-authored-by: JPeer264 <10677263+JPeer264@users.noreply.github.com>
I was running tests locally and noticed that they are stays running if something wents wrong that's why I've added: 04d2fbf
fixes #17514
Is there a way to run e2e tests pipeline without merging to develop?
Note
Introduce
copyExecutionContext
with tests; make Cloudflare integration test runner acceptAbortSignal
and update tests; ignore JUnit reports.packages/cloudflare/src/utils/copyExecutionContext.ts
to cloneExecutionContext
/DurableObjectState
with overridable, bound methods.packages/cloudflare/test/copy-execution-context.test.ts
covering method overriding, immutability safety, and symbol property preservation.dev-packages/cloudflare-integration-tests/runner.ts
start
now accepts optionalAbortSignal
and forwards it tospawn
.basic
,tracing/anthropic-ai
,tracing/durableobject
,tracing/openai
) to pass{ signal }
from Vitest and call.start(signal)
..gitignore
: Ignorepackages/**/*.junit.xml
JUnit reports.Written by Cursor Bugbot for commit cb97187. This will update automatically on new commits. Configure here.