@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.
- package/dist/common/CustomEvent.js +0 -1
- package/dist/common/CustomEvent.js.map +1 -1
- package/dist/common/EntityAccessError.js +0 -1
- package/dist/common/EntityAccessError.js.map +1 -1
- package/dist/common/ErrorModel.js +1 -2
- package/dist/common/ErrorModel.js.map +1 -1
- package/dist/common/EventSet.d.ts +3 -1
- package/dist/common/EventSet.d.ts.map +1 -1
- package/dist/common/EventSet.js +3 -2
- package/dist/common/EventSet.js.map +1 -1
- package/dist/common/IDisposable.d.ts +0 -6
- package/dist/common/IDisposable.d.ts.map +1 -1
- package/dist/common/IDisposable.js +1 -0
- package/dist/common/IDisposable.js.map +1 -1
- package/dist/common/Logger.d.ts +3 -3
- package/dist/common/Logger.d.ts.map +1 -1
- package/dist/common/Logger.js +7 -15
- package/dist/common/Logger.js.map +1 -1
- package/dist/common/ObjectPool.d.ts.map +1 -1
- package/dist/common/ObjectPool.js +5 -13
- package/dist/common/ObjectPool.js.map +1 -1
- package/dist/common/cache/TimedCache.js +3 -4
- package/dist/common/cache/TimedCache.js.map +1 -1
- package/dist/common/usingAsync.d.ts +3 -1
- package/dist/common/usingAsync.d.ts.map +1 -1
- package/dist/common/usingAsync.js +8 -2
- package/dist/common/usingAsync.js.map +1 -1
- package/dist/compiler/QueryCompiler.js +3 -11
- package/dist/compiler/QueryCompiler.js.map +1 -1
- package/dist/compiler/RawQuery.js +0 -1
- package/dist/compiler/RawQuery.js.map +1 -1
- package/dist/decorators/SchemaRegistry.js +3 -2
- package/dist/decorators/SchemaRegistry.js.map +1 -1
- package/dist/di/di.js +1 -2
- package/dist/di/di.js.map +1 -1
- package/dist/drivers/base/BaseDriver.d.ts +13 -8
- package/dist/drivers/base/BaseDriver.d.ts.map +1 -1
- package/dist/drivers/base/BaseDriver.js +27 -7
- package/dist/drivers/base/BaseDriver.js.map +1 -1
- package/dist/drivers/postgres/PostgreSqlDriver.d.ts.map +1 -1
- package/dist/drivers/postgres/PostgreSqlDriver.js +7 -13
- package/dist/drivers/postgres/PostgreSqlDriver.js.map +1 -1
- package/dist/drivers/sql-server/SqlServerDriver.d.ts +2 -2
- package/dist/drivers/sql-server/SqlServerDriver.d.ts.map +1 -1
- package/dist/drivers/sql-server/SqlServerDriver.js +14 -38
- package/dist/drivers/sql-server/SqlServerDriver.js.map +1 -1
- package/dist/entity-query/EntityType.js +9 -23
- package/dist/entity-query/EntityType.js.map +1 -1
- package/dist/eternity/ActivitySuspendedError.js +0 -1
- package/dist/eternity/ActivitySuspendedError.js.map +1 -1
- package/dist/eternity/EternityContext.d.ts.map +1 -1
- package/dist/eternity/EternityContext.js +17 -26
- package/dist/eternity/EternityContext.js.map +1 -1
- package/dist/eternity/EternityStorage.js +7 -35
- package/dist/eternity/EternityStorage.js.map +1 -1
- package/dist/eternity/Workflow.js +2 -12
- package/dist/eternity/Workflow.js.map +1 -1
- package/dist/eternity/WorkflowClock.js +1 -6
- package/dist/eternity/WorkflowClock.js.map +1 -1
- package/dist/migrations/Migrations.js +0 -1
- package/dist/migrations/Migrations.js.map +1 -1
- package/dist/model/EntityContext.js +4 -21
- package/dist/model/EntityContext.js.map +1 -1
- package/dist/model/EntityModel.js +2 -3
- package/dist/model/EntityModel.js.map +1 -1
- package/dist/model/EntityQuery.d.ts.map +1 -1
- package/dist/model/EntityQuery.js +120 -98
- package/dist/model/EntityQuery.js.map +1 -1
- package/dist/model/EntitySource.js +0 -3
- package/dist/model/EntitySource.js.map +1 -1
- package/dist/model/SourceExpression.js +0 -9
- package/dist/model/SourceExpression.js.map +1 -1
- package/dist/model/changes/ChangeEntry.js +0 -10
- package/dist/model/changes/ChangeEntry.js.map +1 -1
- package/dist/model/changes/ChangeSet.js +8 -9
- package/dist/model/changes/ChangeSet.js.map +1 -1
- package/dist/model/events/ContextEvents.js +3 -1
- package/dist/model/events/ContextEvents.js.map +1 -1
- package/dist/model/events/EntityEvents.js +0 -6
- package/dist/model/events/EntityEvents.js.map +1 -1
- package/dist/model/identity/RelationMapper.js +1 -3
- package/dist/model/identity/RelationMapper.js.map +1 -1
- package/dist/model/verification/VerificationSession.d.ts.map +1 -1
- package/dist/model/verification/VerificationSession.js +26 -23
- package/dist/model/verification/VerificationSession.js.map +1 -1
- package/dist/query/Query.js +3 -8
- package/dist/query/Query.js.map +1 -1
- package/dist/query/ast/ExpressionToSql.d.ts.map +1 -1
- package/dist/query/ast/ExpressionToSql.js +2 -6
- package/dist/query/ast/ExpressionToSql.js.map +1 -1
- package/dist/query/ast/Expressions.js +128 -107
- package/dist/query/ast/Expressions.js.map +1 -1
- package/dist/query/ast/IStringTransformer.js +0 -1
- package/dist/query/ast/IStringTransformer.js.map +1 -1
- package/dist/query/ast/ParameterScope.js +4 -2
- package/dist/query/ast/ParameterScope.js.map +1 -1
- package/dist/query/expander/QueryExpander.js +1 -4
- package/dist/query/expander/QueryExpander.js.map +1 -1
- package/dist/query/parser/ArrowToExpression.js +2 -4
- package/dist/query/parser/ArrowToExpression.js.map +1 -1
- package/dist/query/parser/Restructure.js +4 -1
- package/dist/query/parser/Restructure.js.map +1 -1
- package/dist/tests/TestConfig.js +0 -2
- package/dist/tests/TestConfig.js.map +1 -1
- package/dist/tests/eternity/child-tests.js +8 -14
- package/dist/tests/eternity/child-tests.js.map +1 -1
- package/dist/tests/eternity/eternity-tests.js +8 -14
- package/dist/tests/eternity/eternity-tests.js.map +1 -1
- package/dist/tests/eternity/external-event-tests.js +5 -14
- package/dist/tests/eternity/external-event-tests.js.map +1 -1
- package/dist/tests/model/ShoppingContext.js +15 -90
- package/dist/tests/model/ShoppingContext.js.map +1 -1
- package/dist/tests/model/UseFile.js +1 -13
- package/dist/tests/model/UseFile.js.map +1 -1
- package/dist/tests/security/events/OrderEvents.js +1 -11
- package/dist/tests/security/events/OrderEvents.js.map +1 -1
- package/dist/tests/security/events/ProductEvents.js +1 -12
- package/dist/tests/security/events/ProductEvents.js.map +1 -1
- package/dist/tests/security/events/UserEvents.js +1 -10
- package/dist/tests/security/events/UserEvents.js.map +1 -1
- package/dist/tests/security/events/UserInfo.js +1 -8
- package/dist/tests/security/events/UserInfo.js.map +1 -1
- package/dist/tests/security/tests/place-order.d.ts.map +1 -1
- package/dist/tests/security/tests/place-order.js +28 -12
- package/dist/tests/security/tests/place-order.js.map +1 -1
- package/dist/tests/security/tests/test-events.d.ts.map +1 -1
- package/dist/tests/security/tests/test-events.js +11 -5
- package/dist/tests/security/tests/test-events.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/DateTime.js +0 -37
- package/dist/types/DateTime.js.map +1 -1
- package/dist/types/TimeSpan.js +0 -1
- package/dist/types/TimeSpan.js.map +1 -1
- package/package.json +5 -4
- package/src/common/EventSet.ts +3 -0
- package/src/common/IDisposable.ts +0 -8
- package/src/common/Logger.ts +3 -3
- package/src/common/ObjectPool.ts +1 -0
- package/src/common/usingAsync.ts +7 -1
- package/src/drivers/base/BaseDriver.ts +38 -12
- package/src/drivers/postgres/PostgreSqlDriver.ts +8 -4
- package/src/drivers/sql-server/SqlServerDriver.ts +10 -29
- package/src/eternity/EternityContext.ts +51 -56
- package/src/model/EntityQuery.ts +4 -10
- package/src/model/verification/VerificationSession.ts +5 -9
- package/src/query/ast/ExpressionToSql.ts +0 -2
- package/src/tests/security/tests/place-order.ts +83 -92
- package/src/tests/security/tests/test-events.ts +31 -35
- 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
|
package/src/common/Logger.ts
CHANGED
|
@@ -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);
|
package/src/common/ObjectPool.ts
CHANGED
package/src/common/usingAsync.ts
CHANGED
|
@@ -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
|
|
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
|
|
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<
|
|
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:
|
|
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<
|
|
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:
|
|
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?.
|
|
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<
|
|
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,
|
|
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<
|
|
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
|
-
[
|
|
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
|
-
|
|
331
|
+
using scope = ServiceProvider.from(this).createScope();
|
|
332
332
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
this.log(`Run workflow ${workflow.id} -----------------------------------`);
|
|
333
|
+
this.log(`Run workflow ${workflow.id} -----------------------------------`);
|
|
336
334
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
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
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
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
|
}
|
package/src/model/EntityQuery.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import EntityAccessError from "../common/EntityAccessError.js";
|
|
2
2
|
import Logger from "../common/Logger.js";
|
|
3
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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";
|