Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 3 additions & 11 deletions packages/api/src/graphql/GraphqlSequencerModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import {
Configurable,
log,
ModuleContainer,
ModulesConfig,
ModulesRecord,
TypedClass,
} from "@proto-kit/common";
Expand All @@ -22,20 +21,13 @@ export type GraphqlModulesRecord = ModulesRecord<
TypedClass<GraphqlModule<unknown>>
>;

export interface GraphqlModulesDefintion<
GraphQLModules extends GraphqlModulesRecord,
> {
modules: GraphQLModules;
config?: ModulesConfig<GraphQLModules>;
}

@closeable()
export class GraphqlSequencerModule<GraphQLModules extends GraphqlModulesRecord>
extends ModuleContainer<GraphQLModules>
implements Configurable<unknown>, SequencerModule<unknown>, Closeable
{
public static from<GraphQLModules extends GraphqlModulesRecord>(
definition: GraphqlModulesDefintion<GraphQLModules>
definition: GraphQLModules
): TypedClass<GraphqlSequencerModule<GraphQLModules>> {
return class ScopedGraphQlContainer extends GraphqlSequencerModule<GraphQLModules> {
public constructor() {
Expand All @@ -58,8 +50,8 @@ export class GraphqlSequencerModule<GraphQLModules extends GraphqlModulesRecord>
this.graphqlServer.setContainer(this.container);

// eslint-disable-next-line guard-for-in
for (const moduleName in this.definition.modules) {
const moduleClass = this.definition.modules[moduleName];
for (const moduleName in this.definition) {
const moduleClass = this.definition[moduleName];

if (
Object.prototype.isPrototypeOf.call(
Expand Down
2 changes: 1 addition & 1 deletion packages/api/src/graphql/modules/QueryGraphqlModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,7 @@ export class QueryGraphqlModule<
): ObjMap<GraphQLFieldConfig<unknown, unknown>> {
const types: ObjMap<GraphQLFieldConfig<unknown, unknown>> = {};

for (const key in container.definition.modules) {
for (const key in container.definition) {
const query = containerQuery[key];

const moduleTypes: ObjMap<GraphQLFieldConfig<unknown, unknown>> = {};
Expand Down
35 changes: 15 additions & 20 deletions packages/common/src/config/ModuleContainer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,18 +109,6 @@ export type RecursivePartial<T> = {
[Key in keyof T]?: Partial<T[Key]>;
};

/**
* Parameters required when creating a module container instance
*/
export interface ModuleContainerDefinition<Modules extends ModulesRecord> {
modules: Modules;
// config is optional, as it may be provided by the parent/wrapper class
/**
* @deprecated
*/
config?: ModulesConfig<Modules>;
}

// Removes all keys with a "never" value from an object
export type FilterNeverValues<Type extends Record<string, unknown>> = {
[Key in keyof Type as Type[Key] extends never ? never : Key]: Type[Key];
Expand Down Expand Up @@ -156,15 +144,15 @@ export class ModuleContainer<

private eventEmitterProxy: EventEmitterProxy<Modules> | undefined = undefined;

public constructor(public definition: ModuleContainerDefinition<Modules>) {
public constructor(public definition: Modules) {
super();
}

/**
* @returns list of module names
*/
public get moduleNames() {
return Object.keys(this.definition.modules);
return Object.keys(this.definition);
}

/**
Expand Down Expand Up @@ -209,7 +197,7 @@ export class ModuleContainer<
public assertIsValidModuleName(
moduleName: string
): asserts moduleName is StringKeyOf<Modules> {
if (!this.isValidModuleName(this.definition.modules, moduleName)) {
if (!this.isValidModuleName(this.definition, moduleName)) {
throw errors.onlyValidModuleNames(moduleName);
}
}
Expand Down Expand Up @@ -339,13 +327,20 @@ export class ModuleContainer<

public resolveOrFail<ModuleType>(
moduleName: string,
moduleType: TypedClass<ModuleType>
moduleType?: TypedClass<ModuleType>
) {
if (!this.container.isRegistered(moduleName)) {
throw new Error(`Dependency with token ${moduleName} not registered`);
}

const instance = this.container.resolve<ModuleType>(moduleName);
const isValidModuleInstance = instance instanceof moduleType;

if (!isValidModuleInstance) {
throw errors.validModuleInstance(moduleName, moduleType.name);
if (moduleType !== undefined) {
const isValidModuleInstance = instance instanceof moduleType;

if (!isValidModuleInstance) {
throw errors.validModuleInstance(moduleName, moduleType.name);
}
}

return instance;
Expand Down Expand Up @@ -491,6 +486,6 @@ export class ModuleContainer<
});

// register all provided modules when the container is created
this.registerModules(this.definition.modules);
this.registerModules(this.definition);
}
}
3 changes: 3 additions & 0 deletions packages/common/src/config/Startable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export interface Startable {
start(): Promise<void>;
}
4 changes: 1 addition & 3 deletions packages/common/src/events/EventEmitterProxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,7 @@ export class EventEmitterProxy<
public constructor(private readonly container: ModuleContainer<Modules>) {
super();
container.moduleNames.forEach((moduleName) => {
if (
container.isValidModuleName(container.definition.modules, moduleName)
) {
if (container.isValidModuleName(container.definition, moduleName)) {
const module = container.resolve(moduleName);
if (this.isEventEmitter(module)) {
module.events.onAll((events: any, args: any[]) => {
Expand Down
1 change: 1 addition & 0 deletions packages/common/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export * from "./config/ConfigurableModule";
export * from "./config/ChildContainerProvider";
export * from "./config/ChildContainerCreatable";
export * from "./config/injectAlias";
export * from "./config/Startable";
export * from "./types";
export * from "./zkProgrammable/ZkProgrammable";
export * from "./zkProgrammable/ProvableMethodExecutionContext";
Expand Down
6 changes: 2 additions & 4 deletions packages/common/test/config/ContainerEvents.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,8 @@ describe("test event propagation", () => {
expect.assertions(1);

const container = new TestContainer({
modules: {
test: TestModule,
test2: TestModule2,
},
test: TestModule,
test2: TestModule2,
});

container.configure({
Expand Down
10 changes: 4 additions & 6 deletions packages/common/test/config/ModuleContainer.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,12 +84,10 @@ describe("moduleContainer", () => {

beforeEach(() => {
container = new TestModuleContainer({
modules: {
TestModule,
OtherTestModule,
// this module would not be assignable to TestModuleContainer
// WrongTestModule,
},
TestModule,
OtherTestModule,
// this module would not be assignable to TestModuleContainer
// WrongTestModule,
});
});

Expand Down
10 changes: 3 additions & 7 deletions packages/deployment/src/environment/Environment.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { log, assertValidTextLogLevel } from "@proto-kit/common";
import { AppChain } from "@proto-kit/sdk";
import { log, assertValidTextLogLevel, Startable } from "@proto-kit/common";
import { AppChain } from "@proto-kit/sequencer";
import yargs from "yargs";
import { hideBin } from "yargs/helpers";

export interface Startable {
start(): Promise<void>;
}

export type StartableEnvironment<T> = Record<string, T>;

export class Environment<T extends Startable> {
Expand Down Expand Up @@ -75,7 +71,7 @@ export class Environment<T extends Startable> {

// TODO Temporary workaround
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
(appChain as unknown as AppChain<any, any, any, any>).configurePartial({
(appChain as unknown as AppChain<any>).configurePartial({
Sequencer: {
DatabasePruneModule: {
pruneOnStartup: prune,
Expand Down
9 changes: 2 additions & 7 deletions packages/indexer/src/Indexer.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
import {
ModuleContainer,
ModuleContainerDefinition,
ModulesRecord,
TypedClass,
} from "@proto-kit/common";
import { ModuleContainer, ModulesRecord, TypedClass } from "@proto-kit/common";
import { container } from "tsyringe";

import { IndexerModule } from "./IndexerModule";
Expand All @@ -16,7 +11,7 @@ export class Indexer<
Modules extends IndexerModulesRecord,
> extends ModuleContainer<Modules> {
public static from<Modules extends IndexerModulesRecord>(
definition: ModuleContainerDefinition<Modules>
definition: Modules
): Indexer<Modules> {
return new Indexer(definition);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,10 @@ class MockedGeneratedResolverFactoryGraphqlModule extends GeneratedResolverFacto

describe("GeneratedResolverFactoryGraphqlModule", () => {
const indexer = Indexer.from({
modules: {
GraphqlServer: GraphqlServer,
Graphql: GraphqlSequencerModule.from({
modules: {
GeneratedResolverFactory: MockedGeneratedResolverFactoryGraphqlModule,
},
}),
},
GraphqlServer: GraphqlServer,
Graphql: GraphqlSequencerModule.from({
GeneratedResolverFactory: MockedGeneratedResolverFactoryGraphqlModule,
}),
});

indexer.configurePartial({
Expand Down
12 changes: 5 additions & 7 deletions packages/indexer/test/IndexBlockTask.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,11 @@ import { IndexBlockTask } from "../src/tasks/IndexBlockTask";

describe("IndexBlockTask", () => {
const indexer = Indexer.from({
modules: {
Database: InMemoryDatabase,
TaskQueue: LocalTaskQueue,
LocalTaskWorkerModule: LocalTaskWorkerModule.from({
IndexBlockTask: IndexBlockTask,
}),
},
Database: InMemoryDatabase,
TaskQueue: LocalTaskQueue,
LocalTaskWorkerModule: LocalTaskWorkerModule.from({
IndexBlockTask: IndexBlockTask,
}),
});

indexer.configurePartial({
Expand Down
32 changes: 14 additions & 18 deletions packages/indexer/test/IndexerNotifier.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,26 +49,22 @@ class TestBalances extends Balances {

function createAppChain() {
const appChain = new TestingAppChain({
Runtime: Runtime.from({
modules: VanillaRuntimeModules.with({
Runtime: Runtime.from(
VanillaRuntimeModules.with({
Balances: TestBalances,
}),
}),
Protocol: Protocol.from({
modules: VanillaProtocolModules.with({}),
}),
Sequencer: Sequencer.from({
modules: InMemorySequencerModules.with({
})
),
Protocol: Protocol.from(VanillaProtocolModules.with({})),
Sequencer: Sequencer.from(
InMemorySequencerModules.with({
IndexerNotifier: IndexerNotifier,
}),
}),

modules: {
Signer: InMemorySigner,
TransactionSender: InMemoryTransactionSender,
QueryTransportModule: StateServiceQueryModule,
NetworkStateTransportModule: BlockStorageNetworkStateModule,
},
})
),

Signer: InMemorySigner,
TransactionSender: InMemoryTransactionSender,
QueryTransportModule: StateServiceQueryModule,
NetworkStateTransportModule: BlockStorageNetworkStateModule,
});

appChain.configurePartial({
Expand Down
15 changes: 7 additions & 8 deletions packages/module/src/runtime/Runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,10 +103,7 @@ export class RuntimeZkProgrammable<

const runtimeMethods = runtime.runtimeModuleNames.reduce<Methods>(
(allMethods, runtimeModuleName) => {
runtime.isValidModuleName(
runtime.definition.modules,
runtimeModuleName
);
runtime.isValidModuleName(runtime.definition, runtimeModuleName);

/**
* Couldnt find a better way to circumvent the type assertion
Expand Down Expand Up @@ -272,7 +269,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
implements RuntimeEnvironment, CompilableModule
{
public static from<Modules extends RuntimeModulesRecord>(
definition: RuntimeDefinition<Modules>
definition: Modules
): TypedClass<Runtime<Modules>> {
return class RuntimeScoped extends Runtime<Modules> {
public constructor() {
Expand All @@ -284,7 +281,9 @@ export class Runtime<Modules extends RuntimeModulesRecord>
// runtime modules composed into a ZkProgram
public program?: ReturnType<typeof ZkProgram>;

public definition: RuntimeDefinition<Modules>;
// No idea why we have to do this, but if we don't re-define it here,
// js can't access it from the superclass somehow
public definition: Modules;

public zkProgrammable: ZkProgrammable<undefined, MethodPublicOutput>;

Expand All @@ -293,7 +292,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
*
* @param modules - Configuration object for the constructed Runtime
*/
public constructor(definition: RuntimeDefinition<Modules>) {
public constructor(definition: Modules) {
super(definition);
this.definition = definition;
this.zkProgrammable = new RuntimeZkProgrammable<Modules>(this);
Expand Down Expand Up @@ -378,7 +377,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
* @returns A list of names of all the registered module names
*/
public get runtimeModuleNames() {
return Object.keys(this.definition.modules);
return this.moduleNames;
}

public async compile(registry: CompileRegistry) {
Expand Down
4 changes: 1 addition & 3 deletions packages/module/test/TestingRuntime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ export function createTestingRuntime<Modules extends RuntimeModulesRecord>(
} {
const state = new InMemoryStateService();

const Runtimeclass = Runtime.from({
modules,
});
const Runtimeclass = Runtime.from(modules);
const runtime = new Runtimeclass();

runtime.configure(config);
Expand Down
Loading