Azure / azure-functions-durable-js

JavaScript library for using the Durable Functions bindings
https://www.npmjs.com/package/durable-functions
MIT License
126 stars 46 forks source link

Known regression: Activity input fails to deserialize when the input is an array #581

Open bachuv opened 4 months ago

bachuv commented 4 months ago

Known regression notice: Activity input fails to deserialize when the input is an array

Error description: We have just noticed that users are experiencing errors in Durable Functions JS apps with an exception that includes Exception binding parameter '<your activity parameter name>' and Unexpected character encountered while parsing value.

This issue started with Durable Functions version v2.13.0. The following extension bundles are affected:

Repro: Use an array type as an input to your activity function.

const { app } = require('@azure/functions');
const df = require('durable-functions');

const activityName = 'durableHello1';

df.app.orchestration('durableHello1Orchestrator', function* (context) {
    const outputs = [];
    outputs.push(yield context.df.callActivity(activityName, ["Tokyo", "Seattle", "Cairo"]));

    return outputs;
});

df.app.activity(activityName, {
    handler: (input) => {
        return `Hello, ${input}`;
    },
});

app.http('durableHello1HttpStart', {
    route: 'orchestrators/{orchestratorName}',
    extraInputs: [df.input.durableClient()],
    handler: async (request, context) => {
        const client = df.getClient(context);
        const body = await request.text();
        const instanceId = await client.startNew(request.params.orchestratorName, { input: body });

        context.log(`Started orchestration with ID = '${instanceId}'.`);

        return client.createCheckStatusResponse(request, instanceId);
    },
});

Incoming solution: We're issuing a hotfix extension bundles release that will automatically fix any apps that are hitting the issue described here. It will take a few days to roll out.

Immediate Mitigation Options: There are two ways to fix this issue: Pinning the extension bundles version or manually installing the working Durable Functions extension version.

1) Pinning the extension bundles version - Update the extension bundles version in host.json to use v3.29.0 or v4.12.0.

Example:


  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.*, 4.13.0)"
  },

2) Manually install Durable Functions extension version v2.12.0 or lower by following these instructions.

jerodvenemafm commented 4 months ago

"version": "[4.*, 4.13.0)"

This doesn't look right for two reasons:

  1. Syntax error with a ) vs ]
  2. Doesn't match the versions listed in the ticket v3.29.0 or v4.12.0.

Is that actually right?

Edit: Found the definition here:

https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json#extensionbundle

Apparently that trailing ) is correct, and means "up to but not including".

Workaround. Updated my code to pre-serialize the data to a string.

await client.startNew(orchestratorName, { input: options });

became

await client.startNew(orchestratorName, { input: JSON.stringify(options) });

and

const runBot: ActivityHandler = async (input: MyType): Promise<MyType> => {

became

const runBot: ActivityHandler = async (inputJson: string): Promise<string> => {