Browse Source

ts: Fix event listener and add multiple event test (#631)

xjcaa 4 years ago
parent
commit
7e7e866bb2

+ 18 - 0
examples/events/programs/events/src/lib.rs

@@ -13,14 +13,32 @@ pub mod events {
         });
         Ok(())
     }
+
+    pub fn test_event(_ctx: Context<TestEvent>) -> ProgramResult {
+        emit!(MyOtherEvent {
+            data: 6,
+            label: "bye".to_string(),
+        });
+        Ok(())
+    }
 }
 
 #[derive(Accounts)]
 pub struct Initialize {}
 
+#[derive(Accounts)]
+pub struct TestEvent {}
+
 #[event]
 pub struct MyEvent {
     pub data: u64,
     #[index]
     pub label: String,
 }
+
+#[event]
+pub struct MyOtherEvent {
+    pub data: u64,
+    #[index]
+    pub label: String,
+}

+ 39 - 3
examples/events/tests/events.js

@@ -1,13 +1,12 @@
-const anchor = require('@project-serum/anchor');
+const anchor = require("@project-serum/anchor");
 const assert = require("assert");
 
 describe("events", () => {
   // Configure the client to use the local cluster.
   anchor.setProvider(anchor.Provider.env());
+  const program = anchor.workspace.Events;
 
   it("Is initialized!", async () => {
-    const program = anchor.workspace.Events;
-
     let listener = null;
 
     let [event, slot] = await new Promise((resolve, _reject) => {
@@ -22,4 +21,41 @@ describe("events", () => {
     assert.ok(event.data.toNumber() === 5);
     assert.ok(event.label === "hello");
   });
+
+  it("Multiple events", async () => {
+    // Sleep so we don't get this transaction has already been processed.
+    await sleep(2000);
+
+    let listenerOne = null;
+    let listenerTwo = null;
+
+    let [eventOne, slotOne] = await new Promise((resolve, _reject) => {
+      listenerOne = program.addEventListener("MyEvent", (event, slot) => {
+        resolve([event, slot]);
+      });
+      program.rpc.initialize();
+    });
+
+    let [eventTwo, slotTwo] = await new Promise((resolve, _reject) => {
+      listenerTwo = program.addEventListener("MyOtherEvent", (event, slot) => {
+        resolve([event, slot]);
+      });
+      program.rpc.testEvent();
+    });
+
+    await program.removeEventListener(listenerOne);
+    await program.removeEventListener(listenerTwo);
+
+    assert.ok(slotOne > 0);
+    assert.ok(eventOne.data.toNumber() === 5);
+    assert.ok(eventOne.label === "hello");
+
+    assert.ok(slotTwo > 0);
+    assert.ok(eventTwo.data.toNumber() === 6);
+    assert.ok(eventTwo.label === "bye");
+  });
 });
+
+function sleep(ms) {
+  return new Promise((resolve) => setTimeout(resolve, ms));
+}

+ 4 - 3
ts/src/program/event.ts

@@ -79,8 +79,9 @@ export class EventManager {
 
     // Create the subscription singleton, if needed.
     if (this._onLogsSubscriptionId !== undefined) {
-      return;
+      return listener;
     }
+
     this._onLogsSubscriptionId = this._provider.connection.onLogs(
       this._programId,
       (logs, ctx) => {
@@ -89,7 +90,7 @@ export class EventManager {
           return;
         }
         this._eventParser.parseLogs(logs.logs, (event) => {
-          const allListeners = this._eventListeners.get(eventName);
+          const allListeners = this._eventListeners.get(event.name);
           if (allListeners) {
             allListeners.forEach((listener) => {
               const [, callback] = this._eventCallbacks.get(listener);
@@ -114,7 +115,7 @@ export class EventManager {
     // Get the listeners.
     let listeners = this._eventListeners.get(eventName);
     if (!listeners) {
-      throw new Error(`Event listeners dont' exist for ${eventName}!`);
+      throw new Error(`Event listeners don't exist for ${eventName}!`);
     }
 
     // Update both maps.