@cubicweb/client 1.1.0 → 1.2.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/api/Api.d.ts CHANGED
@@ -5,9 +5,10 @@ export interface RQLParams {
5
5
  }
6
6
  export declare type RqlRow = Array<string | number | boolean | null>;
7
7
  export declare type ResultSet = Array<RqlRow>;
8
- export declare type ApiError = {
9
- error: string;
8
+ declare type ApiError = {
9
+ title: string;
10
10
  message: string;
11
+ data?: Record<string, unknown>;
11
12
  };
12
13
  export declare type ApiErrorResponse = {
13
14
  status: number;
@@ -17,12 +18,12 @@ export default class Api {
17
18
  private transactionApiUrl;
18
19
  constructor(apiUrl: string);
19
20
  execute(query: string, params: RQLParams): Promise<ResultSet>;
20
- schema(): Promise<RawSchema<import("../schema/SchemaJSON").EntityRawSchemaArray, import("../schema/SchemaJSON").RelationDefinitionRawSchemaArray<import("../schema/SchemaJSON").EntityRawSchemaArray>>>;
21
+ schema(): Promise<RawSchema>;
21
22
  login(login: string, password: string): Promise<boolean>;
22
23
  transactionBegin(): Promise<string>;
23
24
  transactionExecute(uuid: string, query: string, params: RQLParams): Promise<ResultSet>;
24
25
  transactionCommit(uuid: string): Promise<null>;
25
26
  transactionRollback(uuid: string): Promise<null>;
26
27
  }
27
- export declare const fetchApi: <R = unknown>(input: RequestInfo, init?: RequestInit | undefined) => Promise<R>;
28
+ export {};
28
29
  //# sourceMappingURL=Api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,oBAAY,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1D,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,CAAC;AAEb,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,MAAM,EAAE,MAAM;IAKpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAQxC,MAAM;IAON,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAarC,gBAAgB;IAQhB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS;IAQjE,iBAAiB,CAAC,IAAI,EAAE,MAAM;IAQ9B,mBAAmB,CAAC,IAAI,EAAE,MAAM;CAOvC;AAED,eAAO,MAAM,QAAQ,uBACZ,WAAW,+CAoBnB,CAAC"}
1
+ {"version":3,"file":"Api.d.ts","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,oBAAY,QAAQ,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,oBAAY,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;AAC7D,oBAAY,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;AACtC,aAAK,QAAQ,GAAG;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AACF,oBAAY,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,QAAQ,CAAC;AAEb,MAAM,CAAC,OAAO,OAAO,GAAG;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,iBAAiB,CAKvB;gBAEU,MAAM,EAAE,MAAM;IAUpB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAQ7D,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAO5B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAaxD,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAOnC,kBAAkB,CACtB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,SAAS,CAAC;IAQf,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOvD"}
package/lib/api/Api.js CHANGED
@@ -9,15 +9,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.fetchApi = void 0;
13
12
  class Api {
14
13
  constructor(apiUrl) {
14
+ this.transactionApiUrl = {
15
+ begin: "",
16
+ execute: "",
17
+ commit: "",
18
+ rollback: "",
19
+ };
15
20
  this.apiUrl = `${apiUrl}/v1`;
16
- this.transactionApiUrl = `${this.apiUrl}/transaction`;
21
+ Object.keys(this.transactionApiUrl).forEach((k) => (this.transactionApiUrl[k] = `${this.apiUrl}/transaction/${k}`));
17
22
  }
18
23
  execute(query, params) {
19
24
  return __awaiter(this, void 0, void 0, function* () {
20
- return (0, exports.fetchApi)(`${this.apiUrl}/rql`, {
25
+ return nonNullFetchApi(`${this.apiUrl}/rql`, {
21
26
  method: "POST",
22
27
  body: JSON.stringify({ query, params }),
23
28
  credentials: "include", // FIXME is it secure?
@@ -26,7 +31,7 @@ class Api {
26
31
  }
27
32
  schema() {
28
33
  return __awaiter(this, void 0, void 0, function* () {
29
- return (0, exports.fetchApi)(`${this.apiUrl}/schema`, {
34
+ return nonNullFetchApi(`${this.apiUrl}/schema`, {
30
35
  method: "GET",
31
36
  credentials: "include",
32
37
  });
@@ -34,7 +39,7 @@ class Api {
34
39
  }
35
40
  login(login, password) {
36
41
  return __awaiter(this, void 0, void 0, function* () {
37
- return (0, exports.fetchApi)(`${this.apiUrl}/login`, {
42
+ return fetchApi(`${this.apiUrl}/login`, {
38
43
  method: "POST",
39
44
  body: JSON.stringify({
40
45
  login,
@@ -48,58 +53,84 @@ class Api {
48
53
  }
49
54
  transactionBegin() {
50
55
  return __awaiter(this, void 0, void 0, function* () {
51
- return (0, exports.fetchApi)(this.transactionApiUrl, {
56
+ return nonNullFetchApi(this.transactionApiUrl.begin, {
52
57
  method: "POST",
53
- body: JSON.stringify({ action: "begin" }),
54
58
  credentials: "include",
55
59
  });
56
60
  });
57
61
  }
58
62
  transactionExecute(uuid, query, params) {
59
63
  return __awaiter(this, void 0, void 0, function* () {
60
- return (0, exports.fetchApi)(this.transactionApiUrl, {
64
+ return nonNullFetchApi(this.transactionApiUrl.execute, {
61
65
  method: "POST",
62
- body: JSON.stringify({ action: "execute", uuid, query, params }),
66
+ body: JSON.stringify({ uuid, query, params }),
63
67
  credentials: "include",
64
68
  });
65
69
  });
66
70
  }
67
71
  transactionCommit(uuid) {
68
72
  return __awaiter(this, void 0, void 0, function* () {
69
- return (0, exports.fetchApi)(this.transactionApiUrl, {
73
+ return fetchApi(this.transactionApiUrl.commit, {
70
74
  method: "POST",
71
- body: JSON.stringify({ action: "commit", uuid }),
75
+ body: JSON.stringify({ uuid }),
72
76
  credentials: "include",
73
77
  });
74
78
  });
75
79
  }
76
80
  transactionRollback(uuid) {
77
81
  return __awaiter(this, void 0, void 0, function* () {
78
- return (0, exports.fetchApi)(this.transactionApiUrl, {
82
+ return fetchApi(this.transactionApiUrl.rollback, {
79
83
  method: "POST",
80
- body: JSON.stringify({ action: "commit", uuid }),
84
+ body: JSON.stringify({ uuid }),
81
85
  credentials: "include",
82
86
  });
83
87
  });
84
88
  }
85
89
  }
86
90
  exports.default = Api;
91
+ const nonNullFetchApi = (input, init) => {
92
+ return new Promise((resolve, reject) => fetchApi(input, init)
93
+ .then((v) => {
94
+ if (v == null) {
95
+ const error = {
96
+ status: 500,
97
+ title: "Unexpected null response",
98
+ message: "Response was null but a value was expected",
99
+ };
100
+ reject(error);
101
+ }
102
+ else {
103
+ resolve(v);
104
+ }
105
+ })
106
+ .catch(reject));
107
+ };
87
108
  const fetchApi = (input, init) => {
88
- return new Promise((resolve, reject) => fetch(input, init).then((response) => {
109
+ let headers = init === null || init === void 0 ? void 0 : init.headers;
110
+ if ((init === null || init === void 0 ? void 0 : init.method) && init.method !== "GET" && init.method !== "DELETE") {
111
+ headers = Object.assign({ "Content-Type": "application/json;charset=UTF-8" }, init === null || init === void 0 ? void 0 : init.headers);
112
+ }
113
+ return new Promise((resolve, reject) => fetch(input, Object.assign(Object.assign({}, init), { headers })).then((response) => {
89
114
  const status = response.status;
90
115
  if (status >= 200 && status < 300) {
91
- response.json().then(resolve);
116
+ if (status === 204) {
117
+ resolve(null);
118
+ }
119
+ else {
120
+ response
121
+ .json()
122
+ .then(resolve)
123
+ .catch((e) => {
124
+ console.error(e);
125
+ resolve(null);
126
+ });
127
+ }
92
128
  }
93
129
  else {
94
130
  response.json().then((data) => {
95
- reject({
96
- status,
97
- error: data.error,
98
- message: data.message,
99
- });
131
+ reject(Object.assign({ status }, data));
100
132
  });
101
133
  }
102
134
  }));
103
135
  };
104
- exports.fetchApi = fetchApi;
105
136
  //# sourceMappingURL=Api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Api.js","sourceRoot":"","sources":["../../src/api/Api.ts"],"names":[],"mappings":"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"}
package/lib/api/Client.js CHANGED
@@ -41,7 +41,7 @@ class Client {
41
41
  yield transaction.begin();
42
42
  const result = yield callback(transaction);
43
43
  if (!transaction.isClosed()) {
44
- transaction.commit();
44
+ yield transaction.commit();
45
45
  }
46
46
  return result;
47
47
  });
@@ -1 +1 @@
1
- {"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/api/Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,6CAA0C;AAC1C,gDAAuC;AACvC,gEAAwC;AAExC,MAAqB,MAAM;IAGzB,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEK,OAAO,CAAC,KAAa,EAAE,SAAoB,EAAE;;YACjD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,MAAM;;YACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,IAAI,eAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;KAAA;IAEK,KAAK,CAAC,KAAa,EAAE,QAAgB;;YACzC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,WAAW,CAAI,QAAyC;;YAC5D,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;gBAC3B,WAAW,CAAC,MAAM,EAAE,CAAC;aACtB;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AA7BD,yBA6BC"}
1
+ {"version":3,"file":"Client.js","sourceRoot":"","sources":["../../src/api/Client.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,6CAA0C;AAC1C,gDAAuC;AACvC,gEAAwC;AAExC,MAAqB,MAAM;IAGzB,YAAY,MAAc;QACxB,IAAI,CAAC,GAAG,GAAG,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAEK,OAAO,CAAC,KAAa,EAAE,SAAoB,EAAE;;YACjD,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,MAAM;;YACV,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,IAAI,eAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;KAAA;IAEK,KAAK,CAAC,KAAa,EAAE,QAAgB;;YACzC,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC/C,CAAC;KAAA;IAEK,WAAW,CAAI,QAAyC;;YAC5D,MAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE;gBAC3B,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC5B;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;KAAA;CACF;AA7BD,yBA6BC"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@cubicweb/client",
3
3
  "description": "Official JS client for CubicWeb API",
4
4
  "author": "Logilab",
5
- "version": "1.1.0",
5
+ "version": "1.2.1",
6
6
  "license": "LGPL-3.0-or-later",
7
7
  "main": "lib/index.js",
8
8
  "types": "lib/index.d.ts",
package/src/api/Api.ts CHANGED
@@ -8,37 +8,51 @@ export interface RQLParams {
8
8
 
9
9
  export type RqlRow = Array<string | number | boolean | null>;
10
10
  export type ResultSet = Array<RqlRow>;
11
- export type ApiError = { error: string; message: string };
11
+ type ApiError = {
12
+ title: string;
13
+ message: string;
14
+ data?: Record<string, unknown>;
15
+ };
12
16
  export type ApiErrorResponse = {
13
17
  status: number;
14
18
  } & ApiError;
15
19
 
16
20
  export default class Api {
17
21
  private apiUrl: string;
18
- private transactionApiUrl: string;
22
+ private transactionApiUrl = {
23
+ begin: "",
24
+ execute: "",
25
+ commit: "",
26
+ rollback: "",
27
+ };
19
28
 
20
29
  constructor(apiUrl: string) {
21
30
  this.apiUrl = `${apiUrl}/v1`;
22
- this.transactionApiUrl = `${this.apiUrl}/transaction`;
31
+ Object.keys(this.transactionApiUrl).forEach(
32
+ (k) =>
33
+ (this.transactionApiUrl[
34
+ k as keyof typeof this.transactionApiUrl
35
+ ] = `${this.apiUrl}/transaction/${k}`)
36
+ );
23
37
  }
24
38
 
25
- async execute(query: string, params: RQLParams) {
26
- return fetchApi<ResultSet>(`${this.apiUrl}/rql`, {
39
+ async execute(query: string, params: RQLParams): Promise<ResultSet> {
40
+ return nonNullFetchApi<ResultSet>(`${this.apiUrl}/rql`, {
27
41
  method: "POST",
28
42
  body: JSON.stringify({ query, params }),
29
43
  credentials: "include", // FIXME is it secure?
30
44
  });
31
45
  }
32
46
 
33
- async schema() {
34
- return fetchApi<RawSchema>(`${this.apiUrl}/schema`, {
47
+ async schema(): Promise<RawSchema> {
48
+ return nonNullFetchApi<RawSchema>(`${this.apiUrl}/schema`, {
35
49
  method: "GET",
36
50
  credentials: "include",
37
51
  });
38
52
  }
39
53
 
40
- async login(login: string, password: string) {
41
- return fetchApi<boolean>(`${this.apiUrl}/login`, {
54
+ async login(login: string, password: string): Promise<boolean> {
55
+ return fetchApi<null>(`${this.apiUrl}/login`, {
42
56
  method: "POST",
43
57
  body: JSON.stringify({
44
58
  login,
@@ -50,55 +64,100 @@ export default class Api {
50
64
  .catch(() => false);
51
65
  }
52
66
 
53
- async transactionBegin() {
54
- return fetchApi<string>(this.transactionApiUrl, {
67
+ async transactionBegin(): Promise<string> {
68
+ return nonNullFetchApi<string>(this.transactionApiUrl.begin, {
55
69
  method: "POST",
56
- body: JSON.stringify({ action: "begin" }),
57
70
  credentials: "include",
58
71
  });
59
72
  }
60
73
 
61
- async transactionExecute(uuid: string, query: string, params: RQLParams) {
62
- return fetchApi<ResultSet>(this.transactionApiUrl, {
74
+ async transactionExecute(
75
+ uuid: string,
76
+ query: string,
77
+ params: RQLParams
78
+ ): Promise<ResultSet> {
79
+ return nonNullFetchApi<ResultSet>(this.transactionApiUrl.execute, {
63
80
  method: "POST",
64
- body: JSON.stringify({ action: "execute", uuid, query, params }),
81
+ body: JSON.stringify({ uuid, query, params }),
65
82
  credentials: "include",
66
83
  });
67
84
  }
68
85
 
69
- async transactionCommit(uuid: string) {
70
- return fetchApi<null>(this.transactionApiUrl, {
86
+ async transactionCommit(uuid: string): Promise<null> {
87
+ return fetchApi<null>(this.transactionApiUrl.commit, {
71
88
  method: "POST",
72
- body: JSON.stringify({ action: "commit", uuid }),
89
+ body: JSON.stringify({ uuid }),
73
90
  credentials: "include",
74
91
  });
75
92
  }
76
93
 
77
- async transactionRollback(uuid: string) {
78
- return fetchApi<null>(this.transactionApiUrl, {
94
+ async transactionRollback(uuid: string): Promise<null> {
95
+ return fetchApi<null>(this.transactionApiUrl.rollback, {
79
96
  method: "POST",
80
- body: JSON.stringify({ action: "commit", uuid }),
97
+ body: JSON.stringify({ uuid }),
81
98
  credentials: "include",
82
99
  });
83
100
  }
84
101
  }
85
102
 
86
- export const fetchApi = <R = unknown>(
103
+ const nonNullFetchApi = <R = unknown>(
87
104
  input: RequestInfo,
88
105
  init?: RequestInit
89
106
  ) => {
90
107
  return new Promise(
91
108
  (resolve: (value: R) => void, reject: (reason: ApiErrorResponse) => void) =>
92
- fetch(input, init).then((response) => {
109
+ fetchApi<R>(input, init)
110
+ .then((v) => {
111
+ if (v == null) {
112
+ const error: ApiErrorResponse = {
113
+ status: 500,
114
+ title: "Unexpected null response",
115
+ message: "Response was null but a value was expected",
116
+ };
117
+ reject(error);
118
+ } else {
119
+ resolve(v);
120
+ }
121
+ })
122
+ .catch(reject)
123
+ );
124
+ };
125
+
126
+ const fetchApi = <R = unknown>(input: RequestInfo, init?: RequestInit) => {
127
+ let headers = init?.headers;
128
+ if (init?.method && init.method !== "GET" && init.method !== "DELETE") {
129
+ headers = {
130
+ "Content-Type": "application/json;charset=UTF-8",
131
+ ...init?.headers,
132
+ };
133
+ }
134
+ return new Promise(
135
+ (
136
+ resolve: (value: R | null) => void,
137
+ reject: (reason: ApiErrorResponse) => void
138
+ ) =>
139
+ fetch(input, {
140
+ ...init,
141
+ headers,
142
+ }).then((response) => {
93
143
  const status = response.status;
94
144
  if (status >= 200 && status < 300) {
95
- response.json().then(resolve);
145
+ if (status === 204) {
146
+ resolve(null);
147
+ } else {
148
+ response
149
+ .json()
150
+ .then(resolve)
151
+ .catch((e) => {
152
+ console.error(e);
153
+ resolve(null);
154
+ });
155
+ }
96
156
  } else {
97
157
  response.json().then((data: ApiError) => {
98
158
  reject({
99
159
  status,
100
- error: data.error,
101
- message: data.message,
160
+ ...data,
102
161
  });
103
162
  });
104
163
  }
package/src/api/Client.ts CHANGED
@@ -27,7 +27,7 @@ export default class Client {
27
27
  await transaction.begin();
28
28
  const result = await callback(transaction);
29
29
  if (!transaction.isClosed()) {
30
- transaction.commit();
30
+ await transaction.commit();
31
31
  }
32
32
  return result;
33
33
  }