diff --git a/packages/js-threads/packages/client/src/index.spec.ts b/packages/js-threads/packages/client/src/index.spec.ts index 9f047d0e5..b1281a308 100644 --- a/packages/js-threads/packages/client/src/index.spec.ts +++ b/packages/js-threads/packages/client/src/index.spec.ts @@ -4,6 +4,7 @@ import { Identity, Libp2pCryptoIdentity } from '@textile/threads-core' import { expect } from 'chai' +import { Provider } from '@textile/context' import { Where, ReadTransaction, WriteTransaction } from './models' import { Client, ThreadID } from './index' @@ -55,7 +56,7 @@ describe('Client', function () { let dbKey: string let dbAddr: string let identity: Identity - const client = new Client() + const client = new Client(new Provider('http://127.0.0.1:6007')) before(async () => { identity = await Libp2pCryptoIdentity.fromRandom() @@ -308,7 +309,7 @@ describe('Client', function () { describe('Restart', () => { it('Should handle a whole new "restart" of the client', async () => { - const newClient = new Client() + const newClient = new Client(new Provider('http://127.0.0.1:6007')) const person = createPerson() await newClient.getToken(identity) const created = await newClient.create(dbID, 'Person', [person]) diff --git a/packages/js-threads/packages/client/src/index.ts b/packages/js-threads/packages/client/src/index.ts index aca77dbed..f691a1242 100644 --- a/packages/js-threads/packages/client/src/index.ts +++ b/packages/js-threads/packages/client/src/index.ts @@ -10,7 +10,7 @@ import nextTick from 'next-tick' import { Identity, Libp2pCryptoIdentity } from '@textile/threads-core' import { Multiaddr } from '@textile/multiaddr' import { ThreadID } from '@textile/threads-id' -import { Context } from '@textile/context' +import { Context, Provider } from '@textile/context' import { encode, decode } from 'bs58' import { QueryJSON, @@ -37,7 +37,7 @@ export class Client { * Creates a new gRPC client instance for accessing the Textile Threads API. * @param context The context to use for interacting with the APIs. Can be modified later. */ - constructor(public context: Context = new Context('http://127.0.0.1:6007')) { + constructor(public context: Context = new Provider()) { this.serviceHost = context.host this.rpcOptions = { transport: context.transport, diff --git a/packages/js-threads/packages/context/src/index.spec.ts b/packages/js-threads/packages/context/src/index.spec.ts index 810e8bd29..38b0272b9 100644 --- a/packages/js-threads/packages/context/src/index.spec.ts +++ b/packages/js-threads/packages/context/src/index.spec.ts @@ -1,9 +1,9 @@ import { expect } from 'chai' -import { Context, expirationError } from './index' +import { Provider, Context, expirationError } from './index' describe('Context', () => { it('should throw an exception when working with an expired msg', async () => { - const context = new Context() + const context: Context = new Provider() try { context.withAPISig({ sig: 'fake', diff --git a/packages/js-threads/packages/context/src/index.ts b/packages/js-threads/packages/context/src/index.ts index 9af4d1e73..9608b64fc 100644 --- a/packages/js-threads/packages/context/src/index.ts +++ b/packages/js-threads/packages/context/src/index.ts @@ -92,10 +92,29 @@ export interface ContextKeys { [key: string]: any } +export interface Context { + host: HostString + debug: boolean + transport: grpc.TransportFactory + withSession(value?: string): Context + withThread(value?: ThreadID): Context + withThreadName(value?: string): Context + withOrg(value?: string): Context + withToken(value?: string): Context + withAPIKey(value?: string): Context + withAPISig(value?: { sig: string; msg: string }): Context + withContext(value?: Context): Context + toJSON(): any + toMetadata(): grpc.Metadata + withUserKey(key?: KeyInfo, date?: Date): Promise + set(key: keyof ContextKeys, value?: any): Context + get(key: keyof ContextKeys): any +} + /** - * Context provides context management for gRPC credentials and config settings. + * Provider provides context management for gRPC credentials and config settings. */ -export class Context { +export class Provider implements Context { // Internal context variables private _context: Partial> = {} @@ -208,7 +227,7 @@ export class Context { newContext['host'] = host newContext['transport'] = transport newContext['debug'] = debug - const ctx = new Context() + const ctx = new Provider() ctx._context = newContext return ctx } diff --git a/packages/js-threads/packages/database/src/db.spec.ts b/packages/js-threads/packages/database/src/db.spec.ts index 10131fefd..57c334afa 100644 --- a/packages/js-threads/packages/database/src/db.spec.ts +++ b/packages/js-threads/packages/database/src/db.spec.ts @@ -10,7 +10,7 @@ import delay from 'delay' import { isBrowser } from 'browser-or-node' import { Key } from 'interface-datastore' import { DomainDatastore, Dispatcher, Update, Op } from '@textile/threads-store' -import { Network, Client } from '@textile/threads-network' +import { Network, Client, Provider } from '@textile/threads-network' import { MemoryDatastore } from 'interface-datastore' import { Database, mismatchError } from './db' import { EventBus } from './eventbus' @@ -142,7 +142,7 @@ describe('Database', () => { // have the same state of dummy. const info = await d1.network.getThread(id1) const datastore = new MemoryDatastore() - const client = new Client({ host: 'http://127.0.0.1:6207' }) + const client = new Client(new Provider('http://127.0.0.1:6207')) const network = new Network(new DomainDatastore(datastore, new Key('network')), client) const d2 = new Database(datastore, { network }) const ident2 = await Database.randomIdentity() diff --git a/packages/js-threads/packages/network-client/src/config.ts b/packages/js-threads/packages/network-client/src/config.ts deleted file mode 100644 index 1f1d1d4ab..000000000 --- a/packages/js-threads/packages/network-client/src/config.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { grpc } from '@improbable-eng/grpc-web' - -/** - * BaseConfig is a set of basic gRPC Proxy configuration options. - */ -export interface BaseConfig { - /** - * The local/remote host url. - */ - host?: string - /** - * The default transport to use when making web-gRPC calls. - */ - transport?: grpc.TransportFactory -} - -/** - * Config controls the remote API settings. - */ -export class Config { - /** - * The local/remote host url. - */ - public host: string - /** - * The default transport to use when making web-gRPC calls. - */ - public transport: grpc.TransportFactory - /** - * The active session token. - */ - public session?: string - - /** - * Create a new Config object. - * @param host The local/remote host url. Defaults to 'https:127.0.0.1:6007'. - * @param transport The default transport to use when making web-gRPC calls. Defaults to WebSockets. - */ - constructor(host?: string, transport?: grpc.TransportFactory) { - this.host = host || 'http://127.0.0.1:6007' - this.transport = transport || grpc.WebsocketTransport() - } - - _wrapMetadata(values?: { [key: string]: any }): { [key: string]: any } | undefined { - if (!this.session) { - return values - } - const response = values ?? {} - if ('Authorization' in response || 'authorization' in response) { - return response - } - response['Authorization'] = `Bearer ${this.session}` - return response - } - - _wrapBrowserHeaders(values: grpc.Metadata): grpc.Metadata { - if (!this.session) { - return values - } - values.set('Authorization', `Bearer ${this.session}`) - return values - } -} diff --git a/packages/js-threads/packages/network-client/src/index.spec.ts b/packages/js-threads/packages/network-client/src/index.spec.ts index c001273d0..9044b3064 100644 --- a/packages/js-threads/packages/network-client/src/index.spec.ts +++ b/packages/js-threads/packages/network-client/src/index.spec.ts @@ -15,7 +15,7 @@ import { Identity, Libp2pCryptoIdentity, } from '@textile/threads-core' -import { Context } from '@textile/context' +import { Provider } from '@textile/context' import { createEvent, createRecord } from '@textile/threads-encoding' import { Client } from '.' @@ -40,7 +40,7 @@ describe('Network Client...', () => { let token: string let identity: Identity before(async () => { - client = new Client(new Context(proxyAddr1)) + client = new Client(new Provider(proxyAddr1)) identity = await Libp2pCryptoIdentity.fromRandom() token = await client.getToken(identity) }) @@ -64,7 +64,7 @@ describe('Network Client...', () => { const info1 = await createThread(client) const hostAddr = new Multiaddr('/dns4/threads1/tcp/4006') const addr = threadAddr(hostAddr, hostID, info1) - const client2 = new Client(new Context(proxyAddr2)) + const client2 = new Client(new Provider(proxyAddr2)) // Create temporary identity const identity = await Libp2pCryptoIdentity.fromRandom() const token2 = await client2.getToken(identity) @@ -101,7 +101,7 @@ describe('Network Client...', () => { }) it('should add a replicator to a thread', async () => { - const client2 = new Client(new Context(proxyAddr2)) + const client2 = new Client(new Provider(proxyAddr2)) const hostID2 = await client2.getHostID() const hostAddr2 = new Multiaddr(`/dns4/threads2/tcp/4006`) @@ -176,7 +176,7 @@ describe('Network Client...', () => { before(async function () { this.timeout(5000) - client2 = new Client(new Context(proxyAddr2)) + client2 = new Client(new Provider(proxyAddr2)) const hostID2 = await client2.getHostID() const hostAddr2 = new Multiaddr(`/dns4/threads2/tcp/4006`) const peerAddr = hostAddr2.encapsulate(new Multiaddr(`/p2p/${hostID2}`)) diff --git a/packages/js-threads/packages/network-client/src/index.ts b/packages/js-threads/packages/network-client/src/index.ts index 699c9b425..3fdbc84f4 100644 --- a/packages/js-threads/packages/network-client/src/index.ts +++ b/packages/js-threads/packages/network-client/src/index.ts @@ -19,7 +19,7 @@ import { Identity, Libp2pCryptoIdentity, } from '@textile/threads-core' -import { Context, ContextKeys } from '@textile/context' +import { Context, ContextKeys, Provider } from '@textile/context' import * as pb from '@textile/threads-net-grpc/threadsnet_pb' import { API, APIGetToken } from '@textile/threads-net-grpc/threadsnet_pb_service' import { recordFromProto, recordToProto } from '@textile/threads-encoding' @@ -85,15 +85,11 @@ export class Client implements Network { */ public serviceHost: string public rpcOptions: grpc.RpcOptions - /** - * Client creates a new gRPC client instance. + * Creates a new gRPC client instance for accessing the Textile Threads API. * @param context The context to use for interacting with the APIs. Can be modified later. */ - constructor(public context: Context | ContextKeys = new Context('http://127.0.0.1:6007')) { - if (!(context instanceof Context)) { - this.context = Context.fromJSON(context) - } + constructor(public context: Context = new Provider('http://127.0.0.1:6007')) { this.serviceHost = context.host this.rpcOptions = { transport: context.transport, diff --git a/packages/js-threads/packages/network/src/index.ts b/packages/js-threads/packages/network/src/index.ts index 7b9e2a710..d6a545436 100644 --- a/packages/js-threads/packages/network/src/index.ts +++ b/packages/js-threads/packages/network/src/index.ts @@ -1,4 +1,4 @@ export * from './store' export * from './network' export { Client } from '@textile/threads-network-client' -export { Context } from '@textile/context' +export { Context, Provider } from '@textile/context' diff --git a/packages/js-threads/packages/network/src/network.spec.ts b/packages/js-threads/packages/network/src/network.spec.ts index 83ebffb22..c81cb35d4 100644 --- a/packages/js-threads/packages/network/src/network.spec.ts +++ b/packages/js-threads/packages/network/src/network.spec.ts @@ -17,7 +17,7 @@ import { Libp2pCryptoIdentity, } from '@textile/threads-core' import { createEvent, createRecord } from '@textile/threads-encoding' -import { Context } from '@textile/context' +import { Provider } from '@textile/context' import { Client } from '@textile/threads-network-client' import { MemoryDatastore } from 'interface-datastore' import { Network } from '.' @@ -42,7 +42,7 @@ describe('Network...', () => { let client: Network before(async () => { const identity = await Libp2pCryptoIdentity.fromRandom() - client = new Network(new MemoryDatastore(), new Client(new Context(proxyAddr1))) + client = new Network(new MemoryDatastore(), new Client(new Provider(proxyAddr1))) const token = await client.getToken(identity) expect(token).to.not.be.undefined }) @@ -66,7 +66,7 @@ describe('Network...', () => { const info1 = await createThread(client) const hostAddr = new Multiaddr('/dns4/threads1/tcp/4006') const addr = threadAddr(hostAddr, hostID, info1) - const client2 = new Client({ host: proxyAddr2 }) + const client2 = new Client(new Provider(proxyAddr2)) // Create temporary identity const identity = await Libp2pCryptoIdentity.fromRandom() await client2.getToken(identity) @@ -107,7 +107,7 @@ describe('Network...', () => { }) it('should add a replicator to a thread', async () => { - const client2 = new Client({ host: proxyAddr2 }) + const client2 = new Client(new Provider(proxyAddr2)) const hostID2 = await client2.getHostID() const hostAddr2 = new Multiaddr(`/dns4/threads2/tcp/4006`) @@ -182,7 +182,7 @@ describe('Network...', () => { let token2: string before(async () => { - client2 = new Network(new MemoryDatastore(), new Client({ host: proxyAddr2 })) + client2 = new Network(new MemoryDatastore(), new Client(new Provider(proxyAddr2))) const hostID2 = await client2.getHostID() const hostAddr2 = new Multiaddr(`/dns4/threads2/tcp/4006`) const peerAddr = hostAddr2.encapsulate(new Multiaddr(`/p2p/${hostID2}`))