js-sdk: Batch check does not preserve output order
a0js opened this issue · 1 comments
Checklist
- I have looked into the README and have not found a suitable solution or answer.
- I have looked into the documentation and have not found a suitable solution or answer.
- I have searched the issues and have not found a suitable solution or answer.
- I have searched the Slack Community and have not found a suitable solution or answer.
- I agree to the terms within the OpenFGA Code of Conduct.
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
- JS SDK
- Go SDK
- .NET SDK
- Python SDK
- Java SDK
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 rxaviers/async-pool#47
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.