Skip to content
This repository has been archived by the owner on Apr 17, 2023. It is now read-only.

feat: subscriptions refinements and comments #15

Closed
wants to merge 9 commits into from
Closed
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
38 changes: 8 additions & 30 deletions examples/authResolvers.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,19 @@
const fs = require('fs')
const path = require('path')
const express = require('express')
const session = require('express-session')
const Keycloak = require('keycloak-connect')
const { ApolloServer, gql } = require('apollo-server-express')
const { configureKeycloak } = require('./common')

const { KeycloakContext, KeycloakTypeDefs, auth, hasRole } = require('../')
const {
KeycloakContext,
KeycloakTypeDefs,
KeycloakSchemaDirectives
} = require('../')

const app = express()

const memoryStore = new session.MemoryStore()

const graphqlPath = '/graphql'


app.use(session({
secret: process.env.SESSION_SECRET_STRING || 'this should be a long secret',
resave: false,
saveUninitialized: true,
store: memoryStore
}))

const keycloakConfig = JSON.parse(fs.readFileSync(path.resolve(__dirname, './config/keycloak.json')))

const keycloak = new Keycloak({
store: memoryStore
}, keycloakConfig)

// Install general keycloak middleware
app.use(keycloak.middleware({
admin: graphqlPath
}))

// Protect the main route for all graphql services
// Disable unauthenticated access
app.use(graphqlPath, keycloak.middleware())
// perform the standard keycloak-connect middleware setup on our app
configureKeycloak(app, graphqlPath)

const typeDefs = gql`
type Query {
Expand Down Expand Up @@ -62,7 +41,6 @@ const resolvers = {
}
}

// Initialize the voyager server with our schema and context
const options ={
typeDefs: [KeycloakTypeDefs, typeDefs],
resolvers,
Expand Down
40 changes: 8 additions & 32 deletions examples/basic.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,19 @@
const fs = require('fs')
const path = require('path')
const express = require('express')
const session = require('express-session')
const Keycloak = require('keycloak-connect')

const { KeycloakContext, KeycloakTypeDefs, KeycloakSchemaDirectives } = require('../')

const { ApolloServer, gql } = require('apollo-server-express')
const { configureKeycloak } = require('./common')

const keycloakConfig = JSON.parse(fs.readFileSync(path.resolve(__dirname, './config/keycloak.json')))
const {
KeycloakContext,
KeycloakTypeDefs,
KeycloakSchemaDirectives
} = require('../')

const app = express()

const memoryStore = new session.MemoryStore()

const graphqlPath = '/graphql'


app.use(session({
secret: process.env.SESSION_SECRET_STRING || 'this should be a long secret',
resave: false,
saveUninitialized: true,
store: memoryStore
}))

const keycloak = new Keycloak({
store: memoryStore
}, keycloakConfig)

// Install general keycloak middleware
app.use(keycloak.middleware({
admin: graphqlPath
}))

// Protect the main route for all graphql services
// Disable unauthenticated access
app.use(graphqlPath, keycloak.protect())
// perform the standard keycloak-connect middleware setup on our app
configureKeycloak(app, graphqlPath)

const typeDefs = gql`
type Query {
Expand All @@ -56,8 +34,6 @@ const resolvers = {
}
}

// Initialize the voyager server with our schema and context

const server = new ApolloServer({
typeDefs: [KeycloakTypeDefs, typeDefs],
schemaDirectives: KeycloakSchemaDirectives,
Expand Down
37 changes: 37 additions & 0 deletions examples/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
const fs = require('fs')
const path = require('path')
const session = require('express-session')
const Keycloak = require('keycloak-connect')

function configureKeycloak(app, graphqlPath) {

const keycloakConfig = JSON.parse(fs.readFileSync(path.resolve(__dirname, './config/keycloak.json')))

const memoryStore = new session.MemoryStore()

app.use(session({
secret: process.env.SESSION_SECRET_STRING || 'this should be a long secret',
resave: false,
saveUninitialized: true,
store: memoryStore
}))

const keycloak = new Keycloak({
store: memoryStore
}, keycloakConfig)

// Install general keycloak middleware
app.use(keycloak.middleware({
admin: graphqlPath
}))

// Protect the main route for all graphql services
// Disable unauthenticated access
app.use(graphqlPath, keycloak.middleware())

return { keycloak }
}

module.exports = {
configureKeycloak
}
38 changes: 8 additions & 30 deletions examples/private_and_public.js
Original file line number Diff line number Diff line change
@@ -1,40 +1,19 @@
const fs = require('fs')
const path = require('path')
const express = require('express')
const session = require('express-session')
const Keycloak = require('keycloak-connect')
const { ApolloServer, gql } = require('apollo-server-express')
const { configureKeycloak } = require('./common')

const { KeycloakContext, KeycloakTypeDefs, KeycloakSchemaDirectives } = require('../')
const {
KeycloakContext,
KeycloakTypeDefs,
KeycloakSchemaDirectives
} = require('../')

const app = express()

const memoryStore = new session.MemoryStore()

const graphqlPath = '/graphql'


app.use(session({
secret: process.env.SESSION_SECRET_STRING || 'this should be a long secret',
resave: false,
saveUninitialized: true,
store: memoryStore
}))

const keycloakConfig = JSON.parse(fs.readFileSync(path.resolve(__dirname, './config/keycloak.json')))

const keycloak = new Keycloak({
store: memoryStore
}, keycloakConfig)

// Install general keycloak middleware
app.use(keycloak.middleware({
admin: graphqlPath
}))

// Protect the main route for all graphql services
// Disable unauthenticated access
app.use(graphqlPath, keycloak.middleware())
// perform the standard keycloak-connect middleware setup on our app
configureKeycloak(app, graphqlPath)

const typeDefs = gql`
type Query {
Expand Down Expand Up @@ -62,7 +41,6 @@ const resolvers = {
}
}

// Initialize the voyager server with our schema and context
const options ={
typeDefs: [KeycloakTypeDefs, typeDefs],
schemaDirectives: KeycloakSchemaDirectives,
Expand Down
93 changes: 93 additions & 0 deletions examples/subscriptions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
const express = require('express')
const { PubSub } = require('graphql-subscriptions')
const { execute, subscribe } = require('graphql')
const { SubscriptionServer } = require('subscriptions-transport-ws')

const { ApolloServer, gql } = require('apollo-server-express')

const { configureKeycloak } = require('./common')

const {
KeycloakContext,
KeycloakSubscriptionContext,
KeycloakTypeDefs,
KeycloakSchemaDirectives,
KeycloakSubscriptionHandler
} = require('../')


const app = express()

const graphqlPath = '/graphql'

// perform the standard keycloak-connect middleware setup on our app
// return the initialized keycloak object
const { keycloak } = configureKeycloak(app, graphqlPath)

const pubsub = new PubSub()

// set up the pubsub to publish a message every 2 seconds
const TOPIC = 'HELLO'
setInterval(() => {
pubsub.publish(TOPIC, { testSubscription: `tesing... ${Date.now()}`})
}, 2000)

const typeDefs = gql`
type Query {
hello: String!
}

type Subscription {
testSubscription: String!
}
`

const resolvers = {
Query: {
hello: (obj, args, context, info) => {
return `Hello world`
}
},
Subscription: {
testSubscription: {
subscribe: () => pubsub.asyncIterator(TOPIC)
}
}
}

const server = new ApolloServer({
typeDefs: [KeycloakTypeDefs, typeDefs],
schemaDirectives: KeycloakSchemaDirectives,
resolvers,
context: ({ req }) => {
return {
kauth: new KeycloakContext({ req })
}
}
})

server.applyMiddleware({ app })

const port = 4000

const httpServer = app.listen({ port }, () => {
console.log(`🚀 Server ready at http://localhost:${port}${server.graphqlPath}`)

// Initialize the keycloak subscription handler passing in our keycloak instance
const keycloakSubscriptionHandler = new KeycloakSubscriptionHandler({ keycloak })
new SubscriptionServer({
execute,
subscribe,
schema: server.schema,
onConnect: async (connectionParams, websocket, connectionContext) => {
const token = await keycloakSubscriptionHandler.onSubscriptionConnect(connectionParams)
return {
kauth: new KeycloakSubscriptionContext(token)
}
}
}, {
server: httpServer,
path: graphqlPath
})
})

Loading