Skip to content

Commit

Permalink
feat(oracle)!: add includeResponded option to Oracle:pollQueries
Browse files Browse the repository at this point in the history
BREAKING CHANGE: `pollQueries` don't return responded queries by default
Use `includeResponded` option to restore the previous behavior.
  • Loading branch information
davidyuk committed May 31, 2024
1 parent 03c77c0 commit 78a07ab
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 13 deletions.
7 changes: 5 additions & 2 deletions src/oracle/Oracle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,17 +87,20 @@ export default class Oracle extends OracleBase {
*/
pollQueries(
onQuery: (query: OracleQuery) => void,
options: { interval?: number } & Partial<Parameters<typeof _getPollInterval>[1]> = {},
options: { interval?: number; includeResponded?: boolean } &
Partial<Parameters<typeof _getPollInterval>[1]> = {},
): () => void {
const opt = { ...this.options, ...options };
const knownQueryIds = new Set();
const checkNewQueries = async (): Promise<void> => {
const queries = (await opt.onNode.getOracleQueriesByPubkey(this.address)).oracleQueries ?? [];
queries
.filter(({ id }) => !knownQueryIds.has(id))
.map((query) => decodeQuery(query))
.filter((query) => options.includeResponded === true || query.decodedResponse === '')
.forEach((query) => {
knownQueryIds.add(query.id);
onQuery(decodeQuery(query));
onQuery(query);
});
};

Expand Down
42 changes: 31 additions & 11 deletions test/integration/oracle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,18 +47,38 @@ describe('Oracle', () => {
expect(ttl).to.be.equal(ttlBefore + 7450);
});

it('polls for queries', (done) => {
let count = 0;
const stopPolling = oracle.pollQueries(() => {
count += 1;
expect(count).to.be.lessThanOrEqual(3);
if (count !== 3) return;
stopPolling();
done();
async function pollNQueries(
orc: Oracle,
count: number,
includeResponded: boolean = false,
): Promise<string[]> {
const res: string[] = [];
return new Promise((resolve) => {
const stopPolling = orc.pollQueries((query) => {
res.push(query.decodedQuery);
if (res.length !== count) return;
stopPolling();
resolve(res);
}, { includeResponded });
});
oracleClient.postQuery('{"city": "Berlin2"}')
.then(async () => oracleClient.postQuery('{"city": "Berlin3"}'))
.then(async () => oracleClient.postQuery('{"city": "Berlin4"}'));
}

const queries = [2, 3, 4].map((i) => `{"city": "Berlin${i}"}`);

it('polls for queries', async () => {
const pollPromise = pollNQueries(oracle, 3);
for (const q of queries) { // eslint-disable-line no-restricted-syntax
await oracleClient.postQuery(q);
}
expect(await pollPromise).to.eql(queries);
});

it('can poll for responded queries', async () => {
const { queryId } = await oracleClient.postQuery('{"city": "Berlin"}');
await oracle.respondToQuery(queryId, queryResponse);
expect(await pollNQueries(oracle, 3)).to.have.same.members(queries);
expect(await pollNQueries(oracle, 4, true))
.to.have.same.members([...queries, '{"city": "Berlin"}']);
});

it('responds to query', async () => {
Expand Down

0 comments on commit 78a07ab

Please sign in to comment.