@entity-access/entity-access 1.0.157 → 1.0.159

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.
Files changed (149) hide show
  1. package/dist/common/CustomEvent.js +0 -1
  2. package/dist/common/CustomEvent.js.map +1 -1
  3. package/dist/common/EntityAccessError.js +0 -1
  4. package/dist/common/EntityAccessError.js.map +1 -1
  5. package/dist/common/ErrorModel.js +1 -2
  6. package/dist/common/ErrorModel.js.map +1 -1
  7. package/dist/common/EventSet.d.ts +3 -1
  8. package/dist/common/EventSet.d.ts.map +1 -1
  9. package/dist/common/EventSet.js +3 -2
  10. package/dist/common/EventSet.js.map +1 -1
  11. package/dist/common/IDisposable.d.ts +0 -6
  12. package/dist/common/IDisposable.d.ts.map +1 -1
  13. package/dist/common/IDisposable.js +1 -0
  14. package/dist/common/IDisposable.js.map +1 -1
  15. package/dist/common/Logger.d.ts +3 -3
  16. package/dist/common/Logger.d.ts.map +1 -1
  17. package/dist/common/Logger.js +7 -15
  18. package/dist/common/Logger.js.map +1 -1
  19. package/dist/common/ObjectPool.d.ts.map +1 -1
  20. package/dist/common/ObjectPool.js +5 -13
  21. package/dist/common/ObjectPool.js.map +1 -1
  22. package/dist/common/cache/TimedCache.js +3 -4
  23. package/dist/common/cache/TimedCache.js.map +1 -1
  24. package/dist/common/usingAsync.d.ts +3 -1
  25. package/dist/common/usingAsync.d.ts.map +1 -1
  26. package/dist/common/usingAsync.js +8 -2
  27. package/dist/common/usingAsync.js.map +1 -1
  28. package/dist/compiler/QueryCompiler.js +3 -11
  29. package/dist/compiler/QueryCompiler.js.map +1 -1
  30. package/dist/compiler/RawQuery.js +0 -1
  31. package/dist/compiler/RawQuery.js.map +1 -1
  32. package/dist/decorators/SchemaRegistry.js +3 -2
  33. package/dist/decorators/SchemaRegistry.js.map +1 -1
  34. package/dist/di/di.js +1 -2
  35. package/dist/di/di.js.map +1 -1
  36. package/dist/drivers/base/BaseDriver.d.ts +13 -8
  37. package/dist/drivers/base/BaseDriver.d.ts.map +1 -1
  38. package/dist/drivers/base/BaseDriver.js +27 -7
  39. package/dist/drivers/base/BaseDriver.js.map +1 -1
  40. package/dist/drivers/postgres/PostgreSqlDriver.d.ts.map +1 -1
  41. package/dist/drivers/postgres/PostgreSqlDriver.js +7 -13
  42. package/dist/drivers/postgres/PostgreSqlDriver.js.map +1 -1
  43. package/dist/drivers/sql-server/SqlServerDriver.d.ts +2 -2
  44. package/dist/drivers/sql-server/SqlServerDriver.d.ts.map +1 -1
  45. package/dist/drivers/sql-server/SqlServerDriver.js +14 -38
  46. package/dist/drivers/sql-server/SqlServerDriver.js.map +1 -1
  47. package/dist/entity-query/EntityType.js +9 -23
  48. package/dist/entity-query/EntityType.js.map +1 -1
  49. package/dist/eternity/ActivitySuspendedError.js +0 -1
  50. package/dist/eternity/ActivitySuspendedError.js.map +1 -1
  51. package/dist/eternity/EternityContext.d.ts.map +1 -1
  52. package/dist/eternity/EternityContext.js +17 -26
  53. package/dist/eternity/EternityContext.js.map +1 -1
  54. package/dist/eternity/EternityStorage.js +7 -35
  55. package/dist/eternity/EternityStorage.js.map +1 -1
  56. package/dist/eternity/Workflow.js +2 -12
  57. package/dist/eternity/Workflow.js.map +1 -1
  58. package/dist/eternity/WorkflowClock.js +1 -6
  59. package/dist/eternity/WorkflowClock.js.map +1 -1
  60. package/dist/migrations/Migrations.js +0 -1
  61. package/dist/migrations/Migrations.js.map +1 -1
  62. package/dist/model/EntityContext.js +4 -21
  63. package/dist/model/EntityContext.js.map +1 -1
  64. package/dist/model/EntityModel.js +2 -3
  65. package/dist/model/EntityModel.js.map +1 -1
  66. package/dist/model/EntityQuery.d.ts.map +1 -1
  67. package/dist/model/EntityQuery.js +120 -98
  68. package/dist/model/EntityQuery.js.map +1 -1
  69. package/dist/model/EntitySource.js +0 -3
  70. package/dist/model/EntitySource.js.map +1 -1
  71. package/dist/model/SourceExpression.js +0 -9
  72. package/dist/model/SourceExpression.js.map +1 -1
  73. package/dist/model/changes/ChangeEntry.js +0 -10
  74. package/dist/model/changes/ChangeEntry.js.map +1 -1
  75. package/dist/model/changes/ChangeSet.js +8 -9
  76. package/dist/model/changes/ChangeSet.js.map +1 -1
  77. package/dist/model/events/ContextEvents.js +3 -1
  78. package/dist/model/events/ContextEvents.js.map +1 -1
  79. package/dist/model/events/EntityEvents.js +0 -6
  80. package/dist/model/events/EntityEvents.js.map +1 -1
  81. package/dist/model/identity/RelationMapper.js +1 -3
  82. package/dist/model/identity/RelationMapper.js.map +1 -1
  83. package/dist/model/verification/VerificationSession.d.ts.map +1 -1
  84. package/dist/model/verification/VerificationSession.js +26 -23
  85. package/dist/model/verification/VerificationSession.js.map +1 -1
  86. package/dist/query/Query.js +3 -8
  87. package/dist/query/Query.js.map +1 -1
  88. package/dist/query/ast/ExpressionToSql.d.ts.map +1 -1
  89. package/dist/query/ast/ExpressionToSql.js +2 -6
  90. package/dist/query/ast/ExpressionToSql.js.map +1 -1
  91. package/dist/query/ast/Expressions.js +128 -107
  92. package/dist/query/ast/Expressions.js.map +1 -1
  93. package/dist/query/ast/IStringTransformer.js +0 -1
  94. package/dist/query/ast/IStringTransformer.js.map +1 -1
  95. package/dist/query/ast/ParameterScope.js +4 -2
  96. package/dist/query/ast/ParameterScope.js.map +1 -1
  97. package/dist/query/expander/QueryExpander.js +1 -4
  98. package/dist/query/expander/QueryExpander.js.map +1 -1
  99. package/dist/query/parser/ArrowToExpression.js +2 -4
  100. package/dist/query/parser/ArrowToExpression.js.map +1 -1
  101. package/dist/query/parser/Restructure.js +4 -1
  102. package/dist/query/parser/Restructure.js.map +1 -1
  103. package/dist/tests/TestConfig.js +0 -2
  104. package/dist/tests/TestConfig.js.map +1 -1
  105. package/dist/tests/eternity/child-tests.js +8 -14
  106. package/dist/tests/eternity/child-tests.js.map +1 -1
  107. package/dist/tests/eternity/eternity-tests.js +8 -14
  108. package/dist/tests/eternity/eternity-tests.js.map +1 -1
  109. package/dist/tests/eternity/external-event-tests.js +5 -14
  110. package/dist/tests/eternity/external-event-tests.js.map +1 -1
  111. package/dist/tests/model/ShoppingContext.js +15 -90
  112. package/dist/tests/model/ShoppingContext.js.map +1 -1
  113. package/dist/tests/model/UseFile.js +1 -13
  114. package/dist/tests/model/UseFile.js.map +1 -1
  115. package/dist/tests/security/events/OrderEvents.js +1 -11
  116. package/dist/tests/security/events/OrderEvents.js.map +1 -1
  117. package/dist/tests/security/events/ProductEvents.js +1 -12
  118. package/dist/tests/security/events/ProductEvents.js.map +1 -1
  119. package/dist/tests/security/events/UserEvents.js +1 -10
  120. package/dist/tests/security/events/UserEvents.js.map +1 -1
  121. package/dist/tests/security/events/UserInfo.js +1 -8
  122. package/dist/tests/security/events/UserInfo.js.map +1 -1
  123. package/dist/tests/security/tests/place-order.d.ts.map +1 -1
  124. package/dist/tests/security/tests/place-order.js +28 -12
  125. package/dist/tests/security/tests/place-order.js.map +1 -1
  126. package/dist/tests/security/tests/test-events.d.ts.map +1 -1
  127. package/dist/tests/security/tests/test-events.js +11 -5
  128. package/dist/tests/security/tests/test-events.js.map +1 -1
  129. package/dist/tsconfig.tsbuildinfo +1 -1
  130. package/dist/types/DateTime.js +0 -37
  131. package/dist/types/DateTime.js.map +1 -1
  132. package/dist/types/TimeSpan.js +0 -1
  133. package/dist/types/TimeSpan.js.map +1 -1
  134. package/package.json +5 -4
  135. package/src/common/EventSet.ts +3 -0
  136. package/src/common/IDisposable.ts +0 -8
  137. package/src/common/Logger.ts +3 -3
  138. package/src/common/ObjectPool.ts +1 -0
  139. package/src/common/usingAsync.ts +7 -1
  140. package/src/drivers/base/BaseDriver.ts +38 -12
  141. package/src/drivers/postgres/PostgreSqlDriver.ts +8 -4
  142. package/src/drivers/sql-server/SqlServerDriver.ts +10 -29
  143. package/src/eternity/EternityContext.ts +51 -56
  144. package/src/model/EntityQuery.ts +4 -10
  145. package/src/model/verification/VerificationSession.ts +5 -9
  146. package/src/query/ast/ExpressionToSql.ts +0 -2
  147. package/src/tests/security/tests/place-order.ts +83 -92
  148. package/src/tests/security/tests/test-events.ts +31 -35
  149. package/tsconfig.json +4 -2
@@ -1,12 +1,4 @@
1
1
  /* eslint-disable no-console */
2
- /* eslint-disable @typescript-eslint/naming-convention */
3
- declare global {
4
- interface SymbolConstructor {
5
- readonly dispose?: unique symbol;
6
- readonly asyncDispose?: unique symbol;
7
- }
8
- }
9
-
10
2
  // @ts-expect-error readonly
11
3
  Symbol.dispose ??= Symbol("@@disposable");
12
4
  // @ts-expect-error readonly
@@ -26,7 +26,7 @@ export default class Logger implements IDisposable {
26
26
  return new SessionLogger(this);
27
27
  }
28
28
 
29
- dispose() {
29
+ [Symbol.dispose]() {
30
30
  // do nothing...
31
31
  }
32
32
  }
@@ -47,7 +47,7 @@ export class ConsoleLogger extends Logger {
47
47
  return new SessionLogger(this);
48
48
  }
49
49
 
50
- dispose() {
50
+ [Symbol.dispose]() {
51
51
  // do nothing...
52
52
  }
53
53
  }
@@ -69,7 +69,7 @@ class SessionLogger extends Logger {
69
69
  return this;
70
70
  }
71
71
 
72
- dispose(): void {
72
+ [Symbol.dispose](): void {
73
73
  for (const { log, error } of this.items) {
74
74
  if (log) {
75
75
  this.parent.log(log);
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-base-to-string */
1
2
  /* eslint-disable no-console */
2
3
  import EntityAccessError from "./EntityAccessError.js";
3
4
  import TimedCache from "./cache/TimedCache.js";
@@ -1,5 +1,7 @@
1
1
  import { IDisposable } from "./IDisposable.js";
2
2
 
3
+ import "./IDisposable.js";
4
+
3
5
  export type IDisposableObject = IDisposable & { end?(): any; close?():any };
4
6
 
5
7
  export type IDisposableObjectType = IDisposableObject | IDisposableObject[];
@@ -39,7 +41,7 @@ export default async function usingAsync<T>(fx: (registry: IDisposableObject[])
39
41
  }
40
42
  }
41
43
 
42
- export class DisposableScope {
44
+ export class AsyncDisposableScope {
43
45
 
44
46
  private disposables: IDisposableObject[] = [];
45
47
 
@@ -51,4 +53,8 @@ export class DisposableScope {
51
53
  await disposeAll(this.disposables);
52
54
  }
53
55
 
56
+ async [Symbol.asyncDispose]() {
57
+ await disposeAll(this.disposables);
58
+ }
59
+
54
60
  }
@@ -5,12 +5,6 @@ import Migrations from "../../migrations/Migrations.js";
5
5
  import ChangeEntry from "../../model/changes/ChangeEntry.js";
6
6
  import { BinaryExpression, Constant, DeleteStatement, ExistsExpression, Expression, Identifier, InsertStatement, NotExits, ReturnUpdated, SelectStatement, TableLiteral, UnionAllStatement, UpdateStatement, ValuesStatement } from "../../query/ast/Expressions.js";
7
7
 
8
- export const disposableSymbol: unique symbol = (Symbol as any).dispose ??= Symbol("disposable");
9
-
10
- interface IDisposable {
11
- [disposableSymbol]?(): void;
12
- }
13
-
14
8
  export interface IRecord {
15
9
  [key: string]: string | boolean | number | Date | Uint8Array | Blob;
16
10
  }
@@ -24,9 +18,10 @@ export interface IDbConnectionString {
24
18
  poolSize?: number;
25
19
  }
26
20
 
27
- export interface IDbReader extends IDisposable {
21
+ export interface IDbReader {
28
22
  next(min?: number, signal?: AbortSignal): AsyncGenerator<IRecord, any, any>;
29
23
  dispose(): Promise<any>;
24
+ [Symbol.asyncDispose](): Promise<void>;
30
25
  }
31
26
 
32
27
  export const toQuery = (text: IQuery): { text: string, values?: any[]} => typeof text === "string"
@@ -51,7 +46,38 @@ export interface IQueryResult {
51
46
  export interface IBaseTransaction {
52
47
  commit(): Promise<any>;
53
48
  rollback(): Promise<any>;
54
- dispose(): Promise<any>;
49
+ dispose(): Promise<void>;
50
+ }
51
+
52
+ export class EntityTransaction {
53
+
54
+ committedOrRolledBack = false;
55
+
56
+ constructor(private tx: IBaseTransaction) {}
57
+
58
+ commit() {
59
+ this.committedOrRolledBack = true;
60
+ return this.tx.commit();
61
+ }
62
+
63
+ rollback() {
64
+ this.committedOrRolledBack = true;
65
+ return this.tx.rollback();
66
+ }
67
+
68
+ async dispose() {
69
+ if(!this.committedOrRolledBack) {
70
+ await this.tx.commit();
71
+ }
72
+ await this.tx.dispose();
73
+ }
74
+
75
+ async [Symbol.asyncDispose]() {
76
+ if(!this.committedOrRolledBack) {
77
+ await this.tx.commit();
78
+ }
79
+ await this.tx.dispose();
80
+ }
55
81
  }
56
82
 
57
83
  export abstract class BaseConnection {
@@ -60,7 +86,7 @@ export abstract class BaseConnection {
60
86
 
61
87
  protected connectionString: IDbConnectionString;
62
88
 
63
- private currentTransaction: IBaseTransaction;
89
+ private currentTransaction: EntityTransaction;
64
90
 
65
91
 
66
92
  constructor(public driver: BaseDriver) {
@@ -81,7 +107,7 @@ export abstract class BaseConnection {
81
107
 
82
108
  public abstract executeQuery(command: IQuery, signal?: AbortSignal): Promise<IQueryResult>;
83
109
 
84
- public abstract createTransaction(): Promise<IBaseTransaction>;
110
+ public abstract createTransaction(): Promise<EntityTransaction>;
85
111
 
86
112
  public async runInTransaction<T = any>(fx?: () => Promise<T>) {
87
113
  if(this.currentTransaction) {
@@ -90,7 +116,7 @@ export abstract class BaseConnection {
90
116
  return await fx();
91
117
  }
92
118
  let failed = true;
93
- let tx: IBaseTransaction;
119
+ let tx: EntityTransaction;
94
120
  try {
95
121
  tx = this.currentTransaction = await this.createTransaction();
96
122
  const result = await fx();
@@ -101,7 +127,7 @@ export abstract class BaseConnection {
101
127
  if (failed) {
102
128
  await tx?.rollback();
103
129
  }
104
- await tx?.dispose();
130
+ await tx?.[Symbol.asyncDispose]();
105
131
  this.currentTransaction = null;
106
132
  }
107
133
  }
@@ -3,7 +3,7 @@ import ObjectPool, { IPooledObject } from "../../common/ObjectPool.js";
3
3
  import QueryCompiler from "../../compiler/QueryCompiler.js";
4
4
  import Migrations from "../../migrations/Migrations.js";
5
5
  import PostgresAutomaticMigrations from "../../migrations/postgres/PostgresAutomaticMigrations.js";
6
- import { BaseConnection, BaseDriver, IBaseTransaction, IDbConnectionString, IDbReader, IQuery, IRecord, toQuery } from "../base/BaseDriver.js";
6
+ import { BaseConnection, BaseDriver, EntityTransaction, IBaseTransaction, IDbConnectionString, IDbReader, IQuery, IRecord, toQuery } from "../base/BaseDriver.js";
7
7
  import pg from "pg";
8
8
  import Cursor from "pg-cursor";
9
9
  export interface IPgSqlConnectionString extends IDbConnectionString {
@@ -69,6 +69,10 @@ class DbReader implements IDbReader {
69
69
  console.error(error.stack ?? error);
70
70
  }
71
71
  }
72
+
73
+ [Symbol.asyncDispose]() {
74
+ return this.dispose();
75
+ }
72
76
  }
73
77
 
74
78
  export default class PostgreSqlDriver extends BaseDriver {
@@ -128,17 +132,17 @@ class PostgreSqlConnection extends BaseConnection {
128
132
  super(driver);
129
133
  }
130
134
 
131
- public async createTransaction(): Promise<IBaseTransaction> {
135
+ public async createTransaction(): Promise<EntityTransaction> {
132
136
  const tx = await this.getConnection();
133
137
  await tx.query("BEGIN");
134
- return {
138
+ return new EntityTransaction({
135
139
  commit: () => tx.query("COMMIT"),
136
140
  rollback: () => tx.query("ROLLBACK"),
137
141
  dispose: () => {
138
142
  this.transaction = null;
139
143
  return tx[Symbol.asyncDispose]();
140
144
  }
141
- };
145
+ });
142
146
  }
143
147
 
144
148
  public automaticMigrations(): Migrations {
@@ -1,7 +1,7 @@
1
1
  /* eslint-disable no-console */
2
2
  import QueryCompiler from "../../compiler/QueryCompiler.js";
3
3
  import Migrations from "../../migrations/Migrations.js";
4
- import { BaseConnection, BaseDriver, IBaseTransaction, IDbConnectionString, IDbReader, IQuery, IRecord, disposableSymbol, toQuery } from "../base/BaseDriver.js";
4
+ import { BaseConnection, BaseDriver, EntityTransaction, IBaseTransaction, IDbConnectionString, IDbReader, IQuery, IRecord, toQuery } from "../base/BaseDriver.js";
5
5
  import sql from "mssql";
6
6
  import SqlServerQueryCompiler from "./SqlServerQueryCompiler.js";
7
7
  import SqlServerAutomaticMigrations from "../../migrations/sql-server/SqlServerAutomaticMigrations.js";
@@ -105,41 +105,18 @@ export class SqlServerConnection extends BaseConnection {
105
105
  return value;
106
106
  }
107
107
 
108
- public async createTransaction(): Promise<IBaseTransaction> {
108
+ public async createTransaction(): Promise<EntityTransaction> {
109
109
  this.transaction = new sql.Transaction(await this.newConnection());
110
110
  let rolledBack = false;
111
111
  this.transaction.on("rollback", (aborted) => rolledBack = aborted);
112
112
  await this.transaction.begin();
113
- return {
113
+ return new EntityTransaction({
114
114
  commit: () => this.transaction.commit(),
115
115
  rollback: async () => !rolledBack && await this.transaction.rollback(),
116
116
  dispose: () => this.transaction = void 0
117
- };
117
+ });
118
118
  }
119
119
 
120
- // public async runInTransaction<T = any>(fx?: () => Promise<T>): Promise<T> {
121
- // this.transaction = new sql.Transaction(await this.newConnection());
122
- // let rolledBack = false;
123
- // try {
124
- // this.transaction.on("rollback", (aborted) => rolledBack = aborted);
125
- // await this.transaction.begin();
126
- // const r = await fx();
127
- // await this.transaction.commit();
128
- // return r;
129
- // } catch (error) {
130
- // if (!rolledBack) {
131
- // try {
132
- // await this.transaction.rollback();
133
- // } catch {
134
- // // rolledBack isn't true sometimes...
135
- // }
136
- // }
137
- // throw new Error(error.stack ?? error);
138
- // } finally {
139
- // this.transaction = void 0;
140
- // }
141
- // }
142
-
143
120
  public automaticMigrations(): Migrations {
144
121
  return new SqlServerAutomaticMigrations(this.sqlQueryCompiler);
145
122
  }
@@ -151,6 +128,7 @@ export class SqlServerConnection extends BaseConnection {
151
128
  } else {
152
129
  request = (await this.newConnection()).request();
153
130
  }
131
+ // request.verbose = true;
154
132
  if (signal) {
155
133
  if (signal.aborted) {
156
134
  request.cancel();
@@ -232,10 +210,13 @@ class SqlReader implements IDbReader {
232
210
  } while(true);
233
211
  }
234
212
  dispose(): Promise<any> {
213
+ // if (!this.ended) {
214
+ // this.rq.cancel();
215
+ // }
235
216
  return Promise.resolve();
236
217
  }
237
- [disposableSymbol]?(): void {
238
- this.dispose()?.catch((error) => console.error(error));
218
+ [Symbol.asyncDispose]() {
219
+ return this.dispose()?.catch((error) => console.error(error));
239
220
  }
240
221
 
241
222
  }
@@ -328,68 +328,63 @@ export default class EternityContext {
328
328
  return;
329
329
  }
330
330
 
331
- const scope = ServiceProvider.from(this).createScope();
331
+ using scope = ServiceProvider.from(this).createScope();
332
332
 
333
- try {
334
-
335
- this.log(`Run workflow ${workflow.id} -----------------------------------`);
333
+ this.log(`Run workflow ${workflow.id} -----------------------------------`);
336
334
 
337
- const schema = WorkflowRegistry.getByName(workflow.name);
338
- const { eta, id, queued } = workflow;
339
- const input = JSON.parse(workflow.input);
340
- const instance = new (schema.type)({ input, eta, id, currentTime: DateTime.from(queued) }, this);
341
- for (const iterator of schema.activities) {
342
- instance[iterator] = bindStep(this, workflow, iterator, instance[iterator]);
343
- }
344
- for (const iterator of schema.uniqueActivities) {
345
- instance[iterator] = bindStep(this, workflow, iterator, instance[iterator], true);
346
- }
347
- scope.add( schema.type, instance);
348
- try {
349
- const result = await instance.run();
350
- workflow.output = JSON.stringify(result ?? 0);
351
- workflow.state = "done";
352
- workflow.eta = clock.utcNow.add(instance.preserveTime);
353
- } catch (error) {
354
- if (error instanceof ActivitySuspendedError) {
355
- // this will update last id...
356
- workflow.eta = clock.utcNow.add(error.ttl);
357
- workflow.lockedTTL = null;
358
- workflow.lockToken = null;
359
- await this.storage.save(workflow);
360
- return;
361
- }
362
- workflow.error = JSON.stringify(error.stack ?? error);
363
- console.error(error);
364
- workflow.state = "failed";
365
- workflow.eta = clock.utcNow.add(instance.failedPreserveTime);
335
+ const schema = WorkflowRegistry.getByName(workflow.name);
336
+ const { eta, id, queued } = workflow;
337
+ const input = JSON.parse(workflow.input);
338
+ const instance = new (schema.type)({ input, eta, id, currentTime: DateTime.from(queued) }, this);
339
+ for (const iterator of schema.activities) {
340
+ instance[iterator] = bindStep(this, workflow, iterator, instance[iterator]);
341
+ }
342
+ for (const iterator of schema.uniqueActivities) {
343
+ instance[iterator] = bindStep(this, workflow, iterator, instance[iterator], true);
344
+ }
345
+ scope.add( schema.type, instance);
346
+ try {
347
+ const result = await instance.run();
348
+ workflow.output = JSON.stringify(result ?? 0);
349
+ workflow.state = "done";
350
+ workflow.eta = clock.utcNow.add(instance.preserveTime);
351
+ } catch (error) {
352
+ if (error instanceof ActivitySuspendedError) {
353
+ // this will update last id...
354
+ workflow.eta = clock.utcNow.add(error.ttl);
355
+ workflow.lockedTTL = null;
356
+ workflow.lockToken = null;
357
+ await this.storage.save(workflow);
358
+ return;
366
359
  }
360
+ workflow.error = JSON.stringify(error.stack ?? error);
361
+ console.error(error);
362
+ workflow.state = "failed";
363
+ workflow.eta = clock.utcNow.add(instance.failedPreserveTime);
364
+ }
367
365
 
368
- // in case of child workflow...
369
- // eta will be set to one year...
370
- if (workflow.parentID) {
371
- workflow.eta = clock.utcNow.addYears(1);
372
- // since we have finished.. we should
373
- // make parent's eta approach now sooner..
374
- }
366
+ // in case of child workflow...
367
+ // eta will be set to one year...
368
+ if (workflow.parentID) {
369
+ workflow.eta = clock.utcNow.addYears(1);
370
+ // since we have finished.. we should
371
+ // make parent's eta approach now sooner..
372
+ }
375
373
 
376
- workflow.lockedTTL = null;
377
- workflow.lockToken = null;
378
- await this.storage.save(workflow);
379
-
380
- if (workflow.parentID) {
381
- const parent = await this.storage.getWorkflow(workflow.parentID);
382
- if (parent) {
383
- parent.lockTTL = null;
384
- parent.lockToken = null;
385
- parent.eta = clock.utcNow;
386
- await this.storage.save(parent);
387
- }
374
+ workflow.lockedTTL = null;
375
+ workflow.lockToken = null;
376
+ await this.storage.save(workflow);
377
+
378
+ if (workflow.parentID) {
379
+ const parent = await this.storage.getWorkflow(workflow.parentID);
380
+ if (parent) {
381
+ parent.lockTTL = null;
382
+ parent.lockToken = null;
383
+ parent.eta = clock.utcNow;
384
+ await this.storage.save(parent);
388
385
  }
389
- // workflow finished successfully...
390
-
391
- } finally {
392
- scope.dispose();
393
386
  }
387
+ // workflow finished successfully...
388
+
394
389
  }
395
390
  }
@@ -1,6 +1,6 @@
1
1
  import EntityAccessError from "../common/EntityAccessError.js";
2
2
  import Logger from "../common/Logger.js";
3
- import { DisposableScope } from "../common/usingAsync.js";
3
+ import { AsyncDisposableScope } from "../common/usingAsync.js";
4
4
  import { ServiceProvider } from "../di/di.js";
5
5
  import { IDbReader } from "../drivers/base/BaseDriver.js";
6
6
  import EntityType from "../entity-query/EntityType.js";
@@ -91,7 +91,7 @@ export default class EntityQuery<T = any>
91
91
 
92
92
  async *enumerate(): AsyncGenerator<T, any, unknown> {
93
93
 
94
- const scope = new DisposableScope();
94
+ await using scope = new AsyncDisposableScope();
95
95
  const session = this.context.logger?.newSession() ?? Logger.nullLogger;
96
96
  let query: { text: string, values: any[]};
97
97
  try {
@@ -131,8 +131,6 @@ export default class EntityQuery<T = any>
131
131
  } catch(error) {
132
132
  session.error(`Failed executing ${query?.text}\n${error.stack ?? error}`);
133
133
  throw error;
134
- } finally {
135
- await scope.dispose();
136
134
  }
137
135
  }
138
136
 
@@ -221,7 +219,7 @@ export default class EntityQuery<T = any>
221
219
 
222
220
  const nq = new EntityQuery({ ... this, selectStatement: select });
223
221
 
224
- const scope = new DisposableScope();
222
+ await using scope = new AsyncDisposableScope();
225
223
  const session = this.context.logger?.newSession() ?? Logger.nullLogger;
226
224
  let query;
227
225
  try {
@@ -237,8 +235,6 @@ export default class EntityQuery<T = any>
237
235
  } catch (error) {
238
236
  session.error(`Failed executing ${query?.text}\r\n${error.stack ?? error}`);
239
237
  throw error;
240
- } finally {
241
- await scope.dispose();
242
238
  }
243
239
 
244
240
  }
@@ -262,7 +258,7 @@ export default class EntityQuery<T = any>
262
258
 
263
259
  const nq = new EntityQuery({ ... this, selectStatement: select });
264
260
 
265
- const scope = new DisposableScope();
261
+ await using scope = new AsyncDisposableScope();
266
262
  const session = this.context.logger?.newSession() ?? Logger.nullLogger;
267
263
  let query;
268
264
  try {
@@ -278,8 +274,6 @@ export default class EntityQuery<T = any>
278
274
  } catch (error) {
279
275
  session.error(`Failed executing ${query?.text}\r\n${error.stack ?? error}`);
280
276
  throw error;
281
- } finally {
282
- await scope.dispose();
283
277
  }
284
278
 
285
279
  }
@@ -158,15 +158,11 @@ export default class VerificationSession {
158
158
  const compiler = this.context.driver.compiler;
159
159
  const query = compiler.compileExpression(null, this.select);
160
160
  const logger = ServiceProvider.resolve(this.context, Logger);
161
- const session = logger.newSession();
162
- try {
163
- const { rows: [ { error }]} = await this.context.connection.executeQuery(query);
164
- if (error) {
165
- session.error(`Failed executing ${query.text}\n[${query.values.join(",")}]\n${error?.stack ?? error}`);
166
- EntityAccessError.throw(error);
167
- }
168
- } finally {
169
- session.dispose();
161
+ using session = logger.newSession();
162
+ const { rows: [ { error }]} = await this.context.connection.executeQuery(query);
163
+ if (error) {
164
+ session.error(`Failed executing ${query.text}\n[${query.values.join(",")}]\n${error?.stack ?? error}`);
165
+ EntityAccessError.throw(error);
170
166
  }
171
167
  }
172
168
 
@@ -1,5 +1,3 @@
1
- import EntityAccessError from "../../common/EntityAccessError.js";
2
- import { DisposableScope } from "../../common/usingAsync.js";
3
1
  import QueryCompiler from "../../compiler/QueryCompiler.js";
4
2
  import EntityType, { IEntityProperty } from "../../entity-query/EntityType.js";
5
3
  import EntityQuery from "../../model/EntityQuery.js";