eventsourcingdb 0.12.7 → 0.12.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,6 +10,12 @@ This client SDK includes support for [Testcontainers](https://testcontainers.com
10
10
 
11
11
  ## Getting Started
12
12
 
13
+ Install the client SDK:
14
+
15
+ ```shell
16
+ npm install eventsourcingdb
17
+ ```
18
+
13
19
  Import the `Client` class and create an instance by providing the URL of your EventSourcingDB instance and the API token to use:
14
20
 
15
21
  ```typescript
@@ -397,12 +403,12 @@ controller.abort();
397
403
 
398
404
  ### Using Testcontainers
399
405
 
400
- Import the `EventSourcingDbContainer` class, create an instance, call the `start` function to run a test container, get a client, run your test code, and finally call the `stop` function to stop the test container:
406
+ Import the `Container` class, create an instance, call the `start` function to run a test container, get a client, run your test code, and finally call the `stop` function to stop the test container:
401
407
 
402
408
  ```typescript
403
- import { EventSourcingDbContainer } from 'eventsourcingdb';
409
+ import { Container } from 'eventsourcingdb';
404
410
 
405
- const container = new EventSourcingDbContainer();
411
+ const container = new Container();
406
412
  await container.start();
407
413
 
408
414
  const client = container.getClient();
@@ -420,17 +426,17 @@ const isRunning = container.isRunning();
420
426
 
421
427
  #### Configuring the Container Instance
422
428
 
423
- By default, `EventSourcingDbContainer` uses the `latest` tag of the official EventSourcingDB Docker image. To change that, call the `withImageTag` function:
429
+ By default, `Container` uses the `latest` tag of the official EventSourcingDB Docker image. To change that, call the `withImageTag` function:
424
430
 
425
431
  ```typescript
426
- const container = new EventSourcingDbContainer()
432
+ const container = new Container()
427
433
  .withImageTag('1.0.0');
428
434
  ```
429
435
 
430
436
  Similarly, you can configure the port to use and the API token. Call the `withPort` or the `withApiToken` function respectively:
431
437
 
432
438
  ```typescript
433
- const container = new EventSourcingDbContainer()
439
+ const container = new Container()
434
440
  .withPort(4000)
435
441
  .withApiToken('secret');
436
442
  ```
package/dist/index.d.mts CHANGED
@@ -90,7 +90,7 @@ declare class Client {
90
90
  readEventTypes(signal?: AbortSignal): AsyncGenerator<EventType, void, void>;
91
91
  }
92
92
 
93
- declare class EventSourcingDbContainer {
93
+ declare class Container {
94
94
  #private;
95
95
  withImageTag(tag: string): this;
96
96
  withApiToken(token: string): this;
@@ -109,4 +109,4 @@ declare const isSubjectOnEventId: (subject: string, eventId: string) => Precondi
109
109
 
110
110
  declare const isSubjectPristine: (subject: string) => Precondition;
111
111
 
112
- export { Client, type Event, type EventCandidate, EventSourcingDbContainer, type EventType, type ObserveEventsOptions, type ReadEventsOptions, isSubjectOnEventId, isSubjectPristine };
112
+ export { Client, Container, type Event, type EventCandidate, type EventType, type ObserveEventsOptions, type ReadEventsOptions, isSubjectOnEventId, isSubjectPristine };
package/dist/index.d.ts CHANGED
@@ -90,7 +90,7 @@ declare class Client {
90
90
  readEventTypes(signal?: AbortSignal): AsyncGenerator<EventType, void, void>;
91
91
  }
92
92
 
93
- declare class EventSourcingDbContainer {
93
+ declare class Container {
94
94
  #private;
95
95
  withImageTag(tag: string): this;
96
96
  withApiToken(token: string): this;
@@ -109,4 +109,4 @@ declare const isSubjectOnEventId: (subject: string, eventId: string) => Precondi
109
109
 
110
110
  declare const isSubjectPristine: (subject: string) => Precondition;
111
111
 
112
- export { Client, type Event, type EventCandidate, EventSourcingDbContainer, type EventType, type ObserveEventsOptions, type ReadEventsOptions, isSubjectOnEventId, isSubjectPristine };
112
+ export { Client, Container, type Event, type EventCandidate, type EventType, type ObserveEventsOptions, type ReadEventsOptions, isSubjectOnEventId, isSubjectPristine };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var E=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var F=(r,t)=>{for(var e in t)E(r,e,{get:t[e],enumerable:!0})},L=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of x(t))!$.call(r,i)&&i!==e&&E(r,i,{get:()=>t[i],enumerable:!(n=k(t,i))||n.enumerable});return r};var R=r=>L(E({},"__esModule",{value:!0}),r);var M={};F(M,{Client:()=>v,EventSourcingDbContainer:()=>b,isSubjectOnEventId:()=>O,isSubjectPristine:()=>C});module.exports=R(M);var h=r=>({...r,time:new Date(r.time)});var u=(r,t)=>{if(typeof t!=typeof r)return!1;if(t===null||r===null)return t===null&&r===null;if(typeof t=="object"){if(Array.isArray(t)||Array.isArray(r))return!1;let e=t,n=r;for(let i of Object.keys(e))if(!(i in n)||!u(n[i],e[i]))return!1;return!0}return!0};var H={specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"},S=r=>u(r,H);var l=async function*(r,t){let e=r.getReader(),n=new TextDecoder("utf-8"),i="",p=()=>{e.cancel().catch(()=>{})};if(t.aborted){await e.cancel().catch(()=>{});return}t.addEventListener("abort",p);try{for(;!t.aborted;){let{done:c,value:d}=await e.read();if(c)break;i+=n.decode(d,{stream:!0});let a;for(;a=i.indexOf(`
2
- `),a!==-1;){let o=i.slice(0,a).trim();i=i.slice(a+1),o&&(yield JSON.parse(o))}}}finally{t.removeEventListener("abort",p),await e.cancel().catch(()=>{})}};var B={type:"event",payload:{specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"}},g=r=>!(!u(r,B)||r.type!=="event");var I={type:"error",payload:{error:"string"}},m=r=>!(!u(r,I)||r.type!=="error");var N={type:"eventType",payload:{eventType:"string",isPhantom:!0}},T=r=>!(!u(r,N)||r.type!=="eventType");var J={type:"heartbeat"},y=r=>!(!u(r,J)||r.type!=="heartbeat");var U={type:"row"},j=r=>!(!u(r,U)||r.type!=="row"||!("payload"in r));var z={type:"subject",payload:{subject:"string"}},A=r=>!(!u(r,z)||r.type!=="subject");var v=class{#o;#e;#t(t){return new URL(t,this.#o).toString()}constructor(t,e){this.#o=t,this.#e=e}async ping(){let t=this.#t("/api/v1/ping"),e=await fetch(t,{method:"get"});if(e.status!==200)throw new Error(`Failed to ping, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.ping-received")throw new Error("Failed to ping.")}async verifyApiToken(){let t=this.#t("/api/v1/verify-api-token"),e=await fetch(t,{method:"post",headers:{authorization:`Bearer ${this.#e}`}});if(e.status!==200)throw new Error(`Failed to verify API token, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.api-token-verified")throw new Error("Failed to verify API token.")}async writeEvents(t,e=[]){let n=this.#t("/api/v1/write-events"),i=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({events:t,preconditions:e})});if(i.status!==200)throw new Error(`Failed to write events, got HTTP status code '${i.status}', expected '200'.`);let p=await i.json();if(!Array.isArray(p))throw new Error("Failed to parse response.");return p.map(d=>{if(!S(d))throw new Error("Failed to parse response item.");return h(d)})}readEvents(t,e,n){let i=this.#t("/api/v1/read-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,o;if(n&&!n.aborted){let s=()=>c.abort();n.addEventListener("abort",s,{once:!0}),o=()=>n.removeEventListener("abort",s)}try{let s=await fetch(i,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(s.status!==200)throw new Error(`Failed to read events, got HTTP status code '${s.status}', expected '200'.`);if(!s.body)throw new Error("Failed to read events.");for await(let f of l(s.body,d))if(!y(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(g(f)){yield h(f.payload);continue}throw new Error("Failed to read events.")}}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return;throw s}finally{o&&o(),a&&c.abort()}}()}runEventQlQuery(t,e){let n=this.#t("/api/v1/run-eventql-query"),i=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let o=()=>p.abort();e.addEventListener("abort",o,{once:!0}),a=()=>e.removeEventListener("abort",o)}try{let o=await fetch(n,{method:"post",headers:{authorization:`Bearer ${i}`,"content-type":"application/json"},body:JSON.stringify({query:t}),signal:c});if(o.status!==200)throw new Error(`Failed to run EventQL query, got HTTP status code '${o.status}', expected '200'.`);if(!o.body)throw new Error("Failed to run EventQL query.");for await(let s of l(o.body,c))if(!y(s)){if(m(s))throw new Error(`${s.payload.error}.`);if(j(s)){yield s.payload;continue}throw new Error("Failed to run EventQL query.")}}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;throw o}finally{a&&a(),d&&p.abort()}}()}observeEvents(t,e,n){let i=this.#t("/api/v1/observe-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,o;if(n&&!n.aborted){let s=()=>c.abort();n.addEventListener("abort",s,{once:!0}),o=()=>n.removeEventListener("abort",s)}try{let s=await fetch(i,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(s.status!==200)throw new Error(`Failed to observe events, got HTTP status code '${s.status}', expected '200'.`);if(!s.body)throw new Error("Failed to observe events.");for await(let f of l(s.body,d))if(!y(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(g(f)){yield h(f.payload);continue}throw new Error("Failed to observe events.")}}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return;throw s}finally{o&&o(),a&&c.abort()}}()}async registerEventSchema(t,e){let n=this.#t("/api/v1/register-event-schema"),i=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({eventType:t,schema:e})});if(i.status!==200)throw new Error(`Failed to register event schema, got HTTP status code '${i.status}', expected '200'.`)}readSubjects(t,e){let n=this.#t("/api/v1/read-subjects"),i=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let o=()=>p.abort();e.addEventListener("abort",o,{once:!0}),a=()=>e.removeEventListener("abort",o)}try{let o=await fetch(n,{method:"post",headers:{authorization:`Bearer ${i}`,"content-type":"application/json"},body:JSON.stringify({baseSubject:t}),signal:c});if(o.status!==200)throw new Error(`Failed to read subjects, got HTTP status code '${o.status}', expected '200'.`);if(!o.body)throw new Error("Failed to read subjects.");for await(let s of l(o.body,c)){if(m(s))throw new Error(`${s.payload.error}.`);if(A(s)){yield s.payload.subject;continue}throw new Error("Failed to read subjects.")}}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;throw o}finally{a&&a(),d&&p.abort()}}()}readEventTypes(t){let e=this.#t("/api/v1/read-event-types"),n=this.#e;return async function*(){let i=new AbortController,p=t??i.signal,c=!t,d;if(t&&!t.aborted){let a=()=>i.abort();t.addEventListener("abort",a,{once:!0}),d=()=>t.removeEventListener("abort",a)}try{let a=await fetch(e,{method:"post",headers:{authorization:`Bearer ${n}`},signal:p});if(a.status!==200)throw new Error(`Failed to read event types, got HTTP status code '${a.status}', expected '200'.`);if(!a.body)throw new Error("Failed to read event types.");for await(let o of l(a.body,p))if(!y(o)){if(m(o))throw new Error(`${o.payload.error}.`);if(T(o)){yield o.payload;continue}throw new Error("Failed to read event types.")}}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;throw a}finally{d&&d(),c&&i.abort()}}()}};var w=require("testcontainers");var b=class{#o="thenativeweb/eventsourcingdb";#e="latest";#t=3e3;#n="secret";#r;withImageTag(t){return this.#e=t,this}withApiToken(t){return this.#n=t,this}withPort(t){return this.#t=t,this}async start(){this.#r=await new w.GenericContainer(`${this.#o}:${this.#e}`).withExposedPorts(this.#t).withCommand(["run","--api-token",this.#n,"--data-directory-temporary","--http-enabled","--https-enabled=false"]).withWaitStrategy(w.Wait.forHttp("/api/v1/ping",this.#t).withStartupTimeout(1e4)).start()}getHost(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getHost()}getMappedPort(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getMappedPort(this.#t)}getBaseUrl(){if(this.#r===void 0)throw new Error("Container must be running.");let t=this.getHost(),e=this.getMappedPort();return new URL(`http://${t}:${e}`)}getApiToken(){return this.#n}isRunning(){return this.#r!==void 0}async stop(){this.#r!==void 0&&(await this.#r.stop(),this.#r=void 0)}getClient(){return new v(this.getBaseUrl(),this.getApiToken())}};var O=(r,t)=>({type:"isSubjectOnEventId",payload:{subject:r,eventId:t}});var C=r=>({type:"isSubjectPristine",payload:{subject:r}});0&&(module.exports={Client,EventSourcingDbContainer,isSubjectOnEventId,isSubjectPristine});
1
+ "use strict";var E=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var F=(r,t)=>{for(var e in t)E(r,e,{get:t[e],enumerable:!0})},L=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of x(t))!$.call(r,i)&&i!==e&&E(r,i,{get:()=>t[i],enumerable:!(n=k(t,i))||n.enumerable});return r};var R=r=>L(E({},"__esModule",{value:!0}),r);var M={};F(M,{Client:()=>v,Container:()=>b,isSubjectOnEventId:()=>O,isSubjectPristine:()=>C});module.exports=R(M);var h=r=>({...r,time:new Date(r.time)});var u=(r,t)=>{if(typeof t!=typeof r)return!1;if(t===null||r===null)return t===null&&r===null;if(typeof t=="object"){if(Array.isArray(t)||Array.isArray(r))return!1;let e=t,n=r;for(let i of Object.keys(e))if(!(i in n)||!u(n[i],e[i]))return!1;return!0}return!0};var H={specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"},S=r=>u(r,H);var l=async function*(r,t){let e=r.getReader(),n=new TextDecoder("utf-8"),i="",p=()=>{e.cancel().catch(()=>{})};if(t.aborted){await e.cancel().catch(()=>{});return}t.addEventListener("abort",p);try{for(;!t.aborted;){let{done:c,value:d}=await e.read();if(c)break;i+=n.decode(d,{stream:!0});let a;for(;a=i.indexOf(`
2
+ `),a!==-1;){let o=i.slice(0,a).trim();i=i.slice(a+1),o&&(yield JSON.parse(o))}}}finally{t.removeEventListener("abort",p),await e.cancel().catch(()=>{})}};var B={type:"event",payload:{specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"}},g=r=>!(!u(r,B)||r.type!=="event");var I={type:"error",payload:{error:"string"}},m=r=>!(!u(r,I)||r.type!=="error");var N={type:"eventType",payload:{eventType:"string",isPhantom:!0}},T=r=>!(!u(r,N)||r.type!=="eventType");var J={type:"heartbeat"},y=r=>!(!u(r,J)||r.type!=="heartbeat");var U={type:"row"},j=r=>!(!u(r,U)||r.type!=="row"||!("payload"in r));var z={type:"subject",payload:{subject:"string"}},A=r=>!(!u(r,z)||r.type!=="subject");var v=class{#o;#e;#t(t){return new URL(t,this.#o).toString()}constructor(t,e){this.#o=t,this.#e=e}async ping(){let t=this.#t("/api/v1/ping"),e=await fetch(t,{method:"get"});if(e.status!==200)throw new Error(`Failed to ping, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.ping-received")throw new Error("Failed to ping.")}async verifyApiToken(){let t=this.#t("/api/v1/verify-api-token"),e=await fetch(t,{method:"post",headers:{authorization:`Bearer ${this.#e}`}});if(e.status!==200)throw new Error(`Failed to verify API token, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.api-token-verified")throw new Error("Failed to verify API token.")}async writeEvents(t,e=[]){let n=this.#t("/api/v1/write-events"),i=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({events:t,preconditions:e})});if(i.status!==200)throw new Error(`Failed to write events, got HTTP status code '${i.status}', expected '200'.`);let p=await i.json();if(!Array.isArray(p))throw new Error("Failed to parse response.");return p.map(d=>{if(!S(d))throw new Error("Failed to parse response item.");return h(d)})}readEvents(t,e,n){let i=this.#t("/api/v1/read-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,o;if(n&&!n.aborted){let s=()=>c.abort();n.addEventListener("abort",s,{once:!0}),o=()=>n.removeEventListener("abort",s)}try{let s=await fetch(i,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(s.status!==200)throw new Error(`Failed to read events, got HTTP status code '${s.status}', expected '200'.`);if(!s.body)throw new Error("Failed to read events.");for await(let f of l(s.body,d))if(!y(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(g(f)){yield h(f.payload);continue}throw new Error("Failed to read events.")}}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return;throw s}finally{o&&o(),a&&c.abort()}}()}runEventQlQuery(t,e){let n=this.#t("/api/v1/run-eventql-query"),i=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let o=()=>p.abort();e.addEventListener("abort",o,{once:!0}),a=()=>e.removeEventListener("abort",o)}try{let o=await fetch(n,{method:"post",headers:{authorization:`Bearer ${i}`,"content-type":"application/json"},body:JSON.stringify({query:t}),signal:c});if(o.status!==200)throw new Error(`Failed to run EventQL query, got HTTP status code '${o.status}', expected '200'.`);if(!o.body)throw new Error("Failed to run EventQL query.");for await(let s of l(o.body,c))if(!y(s)){if(m(s))throw new Error(`${s.payload.error}.`);if(j(s)){yield s.payload;continue}throw new Error("Failed to run EventQL query.")}}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;throw o}finally{a&&a(),d&&p.abort()}}()}observeEvents(t,e,n){let i=this.#t("/api/v1/observe-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,o;if(n&&!n.aborted){let s=()=>c.abort();n.addEventListener("abort",s,{once:!0}),o=()=>n.removeEventListener("abort",s)}try{let s=await fetch(i,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(s.status!==200)throw new Error(`Failed to observe events, got HTTP status code '${s.status}', expected '200'.`);if(!s.body)throw new Error("Failed to observe events.");for await(let f of l(s.body,d))if(!y(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(g(f)){yield h(f.payload);continue}throw new Error("Failed to observe events.")}}catch(s){if(s instanceof DOMException&&s.name==="AbortError")return;throw s}finally{o&&o(),a&&c.abort()}}()}async registerEventSchema(t,e){let n=this.#t("/api/v1/register-event-schema"),i=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({eventType:t,schema:e})});if(i.status!==200)throw new Error(`Failed to register event schema, got HTTP status code '${i.status}', expected '200'.`)}readSubjects(t,e){let n=this.#t("/api/v1/read-subjects"),i=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let o=()=>p.abort();e.addEventListener("abort",o,{once:!0}),a=()=>e.removeEventListener("abort",o)}try{let o=await fetch(n,{method:"post",headers:{authorization:`Bearer ${i}`,"content-type":"application/json"},body:JSON.stringify({baseSubject:t}),signal:c});if(o.status!==200)throw new Error(`Failed to read subjects, got HTTP status code '${o.status}', expected '200'.`);if(!o.body)throw new Error("Failed to read subjects.");for await(let s of l(o.body,c)){if(m(s))throw new Error(`${s.payload.error}.`);if(A(s)){yield s.payload.subject;continue}throw new Error("Failed to read subjects.")}}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;throw o}finally{a&&a(),d&&p.abort()}}()}readEventTypes(t){let e=this.#t("/api/v1/read-event-types"),n=this.#e;return async function*(){let i=new AbortController,p=t??i.signal,c=!t,d;if(t&&!t.aborted){let a=()=>i.abort();t.addEventListener("abort",a,{once:!0}),d=()=>t.removeEventListener("abort",a)}try{let a=await fetch(e,{method:"post",headers:{authorization:`Bearer ${n}`},signal:p});if(a.status!==200)throw new Error(`Failed to read event types, got HTTP status code '${a.status}', expected '200'.`);if(!a.body)throw new Error("Failed to read event types.");for await(let o of l(a.body,p))if(!y(o)){if(m(o))throw new Error(`${o.payload.error}.`);if(T(o)){yield o.payload;continue}throw new Error("Failed to read event types.")}}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;throw a}finally{d&&d(),c&&i.abort()}}()}};var w=require("testcontainers");var b=class{#o="thenativeweb/eventsourcingdb";#e="latest";#t=3e3;#n="secret";#r;withImageTag(t){return this.#e=t,this}withApiToken(t){return this.#n=t,this}withPort(t){return this.#t=t,this}async start(){this.#r=await new w.GenericContainer(`${this.#o}:${this.#e}`).withExposedPorts(this.#t).withCommand(["run","--api-token",this.#n,"--data-directory-temporary","--http-enabled","--https-enabled=false"]).withWaitStrategy(w.Wait.forHttp("/api/v1/ping",this.#t).withStartupTimeout(1e4)).start()}getHost(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getHost()}getMappedPort(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getMappedPort(this.#t)}getBaseUrl(){if(this.#r===void 0)throw new Error("Container must be running.");let t=this.getHost(),e=this.getMappedPort();return new URL(`http://${t}:${e}`)}getApiToken(){return this.#n}isRunning(){return this.#r!==void 0}async stop(){this.#r!==void 0&&(await this.#r.stop(),this.#r=void 0)}getClient(){return new v(this.getBaseUrl(),this.getApiToken())}};var O=(r,t)=>({type:"isSubjectOnEventId",payload:{subject:r,eventId:t}});var C=r=>({type:"isSubjectPristine",payload:{subject:r}});0&&(module.exports={Client,Container,isSubjectOnEventId,isSubjectPristine});
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
1
  var h=o=>({...o,time:new Date(o.time)});var u=(o,t)=>{if(typeof t!=typeof o)return!1;if(t===null||o===null)return t===null&&o===null;if(typeof t=="object"){if(Array.isArray(t)||Array.isArray(o))return!1;let e=t,n=o;for(let s of Object.keys(e))if(!(s in n)||!u(n[s],e[s]))return!1;return!0}return!0};var A={specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"},E=o=>u(o,A);var l=async function*(o,t){let e=o.getReader(),n=new TextDecoder("utf-8"),s="",p=()=>{e.cancel().catch(()=>{})};if(t.aborted){await e.cancel().catch(()=>{});return}t.addEventListener("abort",p);try{for(;!t.aborted;){let{done:c,value:d}=await e.read();if(c)break;s+=n.decode(d,{stream:!0});let a;for(;a=s.indexOf(`
2
- `),a!==-1;){let r=s.slice(0,a).trim();s=s.slice(a+1),r&&(yield JSON.parse(r))}}}finally{t.removeEventListener("abort",p),await e.cancel().catch(()=>{})}};var O={type:"event",payload:{specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"}},b=o=>!(!u(o,O)||o.type!=="event");var C={type:"error",payload:{error:"string"}},m=o=>!(!u(o,C)||o.type!=="error");var P={type:"eventType",payload:{eventType:"string",isPhantom:!0}},g=o=>!(!u(o,P)||o.type!=="eventType");var k={type:"heartbeat"},v=o=>!(!u(o,k)||o.type!=="heartbeat");var x={type:"row"},S=o=>!(!u(o,x)||o.type!=="row"||!("payload"in o));var $={type:"subject",payload:{subject:"string"}},T=o=>!(!u(o,$)||o.type!=="subject");var y=class{#o;#e;#t(t){return new URL(t,this.#o).toString()}constructor(t,e){this.#o=t,this.#e=e}async ping(){let t=this.#t("/api/v1/ping"),e=await fetch(t,{method:"get"});if(e.status!==200)throw new Error(`Failed to ping, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.ping-received")throw new Error("Failed to ping.")}async verifyApiToken(){let t=this.#t("/api/v1/verify-api-token"),e=await fetch(t,{method:"post",headers:{authorization:`Bearer ${this.#e}`}});if(e.status!==200)throw new Error(`Failed to verify API token, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.api-token-verified")throw new Error("Failed to verify API token.")}async writeEvents(t,e=[]){let n=this.#t("/api/v1/write-events"),s=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({events:t,preconditions:e})});if(s.status!==200)throw new Error(`Failed to write events, got HTTP status code '${s.status}', expected '200'.`);let p=await s.json();if(!Array.isArray(p))throw new Error("Failed to parse response.");return p.map(d=>{if(!E(d))throw new Error("Failed to parse response item.");return h(d)})}readEvents(t,e,n){let s=this.#t("/api/v1/read-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,r;if(n&&!n.aborted){let i=()=>c.abort();n.addEventListener("abort",i,{once:!0}),r=()=>n.removeEventListener("abort",i)}try{let i=await fetch(s,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(i.status!==200)throw new Error(`Failed to read events, got HTTP status code '${i.status}', expected '200'.`);if(!i.body)throw new Error("Failed to read events.");for await(let f of l(i.body,d))if(!v(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(b(f)){yield h(f.payload);continue}throw new Error("Failed to read events.")}}catch(i){if(i instanceof DOMException&&i.name==="AbortError")return;throw i}finally{r&&r(),a&&c.abort()}}()}runEventQlQuery(t,e){let n=this.#t("/api/v1/run-eventql-query"),s=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let r=()=>p.abort();e.addEventListener("abort",r,{once:!0}),a=()=>e.removeEventListener("abort",r)}try{let r=await fetch(n,{method:"post",headers:{authorization:`Bearer ${s}`,"content-type":"application/json"},body:JSON.stringify({query:t}),signal:c});if(r.status!==200)throw new Error(`Failed to run EventQL query, got HTTP status code '${r.status}', expected '200'.`);if(!r.body)throw new Error("Failed to run EventQL query.");for await(let i of l(r.body,c))if(!v(i)){if(m(i))throw new Error(`${i.payload.error}.`);if(S(i)){yield i.payload;continue}throw new Error("Failed to run EventQL query.")}}catch(r){if(r instanceof DOMException&&r.name==="AbortError")return;throw r}finally{a&&a(),d&&p.abort()}}()}observeEvents(t,e,n){let s=this.#t("/api/v1/observe-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,r;if(n&&!n.aborted){let i=()=>c.abort();n.addEventListener("abort",i,{once:!0}),r=()=>n.removeEventListener("abort",i)}try{let i=await fetch(s,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(i.status!==200)throw new Error(`Failed to observe events, got HTTP status code '${i.status}', expected '200'.`);if(!i.body)throw new Error("Failed to observe events.");for await(let f of l(i.body,d))if(!v(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(b(f)){yield h(f.payload);continue}throw new Error("Failed to observe events.")}}catch(i){if(i instanceof DOMException&&i.name==="AbortError")return;throw i}finally{r&&r(),a&&c.abort()}}()}async registerEventSchema(t,e){let n=this.#t("/api/v1/register-event-schema"),s=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({eventType:t,schema:e})});if(s.status!==200)throw new Error(`Failed to register event schema, got HTTP status code '${s.status}', expected '200'.`)}readSubjects(t,e){let n=this.#t("/api/v1/read-subjects"),s=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let r=()=>p.abort();e.addEventListener("abort",r,{once:!0}),a=()=>e.removeEventListener("abort",r)}try{let r=await fetch(n,{method:"post",headers:{authorization:`Bearer ${s}`,"content-type":"application/json"},body:JSON.stringify({baseSubject:t}),signal:c});if(r.status!==200)throw new Error(`Failed to read subjects, got HTTP status code '${r.status}', expected '200'.`);if(!r.body)throw new Error("Failed to read subjects.");for await(let i of l(r.body,c)){if(m(i))throw new Error(`${i.payload.error}.`);if(T(i)){yield i.payload.subject;continue}throw new Error("Failed to read subjects.")}}catch(r){if(r instanceof DOMException&&r.name==="AbortError")return;throw r}finally{a&&a(),d&&p.abort()}}()}readEventTypes(t){let e=this.#t("/api/v1/read-event-types"),n=this.#e;return async function*(){let s=new AbortController,p=t??s.signal,c=!t,d;if(t&&!t.aborted){let a=()=>s.abort();t.addEventListener("abort",a,{once:!0}),d=()=>t.removeEventListener("abort",a)}try{let a=await fetch(e,{method:"post",headers:{authorization:`Bearer ${n}`},signal:p});if(a.status!==200)throw new Error(`Failed to read event types, got HTTP status code '${a.status}', expected '200'.`);if(!a.body)throw new Error("Failed to read event types.");for await(let r of l(a.body,p))if(!v(r)){if(m(r))throw new Error(`${r.payload.error}.`);if(g(r)){yield r.payload;continue}throw new Error("Failed to read event types.")}}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;throw a}finally{d&&d(),c&&s.abort()}}()}};import{GenericContainer as F,Wait as L}from"testcontainers";var w=class{#o="thenativeweb/eventsourcingdb";#e="latest";#t=3e3;#n="secret";#r;withImageTag(t){return this.#e=t,this}withApiToken(t){return this.#n=t,this}withPort(t){return this.#t=t,this}async start(){this.#r=await new F(`${this.#o}:${this.#e}`).withExposedPorts(this.#t).withCommand(["run","--api-token",this.#n,"--data-directory-temporary","--http-enabled","--https-enabled=false"]).withWaitStrategy(L.forHttp("/api/v1/ping",this.#t).withStartupTimeout(1e4)).start()}getHost(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getHost()}getMappedPort(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getMappedPort(this.#t)}getBaseUrl(){if(this.#r===void 0)throw new Error("Container must be running.");let t=this.getHost(),e=this.getMappedPort();return new URL(`http://${t}:${e}`)}getApiToken(){return this.#n}isRunning(){return this.#r!==void 0}async stop(){this.#r!==void 0&&(await this.#r.stop(),this.#r=void 0)}getClient(){return new y(this.getBaseUrl(),this.getApiToken())}};var R=(o,t)=>({type:"isSubjectOnEventId",payload:{subject:o,eventId:t}});var H=o=>({type:"isSubjectPristine",payload:{subject:o}});export{y as Client,w as EventSourcingDbContainer,R as isSubjectOnEventId,H as isSubjectPristine};
2
+ `),a!==-1;){let r=s.slice(0,a).trim();s=s.slice(a+1),r&&(yield JSON.parse(r))}}}finally{t.removeEventListener("abort",p),await e.cancel().catch(()=>{})}};var O={type:"event",payload:{specversion:"string",id:"string",time:"string",source:"string",subject:"string",type:"string",datacontenttype:"string",data:{},hash:"string",predecessorhash:"string"}},b=o=>!(!u(o,O)||o.type!=="event");var C={type:"error",payload:{error:"string"}},m=o=>!(!u(o,C)||o.type!=="error");var P={type:"eventType",payload:{eventType:"string",isPhantom:!0}},g=o=>!(!u(o,P)||o.type!=="eventType");var k={type:"heartbeat"},v=o=>!(!u(o,k)||o.type!=="heartbeat");var x={type:"row"},S=o=>!(!u(o,x)||o.type!=="row"||!("payload"in o));var $={type:"subject",payload:{subject:"string"}},T=o=>!(!u(o,$)||o.type!=="subject");var y=class{#o;#e;#t(t){return new URL(t,this.#o).toString()}constructor(t,e){this.#o=t,this.#e=e}async ping(){let t=this.#t("/api/v1/ping"),e=await fetch(t,{method:"get"});if(e.status!==200)throw new Error(`Failed to ping, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.ping-received")throw new Error("Failed to ping.")}async verifyApiToken(){let t=this.#t("/api/v1/verify-api-token"),e=await fetch(t,{method:"post",headers:{authorization:`Bearer ${this.#e}`}});if(e.status!==200)throw new Error(`Failed to verify API token, got HTTP status code '${e.status}', expected '200'.`);let n=await e.json();if(!u(n,{type:"string"}))throw new Error("Failed to parse response.");if(n.type!=="io.eventsourcingdb.api.api-token-verified")throw new Error("Failed to verify API token.")}async writeEvents(t,e=[]){let n=this.#t("/api/v1/write-events"),s=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({events:t,preconditions:e})});if(s.status!==200)throw new Error(`Failed to write events, got HTTP status code '${s.status}', expected '200'.`);let p=await s.json();if(!Array.isArray(p))throw new Error("Failed to parse response.");return p.map(d=>{if(!E(d))throw new Error("Failed to parse response item.");return h(d)})}readEvents(t,e,n){let s=this.#t("/api/v1/read-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,r;if(n&&!n.aborted){let i=()=>c.abort();n.addEventListener("abort",i,{once:!0}),r=()=>n.removeEventListener("abort",i)}try{let i=await fetch(s,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(i.status!==200)throw new Error(`Failed to read events, got HTTP status code '${i.status}', expected '200'.`);if(!i.body)throw new Error("Failed to read events.");for await(let f of l(i.body,d))if(!v(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(b(f)){yield h(f.payload);continue}throw new Error("Failed to read events.")}}catch(i){if(i instanceof DOMException&&i.name==="AbortError")return;throw i}finally{r&&r(),a&&c.abort()}}()}runEventQlQuery(t,e){let n=this.#t("/api/v1/run-eventql-query"),s=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let r=()=>p.abort();e.addEventListener("abort",r,{once:!0}),a=()=>e.removeEventListener("abort",r)}try{let r=await fetch(n,{method:"post",headers:{authorization:`Bearer ${s}`,"content-type":"application/json"},body:JSON.stringify({query:t}),signal:c});if(r.status!==200)throw new Error(`Failed to run EventQL query, got HTTP status code '${r.status}', expected '200'.`);if(!r.body)throw new Error("Failed to run EventQL query.");for await(let i of l(r.body,c))if(!v(i)){if(m(i))throw new Error(`${i.payload.error}.`);if(S(i)){yield i.payload;continue}throw new Error("Failed to run EventQL query.")}}catch(r){if(r instanceof DOMException&&r.name==="AbortError")return;throw r}finally{a&&a(),d&&p.abort()}}()}observeEvents(t,e,n){let s=this.#t("/api/v1/observe-events"),p=this.#e;return async function*(){let c=new AbortController,d=n??c.signal,a=!n,r;if(n&&!n.aborted){let i=()=>c.abort();n.addEventListener("abort",i,{once:!0}),r=()=>n.removeEventListener("abort",i)}try{let i=await fetch(s,{method:"post",headers:{authorization:`Bearer ${p}`,"content-type":"application/json"},body:JSON.stringify({subject:t,options:e}),signal:d});if(i.status!==200)throw new Error(`Failed to observe events, got HTTP status code '${i.status}', expected '200'.`);if(!i.body)throw new Error("Failed to observe events.");for await(let f of l(i.body,d))if(!v(f)){if(m(f))throw new Error(`${f.payload.error}.`);if(b(f)){yield h(f.payload);continue}throw new Error("Failed to observe events.")}}catch(i){if(i instanceof DOMException&&i.name==="AbortError")return;throw i}finally{r&&r(),a&&c.abort()}}()}async registerEventSchema(t,e){let n=this.#t("/api/v1/register-event-schema"),s=await fetch(n,{method:"post",headers:{authorization:`Bearer ${this.#e}`,"content-type":"application/json"},body:JSON.stringify({eventType:t,schema:e})});if(s.status!==200)throw new Error(`Failed to register event schema, got HTTP status code '${s.status}', expected '200'.`)}readSubjects(t,e){let n=this.#t("/api/v1/read-subjects"),s=this.#e;return async function*(){let p=new AbortController,c=e??p.signal,d=!e,a;if(e&&!e.aborted){let r=()=>p.abort();e.addEventListener("abort",r,{once:!0}),a=()=>e.removeEventListener("abort",r)}try{let r=await fetch(n,{method:"post",headers:{authorization:`Bearer ${s}`,"content-type":"application/json"},body:JSON.stringify({baseSubject:t}),signal:c});if(r.status!==200)throw new Error(`Failed to read subjects, got HTTP status code '${r.status}', expected '200'.`);if(!r.body)throw new Error("Failed to read subjects.");for await(let i of l(r.body,c)){if(m(i))throw new Error(`${i.payload.error}.`);if(T(i)){yield i.payload.subject;continue}throw new Error("Failed to read subjects.")}}catch(r){if(r instanceof DOMException&&r.name==="AbortError")return;throw r}finally{a&&a(),d&&p.abort()}}()}readEventTypes(t){let e=this.#t("/api/v1/read-event-types"),n=this.#e;return async function*(){let s=new AbortController,p=t??s.signal,c=!t,d;if(t&&!t.aborted){let a=()=>s.abort();t.addEventListener("abort",a,{once:!0}),d=()=>t.removeEventListener("abort",a)}try{let a=await fetch(e,{method:"post",headers:{authorization:`Bearer ${n}`},signal:p});if(a.status!==200)throw new Error(`Failed to read event types, got HTTP status code '${a.status}', expected '200'.`);if(!a.body)throw new Error("Failed to read event types.");for await(let r of l(a.body,p))if(!v(r)){if(m(r))throw new Error(`${r.payload.error}.`);if(g(r)){yield r.payload;continue}throw new Error("Failed to read event types.")}}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;throw a}finally{d&&d(),c&&s.abort()}}()}};import{GenericContainer as F,Wait as L}from"testcontainers";var w=class{#o="thenativeweb/eventsourcingdb";#e="latest";#t=3e3;#n="secret";#r;withImageTag(t){return this.#e=t,this}withApiToken(t){return this.#n=t,this}withPort(t){return this.#t=t,this}async start(){this.#r=await new F(`${this.#o}:${this.#e}`).withExposedPorts(this.#t).withCommand(["run","--api-token",this.#n,"--data-directory-temporary","--http-enabled","--https-enabled=false"]).withWaitStrategy(L.forHttp("/api/v1/ping",this.#t).withStartupTimeout(1e4)).start()}getHost(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getHost()}getMappedPort(){if(this.#r===void 0)throw new Error("Container must be running.");return this.#r.getMappedPort(this.#t)}getBaseUrl(){if(this.#r===void 0)throw new Error("Container must be running.");let t=this.getHost(),e=this.getMappedPort();return new URL(`http://${t}:${e}`)}getApiToken(){return this.#n}isRunning(){return this.#r!==void 0}async stop(){this.#r!==void 0&&(await this.#r.stop(),this.#r=void 0)}getClient(){return new y(this.getBaseUrl(),this.getApiToken())}};var R=(o,t)=>({type:"isSubjectOnEventId",payload:{subject:o,eventId:t}});var H=o=>({type:"isSubjectPristine",payload:{subject:o}});export{y as Client,w as Container,R as isSubjectOnEventId,H as isSubjectPristine};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eventsourcingdb",
3
- "version": "0.12.7",
3
+ "version": "0.12.9",
4
4
  "description": "The official JavaScript client SDK for EventSourcingDB.",
5
5
  "author": {
6
6
  "name": "the native web GmbH",
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "@biomejs/biome": "1.9.4",
21
- "@types/node": "22.14.1",
21
+ "@types/node": "22.15.2",
22
22
  "get-port": "7.1.0",
23
23
  "tsup": "8.4.0",
24
24
  "tsx": "4.19.3",