-
Notifications
You must be signed in to change notification settings - Fork 44
/
SmartWeaveWebFactory.ts
87 lines (77 loc) · 3.19 KB
/
SmartWeaveWebFactory.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import Arweave from 'arweave';
import {
CacheableContractInteractionsLoader,
CacheableExecutorFactory,
CacheableStateEvaluator,
Evolve
} from '@smartweave/plugins';
import {
ContractDefinitionLoader,
ContractInteractionsLoader,
DefaultStateEvaluator,
EvalStateResult,
HandlerExecutorFactory,
LexicographicalInteractionsSorter,
SmartWeave,
SmartWeaveBuilder
} from '@smartweave/core';
import { MemBlockHeightSwCache, MemCache } from '@smartweave/cache';
/**
* A factory that simplifies the process of creating different versions of {@link SmartWeave}.
* All versions use the {@link Evolve} plugin.
* SmartWeave instances created by this factory can be safely used in a web environment.
*/
export class SmartWeaveWebFactory {
/**
* Returns a fully configured {@link SmartWeave} that is using mem cache for all layers.
*/
static memCached(arweave: Arweave): SmartWeave {
return this.memCachedBased(arweave).build();
}
/**
* Returns a preconfigured, memCached {@link SmartWeaveBuilder}, that allows for customization of the SmartWeave instance.
* Use {@link SmartWeaveBuilder.build()} to finish the configuration.
*/
static memCachedBased(arweave: Arweave): SmartWeaveBuilder {
const definitionLoader = new ContractDefinitionLoader(arweave, new MemCache());
const interactionsLoader = new CacheableContractInteractionsLoader(
new ContractInteractionsLoader(arweave),
new MemBlockHeightSwCache()
);
const executorFactory = new CacheableExecutorFactory(arweave, new HandlerExecutorFactory(arweave), new MemCache());
const stateEvaluator = new CacheableStateEvaluator(arweave, new MemBlockHeightSwCache<EvalStateResult<unknown>>(), [
new Evolve(definitionLoader, executorFactory)
]);
const interactionsSorter = new LexicographicalInteractionsSorter(arweave);
return SmartWeave.builder(arweave)
.setDefinitionLoader(definitionLoader)
.setInteractionsLoader(interactionsLoader)
.setInteractionsSorter(interactionsSorter)
.setExecutorFactory(executorFactory)
.setStateEvaluator(stateEvaluator);
}
/**
* Returns a fully configured, nonCached {@link SmartWeave}.
*/
static nonCached(arweave: Arweave): SmartWeave {
return this.nonCachedBased(arweave).build();
}
/**
* Returns a preconfigured {@link SmartWeave} that (yup, you've guessed it!) does not use any caches.
* This one is gonna be slooow!
* Use {@link SmartWeaveBuilder.build()} to finish the configuration.
*/
static nonCachedBased(arweave: Arweave): SmartWeaveBuilder {
const definitionLoader = new ContractDefinitionLoader(arweave);
const interactionsLoader = new ContractInteractionsLoader(arweave);
const executorFactory = new HandlerExecutorFactory(arweave);
const stateEvaluator = new DefaultStateEvaluator(arweave, [new Evolve(definitionLoader, executorFactory)]);
const interactionsSorter = new LexicographicalInteractionsSorter(arweave);
return SmartWeave.builder(arweave)
.setDefinitionLoader(definitionLoader)
.setInteractionsLoader(interactionsLoader)
.setInteractionsSorter(interactionsSorter)
.setExecutorFactory(executorFactory)
.setStateEvaluator(stateEvaluator);
}
}