Skip to content

Commit 619a504

Browse files
committed
update utils
1 parent 568dffe commit 619a504

File tree

7 files changed

+2365
-1
lines changed

7 files changed

+2365
-1
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@heyanon/sdk",
3-
"version": "2.4.0",
3+
"version": "2.4.1",
44
"license": "MIT",
55
"main": "dist/index.js",
66
"typings": "dist/index.d.ts",

src/utils/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,6 @@ export * from './stringify';
44
export * from './is-address';
55
export * from './get-timestamp';
66
export * from './normalize-address';
7+
export * from './messages-releaser';
8+
export * from './try-steps-executor';
9+
export * from './workflow-retry';
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import { describe, expect, it } from 'vitest';
2+
3+
import { MessagesReleaser } from './messages-releaser';
4+
5+
describe('MessagesReleaser', () => {
6+
it('should initialize with default separator', () => {
7+
const releaser = new MessagesReleaser();
8+
expect(releaser.separator).toBe('\n');
9+
});
10+
11+
it('should initialize with custom separator', () => {
12+
const releaser = new MessagesReleaser({ separator: ' ' });
13+
expect(releaser.separator).toBe(' ');
14+
});
15+
16+
it('should add messages and release them with default separator', () => {
17+
const releaser = new MessagesReleaser();
18+
releaser.add('Message 1');
19+
releaser.add('Message 2');
20+
const result = releaser.release();
21+
expect(result).toBe('\nMessage 1\nMessage 2');
22+
});
23+
24+
it('should add messages and release them with custom separator', () => {
25+
const releaser = new MessagesReleaser({ separator: ' ' });
26+
releaser.add('Message 1');
27+
releaser.add('Message 2');
28+
const result = releaser.release();
29+
expect(result).toBe(' Message 1 Message 2');
30+
});
31+
32+
it('should release messages and reset the internal state', () => {
33+
const releaser = new MessagesReleaser();
34+
releaser.add('Message 1');
35+
releaser.add('Message 2');
36+
releaser.release();
37+
const result = releaser.release();
38+
expect(result).toBe('');
39+
});
40+
41+
it('should add a last message during release', () => {
42+
const releaser = new MessagesReleaser();
43+
releaser.add('Message 1');
44+
const result = releaser.release('Message 2');
45+
expect(result).toBe('\nMessage 1\nMessage 2');
46+
});
47+
48+
it('should reset messages after release', () => {
49+
const releaser = new MessagesReleaser();
50+
releaser.add('Message 1');
51+
releaser.release();
52+
expect(releaser.messages).toEqual([]);
53+
});
54+
55+
it('should add multiple messages at once', () => {
56+
const releaser = new MessagesReleaser();
57+
releaser.add('Message 1', 'Message 2', 'Message 3');
58+
expect(releaser.messages).toEqual(['Message 1', 'Message 2', 'Message 3']);
59+
});
60+
});

src/utils/messages-releaser.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
export type MessagesReleaserOptions = {
2+
separator?: string;
3+
};
4+
5+
export class MessagesReleaser {
6+
private _messages: string[] = [];
7+
private _separator = '\n';
8+
9+
constructor(opts: MessagesReleaserOptions = {}) {
10+
if (opts?.separator) {
11+
this._separator = opts.separator;
12+
}
13+
}
14+
15+
public get separator(): string {
16+
return this._separator;
17+
}
18+
19+
public get messages(): string[] {
20+
return this._messages;
21+
}
22+
23+
public release(lastMessage?: string): string {
24+
if (lastMessage) {
25+
this.add(lastMessage);
26+
}
27+
const message: string = this._messages.length > 0 ? this._separator.concat(this._messages.join(this._separator)) : '';
28+
this.reset();
29+
return message;
30+
}
31+
32+
public add(...msgs: string[]): void {
33+
this._messages.push(...msgs);
34+
}
35+
36+
private reset(): void {
37+
this._messages = [];
38+
}
39+
}

src/utils/try-steps-executor.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { MessagesReleaser } from './messages-releaser';
2+
3+
export type ExecuteFn<T> = () => Promise<T>;
4+
export type OnSuccessFn = () => Promise<void>;
5+
export type OnFailureFn = (message: string) => Promise<void>;
6+
7+
export type StepOpts<R> = {
8+
executeFn: ExecuteFn<R>;
9+
onSuccessMessage: string;
10+
onFailureFn: OnFailureFn;
11+
};
12+
13+
export class TryStepsExecutor {
14+
private msgsReleaser: MessagesReleaser;
15+
private onFailureFn: OnFailureFn;
16+
17+
constructor(initialReleaser: MessagesReleaser, initialOnFailureFn: OnFailureFn) {
18+
this.msgsReleaser = initialReleaser || new MessagesReleaser();
19+
this.onFailureFn = initialOnFailureFn;
20+
}
21+
22+
public async executeStep<ER, FR>(executeFn: ExecuteFn<ER>, onSuccessMessage: string, onFailureMessage: string): Promise<ER | FR> {
23+
try {
24+
const result: ER = await executeFn();
25+
this.msgsReleaser.add(onSuccessMessage);
26+
return result;
27+
} catch (error) {
28+
await this.onFailureFn(onFailureMessage);
29+
throw error;
30+
}
31+
}
32+
}

0 commit comments

Comments
 (0)