From 36cca713c1b01f0c4f8ccd89645b4a87e5dae1c2 Mon Sep 17 00:00:00 2001 From: Alberto Ricart Date: Fri, 11 Oct 2024 10:12:19 -0500 Subject: [PATCH] [TS] new version of typescript (deno 2.0) override keyword is required [TS] new version of typescript (deno 2.0) have unknown catch. [CI] ci test flappers Signed-off-by: Alberto Ricart --- core/src/codec.ts | 4 +-- core/src/core.ts | 2 -- core/src/nats.ts | 6 ++-- core/src/options.ts | 2 +- core/src/protocol.ts | 8 ++--- core/src/typedsub.ts | 6 ++-- core/tests/auth_test.ts | 6 ++-- core/tests/basics_test.ts | 10 +++--- core/tests/drain_test.ts | 4 +-- core/tests/reconnect_test.ts | 2 +- core/tests/timeout_test.ts | 4 +-- core/tests/token_test.ts | 4 +-- jetstream/src/consumer.ts | 12 +++---- jetstream/src/jsclient.ts | 4 +-- jetstream/src/jslister.ts | 2 +- jetstream/src/jsmconsumer_api.ts | 2 +- jetstream/src/jsmsg.ts | 5 +-- jetstream/src/pushconsumer.ts | 4 +-- jetstream/tests/consumers_ordered_test.ts | 33 ++++--------------- .../tests/jetstream_fetchconsumer_test.ts | 2 +- .../tests/jetstream_pullconsumer_test.ts | 12 +++---- jetstream/tests/jetstream_test.ts | 4 +-- jetstream/tests/jscluster_test.ts | 2 +- jetstream/tests/jsm_test.ts | 8 ++--- jetstream/tests/jsmsg_test.ts | 2 +- jetstream/tests/util.ts | 24 ++++++++++++++ kv/src/kv.ts | 6 ++-- kv/tests/kv_test.ts | 10 ++++-- obj/src/objectstore.ts | 8 ++--- obj/tests/objectstore_test.ts | 1 - services/src/service.ts | 6 ++-- services/src/serviceclient.ts | 2 +- test_helpers/asserts.ts | 2 +- test_helpers/launcher.ts | 10 +++--- test_helpers/mod.ts | 4 +-- transport-deno/src/deno_transport.ts | 4 +-- 36 files changed, 118 insertions(+), 109 deletions(-) diff --git a/core/src/codec.ts b/core/src/codec.ts index 390892e6..283adfe8 100644 --- a/core/src/codec.ts +++ b/core/src/codec.ts @@ -63,7 +63,7 @@ export function JSONCodec( } return TE.encode(JSON.stringify(d)); } catch (err) { - throw NatsError.errorForCode(ErrorCode.BadJson, err); + throw NatsError.errorForCode(ErrorCode.BadJson, err as Error); } }, @@ -71,7 +71,7 @@ export function JSONCodec( try { return JSON.parse(TD.decode(a), reviver); } catch (err) { - throw NatsError.errorForCode(ErrorCode.BadJson, err); + throw NatsError.errorForCode(ErrorCode.BadJson, err as Error); } }, }; diff --git a/core/src/core.ts b/core/src/core.ts index 6806e4b3..f062e5b9 100644 --- a/core/src/core.ts +++ b/core/src/core.ts @@ -139,8 +139,6 @@ export class Messages { const messages: Messages = new Messages(); export class NatsError extends Error { - name: string; - message: string; // TODO: on major version this should change to a number/enum code: string; permissionContext?: { operation: string; subject: string; queue?: string }; diff --git a/core/src/nats.ts b/core/src/nats.ts index fe9c406f..23b52333 100644 --- a/core/src/nats.ts +++ b/core/src/nats.ts @@ -292,7 +292,7 @@ export class NatsConnectionImpl implements NatsConnection { try { this.publish(subject, data, { reply: sub.getSubject() }); } catch (err) { - cancel(err); + cancel(err as NatsError); } let timer = setTimeout(() => { @@ -328,7 +328,7 @@ export class NatsConnectionImpl implements NatsConnection { }, ); } catch (err) { - r.cancel(err); + r.cancel(err as NatsError); } } @@ -418,7 +418,7 @@ export class NatsConnectionImpl implements NatsConnection { }, ); } catch (err) { - r.cancel(err); + r.cancel(err as NatsError); } const p = Promise.race([r.timer, r.deferred]); diff --git a/core/src/options.ts b/core/src/options.ts index 6a0241ab..62388f03 100644 --- a/core/src/options.ts +++ b/core/src/options.ts @@ -125,7 +125,7 @@ export function parseOptions(opts?: ConnectionOptions): ConnectionOptions { try { createInbox(options.inboxPrefix); } catch (err) { - throw new NatsError(err.message, ErrorCode.ApiError); + throw new NatsError((err as Error).message, ErrorCode.ApiError); } } diff --git a/core/src/protocol.ts b/core/src/protocol.ts index 11beb591..52d87023 100644 --- a/core/src/protocol.ts +++ b/core/src/protocol.ts @@ -583,7 +583,7 @@ export class ProtocolHandler implements Dispatcher { if (timer) { timer.cancel(); } - await this.transport.close(err); + await this.transport.close(err as Error); throw err; } } @@ -608,7 +608,7 @@ export class ProtocolHandler implements Dispatcher { // if here we connected return; } catch (err) { - lastErr = err; + lastErr = err as Error; } } // if we are here, we failed, and we have no additional @@ -659,7 +659,7 @@ export class ProtocolHandler implements Dispatcher { await this._doDial(srv); break; } catch (err) { - lastError = err; + lastError = err as Error; if (!this.connectedOnce) { if (this.options.waitOnFirstConnect) { continue; @@ -839,7 +839,7 @@ export class ProtocolHandler implements Dispatcher { this.transport.send(PING_CMD); } catch (err) { // if we are dying here, this is likely some an authenticator blowing up - this._close(err); + this._close(err as Error); } } if (updates) { diff --git a/core/src/typedsub.ts b/core/src/typedsub.ts index 09e55555..6f3de9d0 100644 --- a/core/src/typedsub.ts +++ b/core/src/typedsub.ts @@ -202,15 +202,15 @@ export class TypedSubscription extends QueuedIteratorImpl return this.sub.getSubject(); } - getReceived(): number { + override getReceived(): number { return this.sub.getReceived(); } - getProcessed(): number { + override getProcessed(): number { return this.sub.getProcessed(); } - getPending(): number { + override getPending(): number { return this.sub.getPending(); } diff --git a/core/tests/auth_test.ts b/core/tests/auth_test.ts index f8910668..38369f45 100644 --- a/core/tests/auth_test.ts +++ b/core/tests/auth_test.ts @@ -75,7 +75,7 @@ Deno.test("auth - none", async () => { await nc.close(); fail("shouldnt have been able to connect"); } catch (ex) { - assertErrorCode(ex, ErrorCode.AuthorizationViolation); + assertErrorCode(ex as NatsError, ErrorCode.AuthorizationViolation); } await ns.stop(); }); @@ -89,7 +89,7 @@ Deno.test("auth - bad", async () => { await nc.close(); fail("shouldnt have been able to connect"); } catch (ex) { - assertErrorCode(ex, ErrorCode.AuthorizationViolation); + assertErrorCode(ex as NatsError, ErrorCode.AuthorizationViolation); } await ns.stop(); }); @@ -447,7 +447,7 @@ Deno.test("basics - bad auth", async () => { }, ); } catch (err) { - assertErrorCode(err, ErrorCode.AuthorizationViolation); + assertErrorCode(err as NatsError, ErrorCode.AuthorizationViolation); } }); diff --git a/core/tests/basics_test.ts b/core/tests/basics_test.ts index bc68d547..b4764077 100644 --- a/core/tests/basics_test.ts +++ b/core/tests/basics_test.ts @@ -110,7 +110,7 @@ Deno.test("basics - no publish without subject", async () => { nc.publish(""); fail("should not be able to publish without a subject"); } catch (err) { - assertEquals(err.code, ErrorCode.BadSubject); + assertEquals((err as NatsError).code, ErrorCode.BadSubject); } finally { await cleanup(ns, nc); } @@ -723,14 +723,14 @@ Deno.test("basics - no max_payload messages", async () => { nc.publish(subj, big); fail(); } catch (err) { - assertErrorCode(err, ErrorCode.MaxPayloadExceeded); + assertErrorCode(err as NatsError, ErrorCode.MaxPayloadExceeded); } try { await nc.request(subj, big).then(); fail(); } catch (err) { - assertErrorCode(err, ErrorCode.MaxPayloadExceeded); + assertErrorCode(err as NatsError, ErrorCode.MaxPayloadExceeded); } const sub = nc.subscribe(subj); @@ -1238,7 +1238,9 @@ Deno.test("basics - initial connect error", async () => { // in node we may get a disconnect which we generated // in deno we get the connection reset - but if running in CI this may turn out to be // a connection refused - assertArrayIncludes(["ECONNRESET", "CONNECTION_REFUSED"], [err.code]); + assertArrayIncludes(["ECONNRESET", "CONNECTION_REFUSED"], [ + (err as NatsError).code, + ]); } listener.close(); await done; diff --git a/core/tests/drain_test.ts b/core/tests/drain_test.ts index 292faf25..0c07bcfb 100644 --- a/core/tests/drain_test.ts +++ b/core/tests/drain_test.ts @@ -14,7 +14,7 @@ */ import { assert, assertEquals, fail } from "jsr:@std/assert"; import { createInbox, ErrorCode, StringCodec } from "../src/internal_mod.ts"; -import type { Msg } from "../src/internal_mod.ts"; +import type { Msg, NatsError } from "../src/internal_mod.ts"; import { assertThrowsAsyncErrorCode, assertThrowsErrorCode, @@ -160,7 +160,7 @@ Deno.test("drain - reject reqrep during connection drain", async () => { fail("shouldn't have been able to request"); lock.unlock(); } catch (err) { - assertEquals(err.code, ErrorCode.ConnectionDraining); + assertEquals((err as NatsError).code, ErrorCode.ConnectionDraining); lock.unlock(); } } diff --git a/core/tests/reconnect_test.ts b/core/tests/reconnect_test.ts index 0c4201cb..3a96cdca 100644 --- a/core/tests/reconnect_test.ts +++ b/core/tests/reconnect_test.ts @@ -80,7 +80,7 @@ Deno.test("reconnect - events", async () => { try { await nc.closed(); } catch (err) { - assertErrorCode(err, ErrorCode.ConnectionRefused); + assertErrorCode(err as NatsError, ErrorCode.ConnectionRefused); } assertEquals(disconnects, 1); assertEquals(reconnecting, 10); diff --git a/core/tests/timeout_test.ts b/core/tests/timeout_test.ts index 20888df3..a6b19cfc 100644 --- a/core/tests/timeout_test.ts +++ b/core/tests/timeout_test.ts @@ -23,7 +23,7 @@ Deno.test("timeout - request noMux stack is useful", async () => { await nc.request(subj, Empty, { noMux: true, timeout: 250 }); fail("request should have failed!"); } catch (err) { - assertStringIncludes(err.stack, "timeout_test"); + assertStringIncludes((err as Error).stack || "", "timeout_test"); } await nc.close(); }); @@ -35,7 +35,7 @@ Deno.test("timeout - request stack is useful", async () => { await nc.request(subj, Empty, { timeout: 250 }); fail("request should have failed!"); } catch (err) { - assertStringIncludes(err.stack, "timeout_test"); + assertStringIncludes((err as Error).stack || "", "timeout_test"); } await nc.close(); }); diff --git a/core/tests/token_test.ts b/core/tests/token_test.ts index 36aa056c..633eb1df 100644 --- a/core/tests/token_test.ts +++ b/core/tests/token_test.ts @@ -31,7 +31,7 @@ Deno.test("token - empty", async () => { await nc.close(); fail("should not have connected"); } catch (err) { - assertErrorCode(err, ErrorCode.AuthorizationViolation); + assertErrorCode(err as Error, ErrorCode.AuthorizationViolation); } await ns.stop(); }); @@ -45,7 +45,7 @@ Deno.test("token - bad", async () => { await nc.close(); fail("should not have connected"); } catch (err) { - assertErrorCode(err, ErrorCode.AuthorizationViolation); + assertErrorCode(err as Error, ErrorCode.AuthorizationViolation); } await ns.stop(); }); diff --git a/jetstream/src/consumer.ts b/jetstream/src/consumer.ts index 31a44c6c..9f1b2c5b 100644 --- a/jetstream/src/consumer.ts +++ b/jetstream/src/consumer.ts @@ -435,7 +435,7 @@ export class PullConsumerMessagesImpl extends QueuedIteratorImpl fn(); } } catch (err) { - this.stop(err); + this.stop(err as Error); } } } @@ -493,14 +493,14 @@ export class PullConsumerMessagesImpl extends QueuedIteratorImpl return true; } catch (err) { // game over - if (err.message === "stream not found") { + if ((err as Error).message === "stream not found") { streamNotFound++; this.notify(ConsumerEvents.StreamNotFound, streamNotFound); if (!this.isConsume || this.abortOnMissingResource) { - this.stop(err); + this.stop(err as Error); return false; } - } else if (err.message === "consumer not found") { + } else if ((err as Error).message === "consumer not found") { notFound++; this.notify(ConsumerEvents.ConsumerNotFound, notFound); if (!this.isConsume || this.abortOnMissingResource) { @@ -508,7 +508,7 @@ export class PullConsumerMessagesImpl extends QueuedIteratorImpl const ocs = this.consumer.orderedConsumerState!; ocs.needsReset = true; } - this.stop(err); + this.stop(err as Error); return false; } if (this.consumer.ordered) { @@ -595,7 +595,7 @@ export class PullConsumerMessagesImpl extends QueuedIteratorImpl this.timeout = null; } - stop(err?: Error) { + override stop(err?: Error) { if (this.done) { return; } diff --git a/jetstream/src/jsclient.ts b/jetstream/src/jsclient.ts index f192cf9c..ed4f4f99 100644 --- a/jetstream/src/jsclient.ts +++ b/jetstream/src/jsclient.ts @@ -191,7 +191,7 @@ export class JetStreamManagerImpl extends BaseApiClientImpl const kind = chunks[chunks.length - 1]; iter.push({ kind: kind as AdvisoryKind, data: d }); } catch (err) { - iter.stop(err); + iter.stop(err as Error); } }, }); @@ -676,7 +676,7 @@ export class JetStreamClientImpl extends BaseApiClientImpl } } catch (err) { //consumer doesn't exist - if (err.code !== "404") { + if ((err as NatsError).code !== "404") { throw err; } } diff --git a/jetstream/src/jslister.ts b/jetstream/src/jslister.ts index a3c97a19..2f783a30 100644 --- a/jetstream/src/jslister.ts +++ b/jetstream/src/jslister.ts @@ -77,7 +77,7 @@ export class ListerImpl implements Lister, AsyncIterable { this.offset += count; return this.filter(r); } catch (err) { - this.err = err; + this.err = err as Error; throw err; } } diff --git a/jetstream/src/jsmconsumer_api.ts b/jetstream/src/jsmconsumer_api.ts index dfdd4eed..4e3db947 100644 --- a/jetstream/src/jsmconsumer_api.ts +++ b/jetstream/src/jsmconsumer_api.ts @@ -89,7 +89,7 @@ export class ConsumerAPIImpl extends BaseApiClientImpl implements ConsumerAPI { minValidation("name", name); } catch (err) { // if we have a cannot contain the message, massage a bit - const m = err.message; + const m = (err as Error).message; const idx = m.indexOf("cannot contain"); if (idx !== -1) { throw new Error(`consumer 'name' ${m.substring(idx)}`); diff --git a/jetstream/src/jsmsg.ts b/jetstream/src/jsmsg.ts index bb527a85..9acb29e8 100644 --- a/jetstream/src/jsmsg.ts +++ b/jetstream/src/jsmsg.ts @@ -17,6 +17,7 @@ import type { Msg, MsgHdrs, MsgImpl, + NatsError, ProtocolHandler, RequestOptions, } from "@nats-io/nats-core/internal"; @@ -256,13 +257,13 @@ export class JsMsgImpl implements JsMsg { }, ); } catch (err) { - r.cancel(err); + r.cancel(err as NatsError); } try { await Promise.race([r.timer, r.deferred]); d.resolve(true); } catch (err) { - r.cancel(err); + r.cancel(err as NatsError); d.reject(err); } } else { diff --git a/jetstream/src/pushconsumer.ts b/jetstream/src/pushconsumer.ts index 68c8934f..985cce0e 100644 --- a/jetstream/src/pushconsumer.ts +++ b/jetstream/src/pushconsumer.ts @@ -166,7 +166,7 @@ export class PushConsumerMessagesImpl extends QueuedIteratorImpl return this.iterClosed; } - stop(err?: Error) { + override stop(err?: Error) { if (this.done) { return; } @@ -207,7 +207,7 @@ export class PushConsumerMessagesImpl extends QueuedIteratorImpl fn(); } } catch (err) { - this.stop(err); + this.stop(err as Error); } } } diff --git a/jetstream/tests/consumers_ordered_test.ts b/jetstream/tests/consumers_ordered_test.ts index 2661fbe3..ce510b80 100644 --- a/jetstream/tests/consumers_ordered_test.ts +++ b/jetstream/tests/consumers_ordered_test.ts @@ -40,7 +40,8 @@ import type { PullConsumerImpl, PullConsumerMessagesImpl, } from "../src/consumer.ts"; -import { fail } from "node:assert"; +import { StreamImpl } from "../src/jsmstream_api.ts"; +import { delayUntilAssetNotFound } from "./util.ts"; Deno.test("ordered consumers - get", async () => { const { ns, nc } = await _setup(connect, jetstreamServerConf()); @@ -769,12 +770,14 @@ Deno.test("ordered consumers - next stream not found", async () => { Deno.test("ordered consumers - fetch stream not found", async () => { const { ns, nc } = await _setup(connect, jetstreamServerConf()); const jsm = await jetstreamManager(nc); - await jsm.streams.add({ name: "A", subjects: ["a"] }); + const si = await jsm.streams.add({ name: "A", subjects: ["a"] }); const js = jetstream(nc); const c = await js.consumers.get("A"); + const s = new StreamImpl(jsm.streams, si); await jsm.streams.delete("A"); + await delayUntilAssetNotFound(s); const iter = await c.fetch({ expires: 3000, @@ -1110,18 +1113,7 @@ Deno.test("ordered consumers - stale reference recovers", async () => { assert(await c.delete()); // continue until the server says the consumer doesn't exist - while (true) { - try { - await c.info(); - await delay(20); - } catch (err) { - if (err.message === "consumer not found") { - break; - } else { - fail(err.message); - } - } - } + await delayUntilAssetNotFound(c); // so should get that error once await assertRejects( @@ -1151,18 +1143,7 @@ Deno.test("ordered consumers - consume stale reference recovers", async () => { const c = await js.consumers.get("A") as PullConsumerImpl; assert(await c.delete()); // continue until the server says the consumer doesn't exist - while (true) { - try { - await c.info(); - await delay(20); - } catch (err) { - if (err.message === "consumer not found") { - break; - } else { - fail(err.message); - } - } - } + await delayUntilAssetNotFound(c); const iter = await c.consume({ idle_heartbeat: 1_000, expires: 30_000 }); diff --git a/jetstream/tests/jetstream_fetchconsumer_test.ts b/jetstream/tests/jetstream_fetchconsumer_test.ts index dd7def38..5d803b1a 100644 --- a/jetstream/tests/jetstream_fetchconsumer_test.ts +++ b/jetstream/tests/jetstream_fetchconsumer_test.ts @@ -506,7 +506,7 @@ Deno.test("jetstream - fetch on stopped server doesn't close client", async () = break; } } catch (err) { - fail(`shouldn't have errored: ${err.message}`); + fail(`shouldn't have errored: ${(err as Error).message}`); } } await cleanup(ns, nc); diff --git a/jetstream/tests/jetstream_pullconsumer_test.ts b/jetstream/tests/jetstream_pullconsumer_test.ts index 6e304220..6b5ce6ca 100644 --- a/jetstream/tests/jetstream_pullconsumer_test.ts +++ b/jetstream/tests/jetstream_pullconsumer_test.ts @@ -665,7 +665,7 @@ Deno.test("jetstream - pull errors", async () => { try { await js.pull(stream, "me", expires); } catch (err) { - assertEquals(err.code, code); + assertEquals((err as NatsError).code, code); } } @@ -705,8 +705,8 @@ Deno.test("jetstream - pull error: max_waiting", async () => { try { await js.pull(stream, "me", expires); } catch (err) { - d.resolve(err); - assertEquals(err.code, code); + d.resolve(err as NatsError); + assertEquals((err as NatsError).code, code); } return d; } @@ -729,7 +729,7 @@ Deno.test("jetstream - pull error: js not enabled", async () => { try { await js.pull("stream", "me", expires); } catch (err) { - noMsgs.resolve(err); + noMsgs.resolve(err as NatsError); } const ne = await noMsgs; assertEquals(ne.code, code); @@ -868,7 +868,7 @@ Deno.test("jetstream - pull on stopped server doesn't close client", async () => try { await js.pull(stream, "dur", 500); } catch (err) { - switch (err.code) { + switch ((err as NatsError).code) { case ErrorCode.Timeout: // js is not ready continue; @@ -876,7 +876,7 @@ Deno.test("jetstream - pull on stopped server doesn't close client", async () => requestTimeouts++; break; default: - fail(`unexpected error: ${err.message}`); + fail(`unexpected error: ${(err as Error).message}`); break; } } diff --git a/jetstream/tests/jetstream_test.ts b/jetstream/tests/jetstream_test.ts index caa86e9c..737f72ab 100644 --- a/jetstream/tests/jetstream_test.ts +++ b/jetstream/tests/jetstream_test.ts @@ -1271,8 +1271,8 @@ Deno.test("jetstream - ordered consumer reset", async () => { ack = await js.publish(subj); break; } catch (err) { - if (err.code !== ErrorCode.Timeout) { - fail(err.message); + if ((err as NatsError).code !== ErrorCode.Timeout) { + fail((err as Error).message); } await delay(1000); } diff --git a/jetstream/tests/jscluster_test.ts b/jetstream/tests/jscluster_test.ts index ea132351..a43e4a27 100644 --- a/jetstream/tests/jscluster_test.ts +++ b/jetstream/tests/jscluster_test.ts @@ -83,7 +83,7 @@ Deno.test("jsm - stream update properties", async () => { } } catch (err) { if (!shouldFail) { - fail(err.message); + fail((err as Error).message); } } } diff --git a/jetstream/tests/jsm_test.ts b/jetstream/tests/jsm_test.ts index eff4431a..38c25a6d 100644 --- a/jetstream/tests/jsm_test.ts +++ b/jetstream/tests/jsm_test.ts @@ -2201,7 +2201,7 @@ Deno.test("jsm - validate stream name in operations", async () => { const m = v === "" ? "stream name required" : `invalid stream name - stream name cannot contain '${v}'`; - assertEquals(err.message, m, `${test.name} - ${m}`); + assertEquals((err as Error).message, m, `${test.name} - ${m}`); } } } @@ -2232,7 +2232,7 @@ Deno.test("jsm - validate consumer name", async () => { if (v === "\n") v = "\\n"; if (v === "\t") v = "\\t"; const m = `invalid durable name - durable name cannot contain '${v}'`; - assertEquals(err.message, m); + assertEquals((err as Error).message, m); } } @@ -2249,7 +2249,7 @@ Deno.test("jsm - validate consumer name", async () => { if (v === "\n") v = "\\n"; if (v === "\t") v = "\\t"; const m = `consumer 'name' cannot contain '${v}'`; - assertEquals(err.message, m); + assertEquals((err as Error).message, m); } } @@ -2300,7 +2300,7 @@ Deno.test("jsm - validate consumer name in operations", async () => { const m = v === "" ? "durable name required" : `invalid durable name - durable name cannot contain '${v}'`; - assertEquals(err.message, m, `${test.name} - ${m}`); + assertEquals((err as Error).message, m, `${test.name} - ${m}`); } } } diff --git a/jetstream/tests/jsmsg_test.ts b/jetstream/tests/jsmsg_test.ts index bb3c0425..cbb66e92 100644 --- a/jetstream/tests/jsmsg_test.ts +++ b/jetstream/tests/jsmsg_test.ts @@ -70,7 +70,7 @@ Deno.test("jsmsg - parse rejects subject is not 9 tokens", () => { } } catch (err) { if (ok) { - fail(`${s} shouldn't have failed to parse: ${err.message}`); + fail(`${s} shouldn't have failed to parse: ${(err as Error).message}`); } } }; diff --git a/jetstream/tests/util.ts b/jetstream/tests/util.ts index 44d02d23..e1c7a241 100644 --- a/jetstream/tests/util.ts +++ b/jetstream/tests/util.ts @@ -1,3 +1,8 @@ +import { delay } from "@nats-io/nats-core"; +import { fail } from "node:assert"; +import type { Consumer, Stream } from "../src/types.ts"; +import { StreamImpl } from "../src/jsmstream_api.ts"; + export function stripNatsMetadata(md?: Record) { if (md) { for (const p in md) { @@ -7,3 +12,22 @@ export function stripNatsMetadata(md?: Record) { } } } + +export async function delayUntilAssetNotFound( + a: Consumer | Stream, +): Promise { + const expected = a instanceof StreamImpl ? "stream" : "consumer"; + const m = `${expected} not found`; + while (true) { + try { + await a.info(); + await delay(20); + } catch (err) { + if ((err as Error).message === m) { + break; + } else { + fail((err as Error).message); + } + } + } +} diff --git a/kv/src/kv.ts b/kv/src/kv.ts index 2c36ba03..68794092 100644 --- a/kv/src/kv.ts +++ b/kv/src/kv.ts @@ -429,7 +429,7 @@ export class Bucket implements KV, KvRemove { this.direct = false; } } catch (err) { - if (err.message === "stream not found") { + if ((err as Error).message === "stream not found") { info = await this.jsm.streams.add(sc); } else { throw err; @@ -567,7 +567,7 @@ export class Bucket implements KV, KvRemove { return Promise.resolve(n); } catch (err) { firstErr = err; - if (err?.api_error?.err_code !== 10071) { + if ((err as NatsError)?.api_error?.err_code !== 10071) { return Promise.reject(err); } } @@ -648,7 +648,7 @@ export class Bucket implements KV, KvRemove { return ke; } catch (err) { if ( - err.code === ErrorCode.JetStream404NoMessages + (err as NatsError).code === ErrorCode.JetStream404NoMessages ) { return null; } diff --git a/kv/tests/kv_test.ts b/kv/tests/kv_test.ts index 1703c20c..7fd6a16f 100644 --- a/kv/tests/kv_test.ts +++ b/kv/tests/kv_test.ts @@ -116,7 +116,9 @@ Deno.test("kv - key validation", () => { validateKey(v); } catch (err) { throw new Error( - `expected '${v}' to be a valid key, but was rejected: ${err.message}`, + `expected '${v}' to be a valid key, but was rejected: ${ + (err as Error).message + }`, ); } } @@ -147,7 +149,9 @@ Deno.test("kv - bucket name validation", () => { validateBucket(v); } catch (err) { throw new Error( - `expected '${v}' to be a valid bucket name, but was rejected: ${err.message}`, + `expected '${v}' to be a valid bucket name, but was rejected: ${ + (err as Error).message + }`, ); } } @@ -1271,7 +1275,7 @@ Deno.test("kv - watch init callback exceptions terminate the iterator", async () } })(); } catch (err) { - d.resolve(err); + d.resolve(err as Error); } const err = await d; assertEquals(err.message, "crash"); diff --git a/obj/src/objectstore.ts b/obj/src/objectstore.ts index 48ba9eec..bfaaf749 100644 --- a/obj/src/objectstore.ts +++ b/obj/src/objectstore.ts @@ -368,7 +368,7 @@ export class ObjectStoreImpl implements ObjectStore { soi.revision = m.seq; return soi; } catch (err) { - if (err.code === "404") { + if ((err as NatsError).code === "404") { return null; } return Promise.reject(err); @@ -812,11 +812,11 @@ export class ObjectStoreImpl implements ObjectStore { try { await this.jsm.streams.getMessage(this.stream, { last_by_subj: subj }); } catch (err) { - if (err.code === "404") { + if ((err as NatsError).code === "404") { qi.push(null); initialized = true; } else { - qi.stop(err); + qi.stop(err as Error); } } const cc: Partial = {}; @@ -903,7 +903,7 @@ export class ObjectStoreImpl implements ObjectStore { try { await this.jsm.streams.info(sc.name); } catch (err) { - if (err.message === "stream not found") { + if ((err as Error).message === "stream not found") { await this.jsm.streams.add(sc); } } diff --git a/obj/tests/objectstore_test.ts b/obj/tests/objectstore_test.ts index 8e27d4ac..d89980e2 100644 --- a/obj/tests/objectstore_test.ts +++ b/obj/tests/objectstore_test.ts @@ -38,7 +38,6 @@ import { StringCodec, } from "@nats-io/nats-core/internal"; import type { NatsConnectionImpl } from "@nats-io/nats-core/internal"; -import { crypto } from "https://deno.land/std@0.221.0/crypto/mod.ts"; import type { ObjectInfo, ObjectStoreMeta } from "../src/types.ts"; import { jetstreamManager, StorageType } from "@nats-io/jetstream"; import { equals } from "https://deno.land/std@0.221.0/bytes/mod.ts"; diff --git a/services/src/service.ts b/services/src/service.ts index 463f4b2d..5a2a5bad 100644 --- a/services/src/service.ts +++ b/services/src/service.ts @@ -383,8 +383,8 @@ export class ServiceImpl implements Service { try { handler(err, new ServiceMsgImpl(msg)); } catch (err) { - sv.stats.countError(err); - msg?.respond(Empty, { headers: this.errorToHeader(err) }); + sv.stats.countError(err as Error); + msg?.respond(Empty, { headers: this.errorToHeader(err as Error) }); } finally { sv.stats.countLatency(start); } @@ -441,7 +441,7 @@ export class ServiceImpl implements Service { try { h.stats.data = await this.config.statsHandler(h); } catch (err) { - h.stats.countError(err); + h.stats.countError(err as Error); } } endpoints.push(h.stats.stats(h.qi)); diff --git a/services/src/serviceclient.ts b/services/src/serviceclient.ts index 82bfeb28..b6def53e 100644 --- a/services/src/serviceclient.ts +++ b/services/src/serviceclient.ts @@ -90,7 +90,7 @@ export class ServiceClientImpl implements ServiceClient { } catch (err) { // @ts-ignore: pushing fn iter.push(() => { - iter.stop(err); + iter.stop(err as Error); }); } } diff --git a/test_helpers/asserts.ts b/test_helpers/asserts.ts index befe1830..d1e5e3fa 100644 --- a/test_helpers/asserts.ts +++ b/test_helpers/asserts.ts @@ -51,7 +51,7 @@ export async function assertThrowsAsyncErrorCode( await fn(); fail("expected to throw"); } catch (err) { - assertErrorCode(err, ...codes); + assertErrorCode(err as Error, ...codes); } } diff --git a/test_helpers/launcher.ts b/test_helpers/launcher.ts index fe639805..a33b6cc2 100644 --- a/test_helpers/launcher.ts +++ b/test_helpers/launcher.ts @@ -282,7 +282,7 @@ export class NatsServer implements PortInfo { Deno.removeSync(portsFile); } catch (err) { if (!(err instanceof Deno.errors.NotFound)) { - console.log(err.message); + console.log((err as Error).message); } } } @@ -292,7 +292,7 @@ export class NatsServer implements PortInfo { Deno.removeSync(this.configFile); } catch (err) { if (!(err instanceof Deno.errors.NotFound)) { - console.log(err.message); + console.log((err as Error).message); } } } @@ -303,7 +303,7 @@ export class NatsServer implements PortInfo { Deno.removeSync(this.config.jetstream.store_dir, { recursive: true }); } catch (err) { if (!(err instanceof Deno.errors.NotFound)) { - console.log(err.message); + console.log((err as Error).message); } } } @@ -484,7 +484,7 @@ export class NatsServer implements PortInfo { proms: Promise[], debug = false, ): Promise { - const errs = 0; + let errs = 0; let servers: NatsServer[] = []; const statusProms: Promise[] = []; const leaders: string[] = []; @@ -537,7 +537,7 @@ export class NatsServer implements PortInfo { } } } catch (err) { - err++; + errs++; if (errs > 10) { throw err; } diff --git a/test_helpers/mod.ts b/test_helpers/mod.ts index 25e20f18..142148d0 100644 --- a/test_helpers/mod.ts +++ b/test_helpers/mod.ts @@ -167,8 +167,8 @@ export function flakyTest( for (let i = 0; i < count; i++) { try { return await fn(); - } catch (error) { - errors.push(error); + } catch (err) { + errors.push(err as Error); } } throw new AggregateError(errors); diff --git a/transport-deno/src/deno_transport.ts b/transport-deno/src/deno_transport.ts index d6f61570..126bb469 100644 --- a/transport-deno/src/deno_transport.ts +++ b/transport-deno/src/deno_transport.ts @@ -94,7 +94,7 @@ export class DenoTransport implements Transport { } } catch (err) { this.conn?.close(); - throw err.name === "ConnectionRefused" + throw (err as NatsError)?.name === "ConnectionRefused" ? NatsError.errorForCode(ErrorCode.ConnectionRefused) : err; } @@ -190,7 +190,7 @@ export class DenoTransport implements Transport { yield frame; } } catch (err) { - reason = err; + reason = err as Error; break; } }