ts: convert `EventParser.parseLogs` to a generator function (#2018)
This commit is contained in:
parent
2ad00678b6
commit
e67c50f914
|
@ -28,6 +28,7 @@ com/project-serum/anchor/pull/1841)).
|
||||||
* ts: Implement a coder for SPL associated token program ([#1939](https://github.com/coral-xyz/anchor/pull/1939)).
|
* ts: Implement a coder for SPL associated token program ([#1939](https://github.com/coral-xyz/anchor/pull/1939)).
|
||||||
* ts: verbose error for missing `ANCHOR_WALLET` variable when using `NodeWallet.local()` ([#1958](https://github.com/coral-xyz/anchor/pull/1958)).
|
* ts: verbose error for missing `ANCHOR_WALLET` variable when using `NodeWallet.local()` ([#1958](https://github.com/coral-xyz/anchor/pull/1958)).
|
||||||
* ts: Add `MethodsBuilder#accountsStrict` for strict typing on ix account input ([#2019](https://github.com/coral-xyz/anchor/pull/2019)).
|
* ts: Add `MethodsBuilder#accountsStrict` for strict typing on ix account input ([#2019](https://github.com/coral-xyz/anchor/pull/2019)).
|
||||||
|
* ts: Change `EventParser#parseLogs` implementation to be a generator instead of callback function ([#2018](https://github.com/coral-xyz/anchor/pull/2018)).
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
|
|
@ -100,18 +100,21 @@ export class EventManager {
|
||||||
if (logs.err) {
|
if (logs.err) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._eventParser.parseLogs(logs.logs, (event) => {
|
|
||||||
|
for (const event of this._eventParser.parseLogs(logs.logs)) {
|
||||||
const allListeners = this._eventListeners.get(event.name);
|
const allListeners = this._eventListeners.get(event.name);
|
||||||
|
|
||||||
if (allListeners) {
|
if (allListeners) {
|
||||||
allListeners.forEach((listener) => {
|
allListeners.forEach((listener) => {
|
||||||
const listenerCb = this._eventCallbacks.get(listener);
|
const listenerCb = this._eventCallbacks.get(listener);
|
||||||
|
|
||||||
if (listenerCb) {
|
if (listenerCb) {
|
||||||
const [, callback] = listenerCb;
|
const [, callback] = listenerCb;
|
||||||
callback(event.data, ctx.slot, logs.signature);
|
callback(event.data, ctx.slot, logs.signature);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -172,14 +175,14 @@ export class EventParser {
|
||||||
// its emission, thereby allowing us to know if a given log event was
|
// its emission, thereby allowing us to know if a given log event was
|
||||||
// emitted by *this* program. If it was, then we parse the raw string and
|
// emitted by *this* program. If it was, then we parse the raw string and
|
||||||
// emit the event if the string matches the event being subscribed to.
|
// emit the event if the string matches the event being subscribed to.
|
||||||
public parseLogs(logs: string[], callback: (log: Event) => void) {
|
public *parseLogs(logs: string[]) {
|
||||||
const logScanner = new LogScanner(logs);
|
const logScanner = new LogScanner(logs);
|
||||||
const execution = new ExecutionContext();
|
const execution = new ExecutionContext();
|
||||||
let log = logScanner.next();
|
let log = logScanner.next();
|
||||||
while (log !== null) {
|
while (log !== null) {
|
||||||
let [event, newProgram, didPop] = this.handleLog(execution, log);
|
let [event, newProgram, didPop] = this.handleLog(execution, log);
|
||||||
if (event) {
|
if (event) {
|
||||||
callback(event);
|
yield event;
|
||||||
}
|
}
|
||||||
if (newProgram) {
|
if (newProgram) {
|
||||||
execution.push(newProgram);
|
execution.push(newProgram);
|
||||||
|
|
|
@ -53,9 +53,9 @@ export default class SimulateFactory {
|
||||||
const events: Event<IdlEvent, IdlTypes<IDL>>[] = [];
|
const events: Event<IdlEvent, IdlTypes<IDL>>[] = [];
|
||||||
if (idl.events) {
|
if (idl.events) {
|
||||||
let parser = new EventParser(programId, coder);
|
let parser = new EventParser(programId, coder);
|
||||||
parser.parseLogs(logs, (event) => {
|
for (const event of parser.parseLogs(logs)) {
|
||||||
events.push(event);
|
events.push(event);
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
return { events, raw: logs };
|
return { events, raw: logs };
|
||||||
};
|
};
|
||||||
|
|
|
@ -26,9 +26,9 @@ describe("Events", () => {
|
||||||
const programId = PublicKey.default;
|
const programId = PublicKey.default;
|
||||||
const eventParser = new EventParser(programId, coder);
|
const eventParser = new EventParser(programId, coder);
|
||||||
|
|
||||||
eventParser.parseLogs(logs, () => {
|
if (Array.from(eventParser.parseLogs(logs)).length > 0) {
|
||||||
throw new Error("Should never find logs");
|
throw new Error("Should never find logs");
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
it("Upgrade event check", () => {
|
it("Upgrade event check", () => {
|
||||||
const logs = [
|
const logs = [
|
||||||
|
@ -54,9 +54,9 @@ describe("Events", () => {
|
||||||
const programId = PublicKey.default;
|
const programId = PublicKey.default;
|
||||||
const eventParser = new EventParser(programId, coder);
|
const eventParser = new EventParser(programId, coder);
|
||||||
|
|
||||||
eventParser.parseLogs(logs, () => {
|
if (Array.from(eventParser.parseLogs(logs)).length > 0) {
|
||||||
throw new Error("Should never find logs");
|
throw new Error("Should never find logs");
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
it("Find event with different start log.", (done) => {
|
it("Find event with different start log.", (done) => {
|
||||||
const logs = [
|
const logs = [
|
||||||
|
@ -118,10 +118,11 @@ describe("Events", () => {
|
||||||
);
|
);
|
||||||
const eventParser = new EventParser(programId, coder);
|
const eventParser = new EventParser(programId, coder);
|
||||||
|
|
||||||
eventParser.parseLogs(logs, (event) => {
|
const gen = eventParser.parseLogs(logs);
|
||||||
|
for (const event of gen) {
|
||||||
expect(event.name).toEqual("NftSold");
|
expect(event.name).toEqual("NftSold");
|
||||||
done();
|
done();
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
it("Find event from logs", (done) => {
|
it("Find event from logs", (done) => {
|
||||||
const logs = [
|
const logs = [
|
||||||
|
@ -213,10 +214,11 @@ describe("Events", () => {
|
||||||
);
|
);
|
||||||
const eventParser = new EventParser(programId, coder);
|
const eventParser = new EventParser(programId, coder);
|
||||||
|
|
||||||
eventParser.parseLogs(logs, (event) => {
|
const gen = eventParser.parseLogs(logs);
|
||||||
|
for (const event of gen) {
|
||||||
expect(event.name).toEqual("ListingClosed");
|
expect(event.name).toEqual("ListingClosed");
|
||||||
done();
|
done();
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
it("Listen to different program and send other program logs with same name", () => {
|
it("Listen to different program and send other program logs with same name", () => {
|
||||||
const logs = [
|
const logs = [
|
||||||
|
@ -271,8 +273,8 @@ describe("Events", () => {
|
||||||
);
|
);
|
||||||
const eventParser = new EventParser(programId, coder);
|
const eventParser = new EventParser(programId, coder);
|
||||||
|
|
||||||
eventParser.parseLogs(logs, () => {
|
if (Array.from(eventParser.parseLogs(logs)).length > 0) {
|
||||||
throw new Error("Should never find logs");
|
throw new Error("Should never find logs");
|
||||||
});
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue