Skip to content

Commit ed0fae5

Browse files
authored
Merge pull request #5343 from WalletConnect/feat/init-event
feat: init event
2 parents 720b72e + 4a96e1f commit ed0fae5

File tree

8 files changed

+76
-15
lines changed

8 files changed

+76
-15
lines changed

packages/core/src/controllers/events.ts

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { generateChildLogger, Logger } from "@walletconnect/logger";
22
import { ICore, IEventClient, EventClientTypes } from "@walletconnect/types";
3-
import { uuidv4 } from "@walletconnect/utils";
3+
import { formatUA, isTestRun, uuidv4 } from "@walletconnect/utils";
44
import {
55
CORE_STORAGE_PREFIX,
66
EVENTS_CLIENT_API_URL,
@@ -16,12 +16,12 @@ export class EventClient extends IEventClient {
1616
public readonly context = EVENTS_STORAGE_CONTEXT;
1717
private readonly storagePrefix = CORE_STORAGE_PREFIX;
1818
private readonly storageVersion = EVENTS_STORAGE_VERSION;
19-
2019
private events = new Map<string, EventClientTypes.Event>();
2120
private shouldPersist = false;
2221
constructor(public core: ICore, public logger: Logger, telemetryEnabled = true) {
2322
super(core, logger, telemetryEnabled);
2423
this.logger = generateChildLogger(logger, this.context);
24+
this.telemetryEnabled = telemetryEnabled;
2525
if (telemetryEnabled) {
2626
this.restore().then(async () => {
2727
await this.submit();
@@ -39,6 +39,31 @@ export class EventClient extends IEventClient {
3939
);
4040
}
4141

42+
public init: IEventClient["init"] = async () => {
43+
if (isTestRun()) return;
44+
try {
45+
const initEvent = {
46+
eventId: uuidv4(),
47+
timestamp: Date.now(),
48+
props: {
49+
event: "INIT",
50+
type: "",
51+
properties: {
52+
client_id: await this.core.crypto.getClientId(),
53+
user_agent: formatUA(
54+
this.core.relayer.protocol,
55+
this.core.relayer.version,
56+
RELAYER_SDK_VERSION,
57+
),
58+
},
59+
},
60+
};
61+
await this.sendEvent([initEvent] as unknown as EventClientTypes.Event[]);
62+
} catch (error) {
63+
this.logger.warn(error);
64+
}
65+
};
66+
4267
public createEvent: IEventClient["createEvent"] = (params) => {
4368
const {
4469
event = "ERROR",
@@ -172,13 +197,7 @@ export class EventClient extends IEventClient {
172197
if (eventsToSend.length === 0) return;
173198

174199
try {
175-
const response = await fetch(
176-
`${EVENTS_CLIENT_API_URL}?projectId=${this.core.projectId}&st=events_sdk&sv=js-${RELAYER_SDK_VERSION}`,
177-
{
178-
method: "POST",
179-
body: JSON.stringify(eventsToSend),
180-
},
181-
);
200+
const response = await this.sendEvent(eventsToSend);
182201
if (response.ok) {
183202
for (const event of eventsToSend) {
184203
this.events.delete(event.eventId);
@@ -189,4 +208,15 @@ export class EventClient extends IEventClient {
189208
this.logger.warn(error);
190209
}
191210
};
211+
212+
private sendEvent = async (events: EventClientTypes.Event[]) => {
213+
const response = await fetch(
214+
`${EVENTS_CLIENT_API_URL}?projectId=${this.core.projectId}&st=events_sdk&sv=js-${RELAYER_SDK_VERSION}`,
215+
{
216+
method: "POST",
217+
body: JSON.stringify(events),
218+
},
219+
);
220+
return response;
221+
};
192222
}

packages/core/src/controllers/verify.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { generateChildLogger, getLoggerContext, Logger } from "@walletconnect/logger";
22
import { ICore, IVerify } from "@walletconnect/types";
3-
import { isBrowser, isNode, P256KeyDataType, verifyP256Jwt } from "@walletconnect/utils";
3+
import { isBrowser, isTestRun, P256KeyDataType, verifyP256Jwt } from "@walletconnect/utils";
44
import { FIVE_SECONDS, ONE_SECOND, toMiliseconds } from "@walletconnect/time";
55
import { getDocument } from "@walletconnect/window-getters";
66
import { decodeJWT } from "@walletconnect/relay-auth";
@@ -40,7 +40,7 @@ export class Verify extends IVerify {
4040
super(core, logger, store);
4141
this.logger = generateChildLogger(logger, this.name);
4242
this.abortController = new AbortController();
43-
this.isDevEnv = isNode() && process.env.IS_VITEST;
43+
this.isDevEnv = isTestRun();
4444
this.init();
4545
}
4646

packages/core/src/core.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ export class Core extends ICore {
194194
await this.relayer.init();
195195
await this.heartbeat.init();
196196
await this.pairing.init();
197+
this.eventClient.init();
197198
this.linkModeSupportedApps = (await this.storage.getItem(WALLETCONNECT_LINK_MODE_APPS)) || [];
198199

199200
this.initialized = true;

packages/core/test/events.spec.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,26 @@ describe("Events Client", () => {
193193
// @ts-expect-error - accessing private properties
194194
expect(core.eventClient.events.size).toBe(0);
195195
});
196+
197+
it("should send init event", async () => {
198+
process.env.IS_VITEST = false as any;
199+
const core = new Core({ ...TEST_CORE_OPTIONS, telemetryEnabled: false });
200+
let initCalled = false;
201+
// @ts-expect-error - accessing private properties
202+
core.eventClient.sendEvent = async (payload: any) => {
203+
initCalled = true;
204+
expect(payload).toBeDefined();
205+
expect(payload.length).to.eql(1);
206+
expect(payload[0].props.event).to.eql("INIT");
207+
expect(payload[0].props.properties.client_id).to.eql(await core.crypto.getClientId());
208+
};
209+
await core.start();
210+
await new Promise((resolve) => setTimeout(resolve, 500));
211+
212+
if (!initCalled) {
213+
throw new Error("init not called");
214+
}
215+
216+
process.env.IS_VITEST = true as any;
217+
});
196218
});

packages/sign-client/src/controllers/engine.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ import {
9696
BASE64URL,
9797
getSearchParamFromURL,
9898
isReactNative,
99+
isTestRun,
99100
} from "@walletconnect/utils";
100101
import EventEmmiter from "events";
101102
import {
@@ -2914,10 +2915,7 @@ export class Engine extends IEngine {
29142915
};
29152916

29162917
private registerLinkModeListeners = async () => {
2917-
if (
2918-
(typeof process !== "undefined" && process.env.IS_VITEST) ||
2919-
(isReactNative() && this.client.metadata.redirect?.linkMode)
2920-
) {
2918+
if (isTestRun() || (isReactNative() && this.client.metadata.redirect?.linkMode)) {
29212919
const linking = (global as any)?.Linking;
29222920
// global.Linking is set by react-native-compat
29232921
if (typeof linking !== "undefined") {

packages/types/src/core/events.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export abstract class IEventClient {
3030

3131
constructor(public core: ICore, public logger: Logger, public telemetryEnabled: boolean) {}
3232

33+
public abstract init(): Promise<void>;
34+
3335
public abstract createEvent(params: {
3436
event?: "ERROR";
3537
type?: string;

packages/types/src/core/relayer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ export interface RelayerClientMetadata {
7878
}
7979

8080
export abstract class IRelayer extends IEvents {
81+
public abstract protocol: string;
82+
83+
public abstract version: number;
84+
8185
public abstract core: ICore;
8286

8387
public abstract logger: Logger;

packages/utils/src/misc.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,3 +441,7 @@ export function uuidv4() {
441441
return v.toString(16);
442442
});
443443
}
444+
445+
export function isTestRun() {
446+
return typeof process !== "undefined" && process.env.IS_VITEST === "true";
447+
}

0 commit comments

Comments
 (0)