This repository has no description
1//@ts-nocheck
2
3import { connect, JetStreamManager, NatsConnection, StringCodec } from "nats"
4import {
5 STREAM_NAME,
6 SUBJECT_NAME,
7 type Message,
8 Event,
9} from "../typescript/index.js"
10
11async function setupStream(
12 jetStreamManager: JetStreamManager,
13 streamName: string,
14 subject: string
15) {
16 try {
17 // Try to add the stream (will not recreate if it exists)
18 await jetStreamManager.streams.add({
19 name: streamName,
20 subjects: [subject],
21 })
22 console.log(`Stream '${streamName}' created or already exists.`)
23 } catch (err) {
24 console.error(`Error setting up stream: ${err.message}`)
25 }
26}
27
28function randomMessage(): Message {
29 const events = [
30 Event.GodchildRequest,
31 Event.NewPost,
32 Event.NewTicket,
33 ] as const
34 const event = events[Math.floor(Math.random() * events.length)]
35 const id = Math.random().toString(36).substring(7)
36 const send_at = new Date()
37 send_at.setSeconds(send_at.getSeconds() + Math.floor(Math.random() * 10))
38 return {
39 event,
40 id,
41 send_at,
42 clear_schedule_for:
43 Math.random() > 0.5
44 ? []
45 : Math.random() > 0.5
46 ? [Event.GodchildRequest, event]
47 : [event],
48 }
49}
50
51async function publishMessages(
52 nc: NatsConnection,
53 subject: string,
54 messageCount: number,
55 delayMs: number
56) {
57 const js = nc.jetstream()
58 const sc = StringCodec()
59
60 for (let i = 1; i <= messageCount; i++) {
61 const message = `Mock Order #${i}`
62 await js.publish(subject, sc.encode(JSON.stringify(randomMessage())))
63 console.log(`Sent message: ${message}`)
64 await new Promise((resolve) => setTimeout(resolve, delayMs))
65 }
66}
67
68async function main() {
69 // Connect to the NATS server
70 const nc = await connect({ servers: "localhost:4222" })
71 console.log("Connected to NATS")
72
73 // Create a JetStream manager to manage streams
74 const jsm = await nc.jetstreamManager()
75
76 // Ensure the stream exists
77 await setupStream(jsm, STREAM_NAME, SUBJECT_NAME)
78
79 // Publish messages at intervals
80 const messageCount = 1000
81 const delayMs = 10 // 1 second delay between messages
82 await publishMessages(nc, SUBJECT_NAME, messageCount, delayMs)
83
84 console.log("Finished sending messages.")
85 await nc.close()
86}
87
88main().catch((err) => {
89 console.error(`Error in sender: ${err.message}`)
90})