mashroom-graphql-plugin
v1.1.0
Published
Plugin adding GraphQL functionality for Mashroom Server (mashroom-server.com)
Downloads
2
Readme
Mashroom GraphQL Plugin Loader
This plugin adds possibility to define GraphQL services in Mashroom.
Additionally - it bootstraps Apollo Server using Mashroom internal express application. Subscriptions are supported over Web Sockets.
Installation
npm i -S mashroom-graphql-server
Schema stitching
You can have multiple GraphQL Plugins registered on your server. Schemas from different plugins are stitched together as described here schema stitching
Example
To start demo server run
npm i npm run dev
and open localhost:5050/graphql in your browser
You can subscribe to change using
subscription Subscription {
personCreated {
id
}
}
and produce new object running this query
query Test($createPersonId: ID!) {
createPerson(id: $createPersonId) {
id
}
}
after 1500ms delay you should see activity in subscription window
Writing GraphQL Plugins for Mashroom Server
Plugin has to have definition like the example bellow
{
"name": "Mashroom GraphQL Echo Plugin",
"type": "mashroom-graphql-plugin",
"bootstrap": "./dist/bootstrap.js",
"defaultConfig": {
"pubSub": "memory"
}
}
Configuration:
- pubSub - type of pubSub engine: memory or redis. memory does not support cluster environment
Where bootstrap has one default export of the type MashroomGraphQLPluginBootstrapFunction
const bootstrap: MashroomGraphQLPluginBootstrapFunction = (pluginName, config, contextHolder, pubSub) => {
return Promise.resolve(new TestGraphQLPlugin(pubSub));
}
Bootstrap Parameters:
- pluginName - name of the plugin itself
- config - config provided for the plugin
- contextHolder - holds current context of the plugin
- pubSub - reference to pubSub engine used for subscriptions
Mashroom GraphQL Plugin has to implement following interface
interface MashroomGraphQLPlugin {
getSchema(): DocumentNode | Array<DocumentNode> | string | Array<string>;
getResolvers(): IResolvers | Array<IResolvers>;
getPubSub(): PubSubEngine;
}
- getSchema - returns schema for current plugin
- getResolvers - resolvers for given schema
- getPubSub - returns reference to current pubSub engine
Example:
getSchema(): DocumentNode | Array<DocumentNode> | string | Array<string> {
return gql`
type Person {
id: ID!
}
type Query {
personByName(id: ID!): Person
createPerson(id: ID!): Person
}
type Subscription {
personCreated: Person
}
`;
}
getResolvers(): IResolvers | Array<IResolvers> {
return {
Query: {
personByName: (parent, args) => {
return {
id: args.id,
};
},
createPerson: (parent, args) => {
setTimeout(() => {
this.getPubSub().publish('PERSON_CREATED', {
personCreated: {
id: args.id,
},
});
}, 1500);
},
},
Subscription: {
personCreated: {
subscribe: () => this.getPubSub().asyncIterator(['PERSON_CREATED']),
},
},
}
}