77 lines
2.0 KiB
Swift
Executable File
77 lines
2.0 KiB
Swift
Executable File
// Copyright 2024 The NATS Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
import Foundation
|
|
import Nats
|
|
|
|
print("\n### Setup NATS Connection")
|
|
|
|
let nats = NatsClientOptions()
|
|
.url(URL(string: "nats://localhost:4222")!)
|
|
.build()
|
|
|
|
nats.on(.connected) { event in
|
|
print("event: connected")
|
|
}
|
|
|
|
print("connecting...")
|
|
try await nats.connect()
|
|
|
|
print("\n### Publish / Subscribe")
|
|
|
|
print("subscribing...")
|
|
let sub = try await nats.subscribe(subject: "foo.>")
|
|
|
|
let loop = Task {
|
|
print("starting message loop...")
|
|
|
|
for try await msg in sub {
|
|
|
|
if msg.subject == "foo.done" {
|
|
break
|
|
}
|
|
|
|
if let payload = msg.payload {
|
|
print("received \(msg.subject): \(String(data: payload, encoding: .utf8) ?? "")")
|
|
}
|
|
|
|
if let headers = msg.headers {
|
|
if let headerValue = headers.get(try! NatsHeaderName("X-Example")) {
|
|
print(" header: X-Example: \(headerValue.description)")
|
|
}
|
|
}
|
|
}
|
|
|
|
print("message loop done...")
|
|
}
|
|
|
|
print("publishing data...")
|
|
for i in 1...3 {
|
|
var headers = NatsHeaderMap()
|
|
headers.append(try! NatsHeaderName("X-Example"), NatsHeaderValue("example value"))
|
|
|
|
if let data = "data\(i)".data(using: .utf8) {
|
|
try await nats.publish(data, subject: "foo.\(i)", headers: headers)
|
|
}
|
|
}
|
|
|
|
print("signalling done...")
|
|
try await nats.publish(Data(), subject: "foo.done")
|
|
|
|
try await loop.value
|
|
|
|
print("closing...")
|
|
try await nats.close()
|
|
|
|
print("bye")
|