Skip to content

Commit ac429cd

Browse files
authored
Update node-sdk to 4.5.0 (#1599)
* "Update node-sdk to 4.5.0" * No changes made
1 parent 649a145 commit ac429cd

File tree

8 files changed

+67
-144
lines changed

8 files changed

+67
-144
lines changed

agents/bots/gm/index.ts

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@ import {
55
getTestUrl,
66
logDetails,
77
} from "@helpers/versions";
8-
import {
9-
logSyncResults,
10-
shouldSkipOldMessage,
11-
startUpSync,
12-
type SyncResult,
13-
} from "../../utils/general";
148

159
// Load .env file only in local development
1610
if (process.env.NODE_ENV !== "production") process.loadEnvFile(".env");
@@ -22,24 +16,7 @@ const agent = await Agent.createFromEnv({
2216
appVersion: APP_VERSION,
2317
});
2418

25-
const syncResults: SyncResult = await startUpSync(agent);
26-
const {
27-
startupTimeStamp,
28-
skippedMessagesCount,
29-
totalConversations,
30-
}: SyncResult = syncResults;
31-
3219
agent.on("text", async (ctx) => {
33-
if (
34-
shouldSkipOldMessage(
35-
ctx.message.sentAt.getTime() as number,
36-
startupTimeStamp,
37-
skippedMessagesCount,
38-
totalConversations.length,
39-
)
40-
) {
41-
//return;
42-
}
4320
if (ctx.isDm()) {
4421
const messageContent = ctx.message.content;
4522
const senderAddress = await ctx.getSenderAddress();
@@ -55,7 +32,6 @@ agent.on("start", () => {
5532
console.log(`🔗${getTestUrl(agent.client)}`);
5633
logDetails(agent.client).catch(console.error);
5734
getSDKVersionInfo(Agent, agent.client);
58-
logSyncResults(syncResults);
5935
});
6036

6137
await agent.start();

agents/bots/key-check/index.ts

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@ import {
77
type MessageContext,
88
} from "@helpers/versions";
99
import { ContentTypeMarkdown } from "@xmtp/content-type-markdown";
10-
import {
11-
logSyncResults,
12-
shouldSkipOldMessage,
13-
startUpSync,
14-
type SyncResult,
15-
} from "../../utils/general";
1610
import {
1711
ActionBuilder,
1812
initializeAppFromConfig,
@@ -296,13 +290,6 @@ const agent = await Agent.createFromEnv({
296290
codecs: [new ActionsCodec(), new IntentCodec()],
297291
});
298292

299-
const syncResults: SyncResult = await startUpSync(agent);
300-
const {
301-
startupTimeStamp,
302-
skippedMessagesCount,
303-
totalConversations,
304-
}: SyncResult = syncResults;
305-
306293
// Add inline actions middleware
307294
agent.use(inlineActionsMiddleware);
308295

@@ -347,16 +334,7 @@ agent.on("text", async (ctx) => {
347334
console.log(
348335
`Received text message in group (${ctx.conversation.id}): ${ctx.message.content} by ${await ctx.getSenderAddress()}`,
349336
);
350-
if (
351-
shouldSkipOldMessage(
352-
ctx.message.sentAt.getTime() as number,
353-
startupTimeStamp,
354-
skippedMessagesCount,
355-
totalConversations.length,
356-
)
357-
) {
358-
//return;
359-
}
337+
360338
const message = ctx.message;
361339
const content = message.content;
362340
const isTagged =
@@ -444,7 +422,6 @@ agent.on("start", () => {
444422
console.log(`🔗${getTestUrl(agent.client)}`);
445423
logDetails(agent.client).catch(console.error);
446424
getSDKVersionInfo(Agent, agent.client);
447-
logSyncResults(syncResults);
448425
});
449426

450427
await agent.start();

agents/utils/general.ts

Lines changed: 0 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { existsSync } from "fs";
2-
import type { Dm, Group } from "@helpers/versions";
32

43
export function loadEnvFile() {
54
// Only do this in the gm example because it's called from the root
@@ -34,86 +33,3 @@ export function shouldSkipOldMessage(
3433
);
3534
return true;
3635
}
37-
38-
export interface SyncResult {
39-
startupTimeStamp: number;
40-
skippedMessagesCount: { count: number };
41-
totalConversations: (Dm | Group)[];
42-
syncDurationMs: number;
43-
totalMessages: number;
44-
dmsCount: number;
45-
groupsCount: number;
46-
messageCountDurationMs: number;
47-
}
48-
49-
export async function startUpSync(agent: any): Promise<SyncResult> {
50-
try {
51-
const startupTimeStamp = new Date().getTime();
52-
53-
// Time the syncAll operation
54-
const syncStartTime = performance.now();
55-
await agent.client.conversations.syncAll();
56-
const syncEndTime = performance.now();
57-
const syncDurationMs = syncEndTime - syncStartTime;
58-
59-
// Get conversations
60-
const totalConversations =
61-
(await agent.client.conversations.list()) as Array<Dm | Group>;
62-
63-
// Count messages across all conversations
64-
const messageCountStartTime = performance.now();
65-
let totalMessages = 0;
66-
let dmsCount = 0;
67-
let groupsCount = 0;
68-
69-
for (const conversation of totalConversations) {
70-
try {
71-
// Check if it's a DM or Group by checking for peerInboxId property
72-
const isDm = "peerInboxId" in conversation;
73-
if (isDm) {
74-
dmsCount++;
75-
} else {
76-
groupsCount++;
77-
}
78-
79-
// Get messages for this conversation
80-
const messages = await conversation.messages();
81-
totalMessages += messages.length;
82-
} catch {
83-
// Silently continue if a conversation fails
84-
}
85-
}
86-
87-
const messageCountEndTime = performance.now();
88-
const messageCountDurationMs = messageCountEndTime - messageCountStartTime;
89-
90-
const skippedMessagesCount = { count: 0 };
91-
92-
return {
93-
startupTimeStamp,
94-
skippedMessagesCount,
95-
totalConversations,
96-
syncDurationMs,
97-
totalMessages,
98-
dmsCount,
99-
groupsCount,
100-
messageCountDurationMs,
101-
};
102-
} catch (error) {
103-
console.error("❌ Error syncing conversations:", error);
104-
throw error;
105-
}
106-
}
107-
108-
export function logSyncResults(results: SyncResult): void {
109-
const syncDurationSec = (results.syncDurationMs / 1000).toFixed(2);
110-
111-
console.log(
112-
`✅ syncAll completed in ${syncDurationSec}s (${results.syncDurationMs.toFixed(0)}ms)`,
113-
);
114-
console.log(
115-
` └─ Total conversations: ${results.totalConversations.length}`,
116-
);
117-
console.log(` └─ DMs: ${results.dmsCount}, Groups: ${results.groupsCount}`);
118-
console.log(` └─ Total messages: ${results.totalMessages}`);
119-
}

cli/versions.ts

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,34 @@ function linkNodeSDKToBindings(nodeSDK: string, nodeBindings: string): boolean {
195195
fs.symlinkSync(relativeBindingsPath, symlinkTarget);
196196
console.log(`✅ node-sdk-${nodeSDK} → node-bindings-${nodeBindings}`);
197197
return true;
198-
} catch (error) {
198+
} catch (error: any) {
199+
// Handle EEXIST error specifically - the target might still exist
200+
if (error?.code === "EEXIST") {
201+
// Try one more time to remove it
202+
try {
203+
if (fs.existsSync(symlinkTarget)) {
204+
const stats = fs.lstatSync(symlinkTarget);
205+
if (stats.isSymbolicLink()) {
206+
fs.unlinkSync(symlinkTarget);
207+
} else {
208+
fs.rmSync(symlinkTarget, { recursive: true, force: true });
209+
}
210+
}
211+
// Retry creating the symlink
212+
const relativeBindingsPath = path.relative(
213+
sdkNodeModulesXmtpDir,
214+
bindingsDir,
215+
);
216+
fs.symlinkSync(relativeBindingsPath, symlinkTarget);
217+
console.log(`✅ node-sdk-${nodeSDK} → node-bindings-${nodeBindings}`);
218+
return true;
219+
} catch (retryError) {
220+
console.error(
221+
`❌ Error linking node-sdk-${nodeSDK} to node-bindings-${nodeBindings} after retry: ${String(retryError)}`,
222+
);
223+
return false;
224+
}
225+
}
199226
console.error(
200227
`❌ Error linking node-sdk-${nodeSDK} to node-bindings-${nodeBindings}: ${String(error)}`,
201228
);
@@ -301,7 +328,34 @@ function linkAgentSDKToNodeSDK(agentSDK: string, nodeSDK: string): boolean {
301328
fs.symlinkSync(relativeNodeSDKPath, symlinkTarget);
302329
console.log(`✅ agent-sdk-${agentSDK} → node-sdk-${nodeSDK}`);
303330
return true;
304-
} catch (error) {
331+
} catch (error: any) {
332+
// Handle EEXIST error specifically - the target might still exist
333+
if (error?.code === "EEXIST") {
334+
// Try one more time to remove it
335+
try {
336+
if (fs.existsSync(symlinkTarget)) {
337+
const stats = fs.lstatSync(symlinkTarget);
338+
if (stats.isSymbolicLink()) {
339+
fs.unlinkSync(symlinkTarget);
340+
} else {
341+
fs.rmSync(symlinkTarget, { recursive: true, force: true });
342+
}
343+
}
344+
// Retry creating the symlink
345+
const relativeNodeSDKPath = path.relative(
346+
agentSDKNodeModulesXmtpDir,
347+
nodeSDKDir,
348+
);
349+
fs.symlinkSync(relativeNodeSDKPath, symlinkTarget);
350+
console.log(`✅ agent-sdk-${agentSDK} → node-sdk-${nodeSDK}`);
351+
return true;
352+
} catch (retryError) {
353+
console.error(
354+
`❌ Error linking agent-sdk-${agentSDK} to node-sdk-${nodeSDK} after retry: ${String(retryError)}`,
355+
);
356+
return false;
357+
}
358+
}
305359
console.error(
306360
`❌ Error linking agent-sdk-${agentSDK} to node-sdk-${nodeSDK}: ${String(error)}`,
307361
);

deploy-metadata.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"deployedAt": "2025-11-18T19:47:26Z", "version": "0.4.24"}
1+
{ "deployedAt": "2025-11-18T19:47:26Z", "version": "0.4.24" }

helpers/versions.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ import {
5353
Conversation as Conversation440,
5454
Dm as Dm440,
5555
Group as Group440,
56-
} from "@xmtp/node-sdk-4.4.0";
56+
} from "@xmtp/node-sdk-4.5.0";
5757

5858
export {
5959
Agent,
@@ -91,7 +91,7 @@ export const AgentVersionList = [
9191
Agent: Agent114,
9292
MessageContext: MessageContext114,
9393
agentSDK: "1.1.14",
94-
nodeSDK: "4.4.0",
94+
nodeSDK: "4.5.0",
9595
auto: true,
9696
},
9797
{
@@ -119,7 +119,7 @@ export const VersionList = [
119119
Conversation: Conversation440,
120120
Dm: Dm440,
121121
Group: Group440,
122-
nodeSDK: "4.4.0",
122+
nodeSDK: "4.5.0",
123123
nodeBindings: "1.6.1",
124124
auto: true,
125125
},

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"@xmtp/node-sdk-4.2.6": "npm:@xmtp/node-sdk@4.2.6",
5353
"@xmtp/node-sdk-4.3.0": "npm:@xmtp/node-sdk@4.3.0",
5454
"@xmtp/node-sdk-4.3.0-dev": "npm:@xmtp/node-sdk@4.3.0-dev.395f798c",
55-
"@xmtp/node-sdk-4.4.0": "npm:@xmtp/node-sdk@4.4.0-rc2",
55+
"@xmtp/node-sdk-4.5.0": "npm:@xmtp/node-sdk@4.5.0-rc1",
5656
"axios": "^1.8.2",
5757
"datadog-metrics": "^0.12.1",
5858
"dotenv": "^16.5.0",

yarn.lock

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,15 +1790,15 @@ __metadata:
17901790
languageName: node
17911791
linkType: hard
17921792

1793-
"@xmtp/node-sdk-4.4.0@npm:@xmtp/node-sdk@4.4.0-rc2":
1794-
version: 4.4.0-rc2
1795-
resolution: "@xmtp/node-sdk@npm:4.4.0-rc2"
1793+
"@xmtp/node-sdk-4.5.0@npm:@xmtp/node-sdk@4.5.0-rc1":
1794+
version: 4.5.0-rc1
1795+
resolution: "@xmtp/node-sdk@npm:4.5.0-rc1"
17961796
dependencies:
17971797
"@xmtp/content-type-group-updated": "npm:^2.0.2"
17981798
"@xmtp/content-type-primitives": "npm:^2.0.2"
17991799
"@xmtp/content-type-text": "npm:^2.0.2"
18001800
"@xmtp/node-bindings": "npm:1.6.1-rc3"
1801-
checksum: 10/9b172fe3c3ba7f46d50a33c8061a1f790c6779de54593107c70fcc08b42865a1e7372ec8eb9efe73e597ad4f6d9a80b6e8379f41f0abb47a5c9c1936fbd943eb
1801+
checksum: 10/3df3027cc189cf2c31a83ad47b0a917081046522e3bca8761672d2850f122f87c5b5ea4dc430a59498c02074183f510b2f599f1a15653788a365c160b1423f67
18021802
languageName: node
18031803
linkType: hard
18041804

@@ -5318,7 +5318,7 @@ __metadata:
53185318
"@xmtp/node-sdk-4.2.6": "npm:@xmtp/node-sdk@4.2.6"
53195319
"@xmtp/node-sdk-4.3.0": "npm:@xmtp/node-sdk@4.3.0"
53205320
"@xmtp/node-sdk-4.3.0-dev": "npm:@xmtp/node-sdk@4.3.0-dev.395f798c"
5321-
"@xmtp/node-sdk-4.4.0": "npm:@xmtp/node-sdk@4.4.0-rc2"
5321+
"@xmtp/node-sdk-4.5.0": "npm:@xmtp/node-sdk@4.5.0-rc1"
53225322
axios: "npm:^1.8.2"
53235323
datadog-metrics: "npm:^0.12.1"
53245324
dotenv: "npm:^16.5.0"

0 commit comments

Comments
 (0)