Skip to content
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

🐛 BUG: RPC Entrypoint Misbehaves with Request Object #2588

Open
KamaniBhavin opened this issue Jun 1, 2024 · 2 comments
Open

🐛 BUG: RPC Entrypoint Misbehaves with Request Object #2588

KamaniBhavin opened this issue Jun 1, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@KamaniBhavin
Copy link

Which Cloudflare product(s) does this pertain to?

Workers Runtime

What version(s) of the tool(s) are you using?

wrangler 3.57.2

What version of Node are you using?

v18.18.2

What operating system and version are you using?

Mac Sonoma 14.2.1

Describe the Bug

Issue Description:

I am experiencing issues with a Cloudflare worker that uses an RPC entrypoint. The worker script includes a method doSomething(request: Request), where request is a Cloudflare request object.

export class RpcEntrypoint extends WorkerEntrypoint<Bindings> {
  async doSomething(request: Request) {
    return await fn(this.env, request);
  }
}

In another script, bound to the aforementioned worker script, the method is used as follows:

export default {
  fetch: async (request: Request, bindings: Bindings, executionContext: ExecutionContext) => {
    const s = await env.SERVICE_BINDINGS.doSomething(request);
  },
};

When passing a request object using service bindings, the worker fails with different errors depending on the type of request.

Observed Behavior:

  1. GET Request:

    • Error: A GET or HEAD cannot have a body.
  2. POST Request:

    • Error: A promise rejection was handled asynchronously. This warning occurs when attaching a catch handler to a promise after it rejected. (rejection cloudflare/workers-sdk#1) TypeError: The ReadableStream has been locked to a reader.

Expected Behavior:

The doSomething method should handle both GET and POST requests without causing errors.

Steps to Reproduce:

  1. Set up a Cloudflare worker with the doSomething method.
  2. Bind another script to the worker.
  3. Pass a request object to the doSomething method using service bindings.
  4. Observe the errors for GET and POST requests.

Additional Information:

  • Cloudflare Workers version: [wrangler 3.57.2]
  • Service Bindings configuration:
services = [
    { binding = "SERVICE_BINDINGS", service = "service", entrypoint = "RpcEntrypoint" },
]

Any insights or solutions to handle these request types correctly within the worker would be greatly appreciated.

Please provide a link to a minimal reproduction

No response

Please provide any relevant error logs

A promise rejection was handled asynchronously. This warning occurs when attaching a catch handler to a promise after it rejected. (rejection cloudflare/workers-sdk#1)
TypeError: The ReadableStream has been locked to a reader.
at JsRpcProperty. ()
at file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:10790:44
at dispatch (file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:314:23)
at file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:315:20
at file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:1706:11
at async dispatch (file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:314:17)
at async file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:1706:5
at async dispatch (file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:314:17)
at async file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:950:25
at async drainBody (file:///Users/bhavinkamani/IdeaProjects/crm-integrations/.wrangler/tmp/dev-kdLmfa/index.js:11029:12) {
stack: TypeError: The ReadableStream has been locked to a…tions/.wrangler/tmp/dev-kdLmfa/index.js:11029:12),
message: The ReadableStream has been locked to a reader.
}

@KamaniBhavin KamaniBhavin added the bug Something isn't working label Jun 1, 2024
@KamaniBhavin
Copy link
Author

KamaniBhavin commented Jun 2, 2024

The weird thing is that when I construct and new Request object like below it works for ALL request methods.

export default {
  fetch: async (request: Request, bindings: Bindings, executionContext: ExecutionContext) => {
  const authorization = ....
  
  // Create a new request object
   const req = new Request(c.req.url, {
      method: "POST", // Explicitly making it POST as GET throws error.
      headers: { "authorization": authorization },
    });
  
    const s = await env.SERVICE_BINDINGS.doSomething(req);
  },
};

@penalosa penalosa transferred this issue from cloudflare/workers-sdk Aug 22, 2024
@kentonv
Copy link
Member

kentonv commented Aug 22, 2024

Can you provide a complete worker that reproduces the problem? It's probably just a few more lines of code but it really helps us debug if we have a complete script we can just try running, rather than guess at the details.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants