openfga / sdk-generator

OpenFGA Client SDK Generator
Apache License 2.0
14 stars 30 forks source link

js-sdk: Batch check does not preserve output order #347

Open a0js opened 2 months ago

a0js commented 2 months ago

Checklist

Description

When using the batch check functionality in the js-sdk, the check results are not returned in the same order as the input. Based on what I've found in the python sdk, the order is preserved.

Expectation

I would expect when an array is provided as input, and the expected output is an array of equal length, order should be preserved.

Reproduction

Run the following:

const { OpenFgaClient } = require('@openfga/sdk');
const assert = require('assert');
const util = require('util');

const fgaClient = new OpenFgaClient({apiUrl: "https://api.playground.fga.dev", storeId: "01HVW8AJAT069Y9M1FZDKV6SP0", authorizationModelId: "01HVW8C9JP1XS2ZZG614S8KH47"});

async function test() {
    const checks = [
    {
        user: "user:1",
        relation: "test",
        object: "object:2"
    },
        {
        user: "user:1",
        relation: "test",
        object: "object:2",
        contextualTuples: [{
            user: "user:1",
            relation: "test",
            object: "object:2"
        }]
    },
        {
        user: "user:1",
        relation: "test",
        object: "object:1"
        }
    ];

    const results = await fgaClient.batchCheck(checks);
    console.log(util.inspect(results, false, null, true));

    assert.deepEqual(results.responses[0]._request, checks[0]);
    assert.deepEqual(results.responses[1]._request, checks[1]);
    assert.deepEqual(results.responses[2]._request, checks[2]);
}

test();

This hits this model: https://play.fga.dev/sandbox/?store=js-sdk-batch-ordering

SDK Checklist

OpenFGA SDK version

0.3.5

OpenFGA version

any

SDK Configuration

any

Logs

No response

References

This issue seems to be related to the cause https://github.com/rxaviers/async-pool/issues/47

rhamzeh commented 2 months ago

Hi @a0js - batch check is not intended to preserve the output order. While we can sort before returning the results, that would be offering a contract we are not certain we want to promise for the future.

Especially with the potential to offer a streaming variant of the API.

Each response has the request alongside it so that you can know what the result is for.