Azure/azure-functions-durable-js

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

bachuv opened this issue · 1 comments

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:

  • v4 bundles: 4.13.1
  • v3 bundles: 3.30.1+

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)"
  },
  1. Manually install Durable Functions extension version v2.12.0 or lower by following these instructions.

"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> => {