@kubun/client 0.6.0 → 0.6.1

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/lib/client.d.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import { Client, type RequestCall, type StreamCall } from '@enkaku/client';
2
2
  import type { Identity, SigningIdentity } from '@enkaku/token';
3
3
  import { type Logger } from '@kubun/logger';
4
- import type { ClientTransport, DeployGraphParams, DeployGraphResult, ExecuteGraphParams, ExecuteGraphResult, ListGraphResult, LoadGraphParams, LoadGraphResult, Protocol } from '@kubun/protocol';
4
+ import type { BeginTransactionParams, BeginTransactionResult, ClientTransport, DeployGraphParams, DeployGraphResult, ExecuteGraphParams, ExecuteGraphResult, ListGraphResult, LoadGraphParams, LoadGraphResult, Protocol, TransactionParams, TransactionResult } from '@kubun/protocol';
5
5
  import { type GetRandomValues } from './graphql.js';
6
6
  export type MutateGraphParams = ExecuteGraphParams & {
7
7
  attachments?: Record<string, string>;
8
+ transactionID?: string;
8
9
  };
9
10
  export type KubunClientType = {
10
11
  deployGraph: (params: DeployGraphParams) => RequestCall<DeployGraphResult>;
@@ -13,6 +14,9 @@ export type KubunClientType = {
13
14
  queryGraph: <Data extends Record<string, unknown> = Record<string, unknown>>(params: ExecuteGraphParams, signal?: AbortSignal) => RequestCall<ExecuteGraphResult<Data>>;
14
15
  subscribeToGraph<Data extends Record<string, unknown> = Record<string, unknown>>(params: ExecuteGraphParams, signal?: AbortSignal): StreamCall<ExecuteGraphResult<Data>, ExecuteGraphResult<Data>>;
15
16
  mutateGraph: <Data extends Record<string, unknown> = Record<string, unknown>>(params: MutateGraphParams, signal?: AbortSignal) => RequestCall<ExecuteGraphResult<Data>>;
17
+ beginTransaction: (params: BeginTransactionParams) => RequestCall<BeginTransactionResult>;
18
+ commitTransaction: (params: TransactionParams) => RequestCall<TransactionResult>;
19
+ rollbackTransaction: (params: TransactionParams) => RequestCall<TransactionResult>;
16
20
  };
17
21
  export type ReadClientParams = {
18
22
  getRandomID?: () => string;
@@ -38,6 +42,9 @@ export declare class KubunReadClient {
38
42
  export declare class KubunLightClient extends KubunReadClient implements KubunClientType {
39
43
  deployGraph(param: DeployGraphParams, signal?: AbortSignal): RequestCall<DeployGraphResult>;
40
44
  mutateGraph<Data extends Record<string, unknown> = Record<string, unknown>>(param: MutateGraphParams, signal?: AbortSignal): RequestCall<ExecuteGraphResult<Data>>;
45
+ beginTransaction(param: BeginTransactionParams): RequestCall<BeginTransactionResult>;
46
+ commitTransaction(param: TransactionParams): RequestCall<TransactionResult>;
47
+ rollbackTransaction(param: TransactionParams): RequestCall<TransactionResult>;
41
48
  }
42
49
  export declare class KubunClient extends KubunReadClient implements KubunClientType {
43
50
  #private;
@@ -45,4 +52,7 @@ export declare class KubunClient extends KubunReadClient implements KubunClientT
45
52
  deployGraph(param: DeployGraphParams, signal?: AbortSignal): RequestCall<DeployGraphResult>;
46
53
  loadGraph(param: LoadGraphParams, signal?: AbortSignal): RequestCall<LoadGraphResult>;
47
54
  mutateGraph<Data extends Record<string, unknown> = Record<string, unknown>>(param: MutateGraphParams, signal?: AbortSignal): RequestCall<ExecuteGraphResult<Data>>;
55
+ beginTransaction(param: BeginTransactionParams): RequestCall<BeginTransactionResult>;
56
+ commitTransaction(param: TransactionParams): RequestCall<TransactionResult>;
57
+ rollbackTransaction(param: TransactionParams): RequestCall<TransactionResult>;
48
58
  }
package/lib/client.js CHANGED
@@ -1 +1 @@
1
- import{Client as t}from"@enkaku/client";import{getKubunLogger as e}from"@kubun/logger";import{HLC as r}from"@kubun/mutation";import{GraphQLExecutionError as a,MutationsRunner as n}from"./graphql.js";export class KubunReadClient{#t;constructor(r){let a=r.getRandomID??(()=>globalThis.crypto.randomUUID()),n=r.logger??e("client",{clientID:a()});this.#t=new t({...r,logger:n})}get client(){return this.#t}listGraphs(t){return this.#t.request("graph/list",{signal:t})}loadGraph(t,e){return this.#t.request("graph/load",{param:t,signal:e})}queryGraph(t,e){return this.#t.request("graph/query",{param:t,signal:e})}subscribeToGraph(t,e){return this.#t.createStream("graph/subscribe",{param:t,signal:e})}}export class KubunLightClient extends KubunReadClient{deployGraph(t,e){return this.client.request("graph/deploy",{param:t,signal:e})}mutateGraph(t,e){return this.client.request("graph/mutate",{param:{...t,mutations:null},signal:e})}}export class KubunClient extends KubunReadClient{#e;#r;#a;#n;constructor(t){super(t),this.#e=t.getRandomID??(()=>globalThis.crypto.randomUUID()),this.#r=t.getRandomValues??(t=>globalThis.crypto.getRandomValues(t)),this.#a=Promise.resolve(t.identity),this.#n=new n}deployGraph(t,e){let r=this.client.request("graph/deploy",{param:t,signal:e});return Object.assign(r.then(t=>(this.#n.setSchema(t.id,t),t)),{abort:r.abort,id:r.id,procedure:r.procedure,type:r.type,signal:r.signal})}loadGraph(t,e){let r=super.loadGraph(t,e);return Object.assign(r.then(e=>(this.#n.setSchema(t.id,e),e)),{abort:r.abort,id:r.id,procedure:r.procedure,type:r.type,signal:r.signal})}async #i(t,e,n){let{id:i,...s}=e;if(this.#n.hasSchema(i)||await this.loadGraph({id:i},n),n.aborted)throw n.reason??new DOMException("The operation was aborted.","AbortError");let o=await this.#a,u={getRandomValues:this.#r,hlc:new r({nodeID:o.id}),identity:o,mutations:{}},{errors:l}=await this.#n.execute({context:u,schemaID:i,source:e.text,variables:e.variables});if(null!=l&&0!==l.length)throw new a(l);return await this.client.request("graph/mutate",{id:t,param:{id:i,mutations:u.mutations,...s},signal:n})}mutateGraph(t,e){let r=this.#e(),a=new AbortController,n=e?AbortSignal.any([a.signal,e]):a.signal;return Object.assign(this.#i(r,t,n),{id:r,abort:()=>a.abort(),signal:n})}}
1
+ import{Client as t}from"@enkaku/client";import{getKubunLogger as e}from"@kubun/logger";import{HLC as r}from"@kubun/mutation";import{GraphQLExecutionError as a,MutationsRunner as n}from"./graphql.js";export class KubunReadClient{#t;constructor(r){let a=r.getRandomID??(()=>globalThis.crypto.randomUUID()),n=r.logger??e("client",{clientID:a()});this.#t=new t({...r,logger:n})}get client(){return this.#t}listGraphs(t){return this.#t.request("graph/list",{signal:t})}loadGraph(t,e){return this.#t.request("graph/load",{param:t,signal:e})}queryGraph(t,e){return this.#t.request("graph/query",{param:t,signal:e})}subscribeToGraph(t,e){return this.#t.createStream("graph/subscribe",{param:t,signal:e})}}export class KubunLightClient extends KubunReadClient{deployGraph(t,e){return this.client.request("graph/deploy",{param:t,signal:e})}mutateGraph(t,e){return this.client.request("graph/mutate",{param:{...t,mutations:null},signal:e})}beginTransaction(t){return this.client.request("graph/beginTransaction",{param:t})}commitTransaction(t){return this.client.request("graph/commitTransaction",{param:t})}rollbackTransaction(t){return this.client.request("graph/rollbackTransaction",{param:t})}}export class KubunClient extends KubunReadClient{#e;#r;#a;#n;constructor(t){super(t),this.#e=t.getRandomID??(()=>globalThis.crypto.randomUUID()),this.#r=t.getRandomValues??(t=>globalThis.crypto.getRandomValues(t)),this.#a=Promise.resolve(t.identity),this.#n=new n}deployGraph(t,e){let r=this.client.request("graph/deploy",{param:t,signal:e});return Object.assign(r.then(t=>(this.#n.setSchema(t.id,t),t)),{abort:r.abort,id:r.id,procedure:r.procedure,type:r.type,signal:r.signal})}loadGraph(t,e){let r=super.loadGraph(t,e);return Object.assign(r.then(e=>(this.#n.setSchema(t.id,e),e)),{abort:r.abort,id:r.id,procedure:r.procedure,type:r.type,signal:r.signal})}async #i(t,e,n){let{id:i,...s}=e;if(this.#n.hasSchema(i)||await this.loadGraph({id:i},n),n.aborted)throw n.reason??new DOMException("The operation was aborted.","AbortError");let o=await this.#a,u={getRandomValues:this.#r,hlc:new r({nodeID:o.id}),identity:o,mutations:{}},{errors:l}=await this.#n.execute({context:u,schemaID:i,source:e.text,variables:e.variables});if(null!=l&&0!==l.length)throw new a(l);return await this.client.request("graph/mutate",{id:t,param:{id:i,mutations:u.mutations,...s},signal:n})}mutateGraph(t,e){let r=this.#e(),a=new AbortController,n=e?AbortSignal.any([a.signal,e]):a.signal;return Object.assign(this.#i(r,t,n),{id:r,abort:()=>a.abort(),signal:n})}beginTransaction(t){return this.client.request("graph/beginTransaction",{param:t})}commitTransaction(t){return this.client.request("graph/commitTransaction",{param:t})}rollbackTransaction(t){return this.client.request("graph/rollbackTransaction",{param:t})}}
package/lib/graphql.js CHANGED
@@ -1 +1 @@
1
- import{stringifyToken as e}from"@enkaku/token";import{createSchema as t}from"@kubun/graphql";import{convertPatchInput as a,createMutationOperations as s}from"@kubun/mutation";import{graphql as r}from"graphql";import{signChangeMutation as n,signSetMutation as o}from"./mutations.js";export class GraphQLExecutionError extends Error{#e;constructor(e,t="GraphQL execution failed"){super(t),this.name=GraphQLExecutionError.name,this.#e=e}get errors(){return this.#e}}export function createContext(t){let r=s({issuer:t.identity.id,hlc:t.hlc,getRandomValues:t.getRandomValues,processSetMutation:async a=>e(await o({identity:t.identity,mutation:a})),processChangeMutation:async a=>e(await n({identity:t.identity,mutation:a}))});return{executeCreateMutation:async(e,a,s)=>(t.mutations[s.path.key]=await r.createDocument(e,a),null),executeSetMutation:async(e,a,s,n)=>(t.mutations[n.path.key]=await r.setDocument(e,a,s),null),executeUpdateMutation:async(e,s)=>(t.mutations[s.path.key]=await r.updateDocument(e.id,a(e.patch)),null),async executeRemoveMutation(e,a){t.mutations[a.path.key]=await r.removeDocument(e)},executeSetModelAccessDefaults:async()=>null,async executeRemoveModelAccessDefaults(){},executeSetDocumentAccessOverride:async()=>null,async executeRemoveDocumentAccessOverride(){}}}export class MutationsRunner{#t;constructor(e={}){this.#t=e.schemas??{}}hasSchema(e){return null!=this.#t[e]}setSchema(e,a){this.#t[e]=Promise.resolve(a).then(t)}async execute(e){let t=this.#t[e.schemaID];if(null==t)throw Error(`Schema ${e.schemaID} not found`);return await r({contextValue:createContext(e.context),schema:await t,source:e.source,variableValues:e.variables})}}
1
+ import{stringifyToken as e}from"@enkaku/token";import{createSchema as t}from"@kubun/graphql";import{convertPatchInput as a,createMutationOperations as r}from"@kubun/mutation";import{graphql as n}from"graphql";import{signChangeMutation as o,signSetMutation as s}from"./mutations.js";export class GraphQLExecutionError extends Error{#e;constructor(e,t="GraphQL execution failed"){super(t),this.name=GraphQLExecutionError.name,this.#e=e}get errors(){return this.#e}}export function createContext(t){let n=r({issuer:t.identity.id,hlc:t.hlc,getRandomValues:t.getRandomValues,processSetMutation:async a=>e(await s({identity:t.identity,mutation:a})),processChangeMutation:async a=>e(await o({identity:t.identity,mutation:a}))});return{executeCreateMutation:async({modelID:e,data:a,info:r})=>(t.mutations[r.path.key]=await n.createDocument({modelID:e,data:a}),null),executeSetMutation:async({modelID:e,unique:a,data:r,info:o})=>(t.mutations[o.path.key]=await n.setDocument({modelID:e,unique:a,data:r}),null),executeUpdateMutation:async({input:e,info:r})=>(t.mutations[r.path.key]=await n.updateDocument({docID:e.id,patch:a(e.patch)}),null),async executeRemoveMutation({id:e,info:a}){t.mutations[a.path.key]=await n.removeDocument({docID:e})},executeSetModelAccessDefaults:async()=>null,async executeRemoveModelAccessDefaults(){},executeSetDocumentAccessOverride:async()=>null,async executeRemoveDocumentAccessOverride(){},beginTransaction(){throw Error("Transaction mutations are not supported in client mode")},async commitTransaction(){throw Error("Transaction mutations are not supported in client mode")},rollbackTransaction(){throw Error("Transaction mutations are not supported in client mode")}}}export class MutationsRunner{#t;constructor(e={}){this.#t=e.schemas??{}}hasSchema(e){return null!=this.#t[e]}setSchema(e,a){this.#t[e]=Promise.resolve(a).then(t)}async execute(e){let t=this.#t[e.schemaID];if(null==t)throw Error(`Schema ${e.schemaID} not found`);return await n({contextValue:createContext(e.context),schema:await t,source:e.source,variableValues:e.variables})}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubun/client",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "license": "see LICENSE.md",
5
5
  "keywords": [],
6
6
  "type": "module",
@@ -15,18 +15,18 @@
15
15
  ],
16
16
  "sideEffects": false,
17
17
  "dependencies": {
18
- "@enkaku/client": "^0.13.0",
18
+ "@enkaku/client": "^0.13.1",
19
19
  "@enkaku/codec": "^0.13.0",
20
20
  "@enkaku/token": "0.13.0",
21
- "graphql": "^16.12.0",
21
+ "graphql": "^16.13.1",
22
22
  "multiformats": "^13.4.2",
23
23
  "@kubun/id": "^0.6.0",
24
- "@kubun/logger": "^0.6.0",
24
+ "@kubun/logger": "^0.6.1",
25
25
  "@kubun/mutation": "^0.6.0"
26
26
  },
27
27
  "devDependencies": {
28
- "@kubun/graphql": "^0.6.0",
29
- "@kubun/protocol": "^0.6.0"
28
+ "@kubun/protocol": "^0.6.0",
29
+ "@kubun/graphql": "^0.6.1"
30
30
  },
31
31
  "scripts": {
32
32
  "build:clean": "del lib",