@solana/rpc-graphql 2.0.0-experimental.5586a1b → 2.0.0-experimental.eb5fd16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,9 +4,45 @@ var graphql = require('graphql');
4
4
 
5
5
  // src/rpc.ts
6
6
 
7
+ // src/cache.ts
8
+ var stringifyValue = (value) => JSON.stringify(value, (_, value2) => {
9
+ if (typeof value2 === "bigint") {
10
+ return value2.toString() + "n";
11
+ }
12
+ return value2;
13
+ });
14
+ var parseValue = (value) => JSON.parse(value, (_, value2) => {
15
+ if (typeof value2 === "string" && /\d+n$/.test(value2)) {
16
+ return BigInt(value2.slice(0, -1));
17
+ }
18
+ return value2;
19
+ });
20
+ var cacheKey = (key, variables) => `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;
21
+ function createGraphQLCache() {
22
+ return {
23
+ // Browser
24
+ flush: () => {
25
+ for (let i = localStorage.length - 1; i >= 0; i--) {
26
+ const storageKey = localStorage.key(i);
27
+ if (storageKey && storageKey.startsWith("GraphQLCache:")) {
28
+ localStorage.removeItem(storageKey);
29
+ }
30
+ }
31
+ },
32
+ get: (key, variables) => {
33
+ const value = localStorage.getItem(cacheKey(key, variables));
34
+ return value === null ? null : parseValue(value);
35
+ },
36
+ insert: (key, variables, value) => {
37
+ localStorage.setItem(cacheKey(key, variables), stringifyValue(value));
38
+ }
39
+ } ;
40
+ }
41
+
7
42
  // src/context.ts
8
43
  function createSolanaGraphQLContext(rpc) {
9
- return { rpc };
44
+ const cache = createGraphQLCache();
45
+ return { cache, rpc };
10
46
  }
11
47
 
12
48
  // src/rpc.ts
@@ -24,12 +60,14 @@ function createRpcGraphQL(rpc) {
24
60
  return {
25
61
  context,
26
62
  async query(source, variableValues) {
27
- return graphql.graphql({
63
+ const result = await graphql.graphql({
28
64
  contextValue: this.context,
29
65
  schema: this.schema,
30
66
  source,
31
67
  variableValues
32
68
  });
69
+ this.context.cache.flush();
70
+ return result;
33
71
  },
34
72
  schema
35
73
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rpc.ts","../src/context.ts"],"names":[],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACK3D,SAAS,2BAA2B,KAA+C;AACtF,SAAO,EAAE,IAAI;AACjB;;;ADMO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,aAAO,QAAQ;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n return graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n },\n schema,\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nexport interface RpcGraphQLContext {\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n return { rpc };\n}\n"]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/cache.ts","../src/context.ts"],"names":["value"],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACOlE,IAAM,iBAAiB,CAAC,UACpB,KAAK,UAAU,OAAO,CAAC,GAAGA,WAAU;AAChC,MAAI,OAAOA,WAAU,UAAU;AAC3B,WAAOA,OAAM,SAAS,IAAI;AAAA,EAC9B;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,aAAa,CAAC,UAChB,KAAK,MAAM,OAAO,CAAC,GAAGA,WAAU;AAC5B,MAAI,OAAOA,WAAU,YAAY,QAAQ,KAAKA,MAAK,GAAG;AAClD,WAAO,OAAOA,OAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,WAAW,CAAC,KAAsB,cACpC,gBAAgB,eAAe,GAAG,CAAC,IAAI,eAAe,SAAS,CAAC;AAE7D,SAAS,qBAAmC;AAC/C,SAAO,OACD;AAAA;AAAA,IAEI,OAAO,MAAM;AAET,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,cAAM,aAAa,aAAa,IAAI,CAAC;AACrC,YAAI,cAAc,WAAW,WAAW,eAAe,GAAG;AACtD,uBAAa,WAAW,UAAU;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,aAAa,QAAQ,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAO,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,mBAAa,QAAQ,SAAS,KAAK,SAAS,GAAG,eAAe,KAAK,CAAC;AAAA,IACxE;AAAA,EACJ,IACA;AAAA;AAAA,IAEI,OAAO,MAAM;AACT,aAAO,KAAK,aAAa,EAAE,QAAQ,SAAO,OAAO,cAAc,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,cAAc,SAAS,KAAK,SAAS,CAAC;AACpD,aAAO,UAAU,SAAY,OAAO,WAAW,KAAK;AAAA,IACxD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,oBAAc,SAAS,KAAK,SAAS,CAAC,IAAI,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ;AACV;;;ACpDO,SAAS,2BAA2B,KAA+C;AACtF,QAAM,QAAQ,mBAAmB;AACjC,SAAO,EAAE,OAAO,IAAI;AACxB;;;AFEO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,YAAM,SAAS,MAAM,QAAQ;AAAA,QACzB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,MAAM,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n const result = await graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n this.context.cache.flush();\n return result;\n },\n schema,\n };\n}\n","export interface GraphQLCache {\n flush(): void;\n get(key: string | bigint, variables: unknown): unknown | null;\n insert(key: string | bigint, variables: unknown, value: unknown): void;\n}\n\n// Basic in-memory cache for Node.js\nconst inMemoryCache: { [key: string]: string } = {};\n\nconst stringifyValue = (value: unknown) =>\n JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n });\n\nconst parseValue = (value: string) =>\n JSON.parse(value, (_, value) => {\n if (typeof value === 'string' && /\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n });\n\nconst cacheKey = (key: string | bigint, variables: unknown): string =>\n `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;\n\nexport function createGraphQLCache(): GraphQLCache {\n return __BROWSER__\n ? {\n // Browser\n flush: () => {\n // Clear all entries from the localStorage related to this cache\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const storageKey = localStorage.key(i);\n if (storageKey && storageKey.startsWith('GraphQLCache:')) {\n localStorage.removeItem(storageKey);\n }\n }\n },\n get: (key, variables) => {\n const value = localStorage.getItem(cacheKey(key, variables));\n return value === null ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n localStorage.setItem(cacheKey(key, variables), stringifyValue(value));\n },\n }\n : {\n // Node.js\n flush: () => {\n Object.keys(inMemoryCache).forEach(key => delete inMemoryCache[key]);\n },\n get: (key, variables) => {\n const value = inMemoryCache[cacheKey(key, variables)];\n return value === undefined ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);\n },\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nimport { createGraphQLCache, GraphQLCache } from './cache';\n\nexport interface RpcGraphQLContext {\n cache: GraphQLCache;\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n const cache = createGraphQLCache();\n return { cache, rpc };\n}\n"]}
@@ -2,9 +2,45 @@ import { GraphQLSchema, GraphQLObjectType, graphql } from 'graphql';
2
2
 
3
3
  // src/rpc.ts
4
4
 
5
+ // src/cache.ts
6
+ var stringifyValue = (value) => JSON.stringify(value, (_, value2) => {
7
+ if (typeof value2 === "bigint") {
8
+ return value2.toString() + "n";
9
+ }
10
+ return value2;
11
+ });
12
+ var parseValue = (value) => JSON.parse(value, (_, value2) => {
13
+ if (typeof value2 === "string" && /\d+n$/.test(value2)) {
14
+ return BigInt(value2.slice(0, -1));
15
+ }
16
+ return value2;
17
+ });
18
+ var cacheKey = (key, variables) => `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;
19
+ function createGraphQLCache() {
20
+ return {
21
+ // Browser
22
+ flush: () => {
23
+ for (let i = localStorage.length - 1; i >= 0; i--) {
24
+ const storageKey = localStorage.key(i);
25
+ if (storageKey && storageKey.startsWith("GraphQLCache:")) {
26
+ localStorage.removeItem(storageKey);
27
+ }
28
+ }
29
+ },
30
+ get: (key, variables) => {
31
+ const value = localStorage.getItem(cacheKey(key, variables));
32
+ return value === null ? null : parseValue(value);
33
+ },
34
+ insert: (key, variables, value) => {
35
+ localStorage.setItem(cacheKey(key, variables), stringifyValue(value));
36
+ }
37
+ } ;
38
+ }
39
+
5
40
  // src/context.ts
6
41
  function createSolanaGraphQLContext(rpc) {
7
- return { rpc };
42
+ const cache = createGraphQLCache();
43
+ return { cache, rpc };
8
44
  }
9
45
 
10
46
  // src/rpc.ts
@@ -22,12 +58,14 @@ function createRpcGraphQL(rpc) {
22
58
  return {
23
59
  context,
24
60
  async query(source, variableValues) {
25
- return graphql({
61
+ const result = await graphql({
26
62
  contextValue: this.context,
27
63
  schema: this.schema,
28
64
  source,
29
65
  variableValues
30
66
  });
67
+ this.context.cache.flush();
68
+ return result;
31
69
  },
32
70
  schema
33
71
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rpc.ts","../src/context.ts"],"names":[],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACK3D,SAAS,2BAA2B,KAA+C;AACtF,SAAO,EAAE,IAAI;AACjB;;;ADMO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,aAAO,QAAQ;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n return graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n },\n schema,\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nexport interface RpcGraphQLContext {\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n return { rpc };\n}\n"]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/cache.ts","../src/context.ts"],"names":["value"],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACOlE,IAAM,iBAAiB,CAAC,UACpB,KAAK,UAAU,OAAO,CAAC,GAAGA,WAAU;AAChC,MAAI,OAAOA,WAAU,UAAU;AAC3B,WAAOA,OAAM,SAAS,IAAI;AAAA,EAC9B;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,aAAa,CAAC,UAChB,KAAK,MAAM,OAAO,CAAC,GAAGA,WAAU;AAC5B,MAAI,OAAOA,WAAU,YAAY,QAAQ,KAAKA,MAAK,GAAG;AAClD,WAAO,OAAOA,OAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,WAAW,CAAC,KAAsB,cACpC,gBAAgB,eAAe,GAAG,CAAC,IAAI,eAAe,SAAS,CAAC;AAE7D,SAAS,qBAAmC;AAC/C,SAAO,OACD;AAAA;AAAA,IAEI,OAAO,MAAM;AAET,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,cAAM,aAAa,aAAa,IAAI,CAAC;AACrC,YAAI,cAAc,WAAW,WAAW,eAAe,GAAG;AACtD,uBAAa,WAAW,UAAU;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,aAAa,QAAQ,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAO,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,mBAAa,QAAQ,SAAS,KAAK,SAAS,GAAG,eAAe,KAAK,CAAC;AAAA,IACxE;AAAA,EACJ,IACA;AAAA;AAAA,IAEI,OAAO,MAAM;AACT,aAAO,KAAK,aAAa,EAAE,QAAQ,SAAO,OAAO,cAAc,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,cAAc,SAAS,KAAK,SAAS,CAAC;AACpD,aAAO,UAAU,SAAY,OAAO,WAAW,KAAK;AAAA,IACxD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,oBAAc,SAAS,KAAK,SAAS,CAAC,IAAI,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ;AACV;;;ACpDO,SAAS,2BAA2B,KAA+C;AACtF,QAAM,QAAQ,mBAAmB;AACjC,SAAO,EAAE,OAAO,IAAI;AACxB;;;AFEO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,YAAM,SAAS,MAAM,QAAQ;AAAA,QACzB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,MAAM,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n const result = await graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n this.context.cache.flush();\n return result;\n },\n schema,\n };\n}\n","export interface GraphQLCache {\n flush(): void;\n get(key: string | bigint, variables: unknown): unknown | null;\n insert(key: string | bigint, variables: unknown, value: unknown): void;\n}\n\n// Basic in-memory cache for Node.js\nconst inMemoryCache: { [key: string]: string } = {};\n\nconst stringifyValue = (value: unknown) =>\n JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n });\n\nconst parseValue = (value: string) =>\n JSON.parse(value, (_, value) => {\n if (typeof value === 'string' && /\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n });\n\nconst cacheKey = (key: string | bigint, variables: unknown): string =>\n `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;\n\nexport function createGraphQLCache(): GraphQLCache {\n return __BROWSER__\n ? {\n // Browser\n flush: () => {\n // Clear all entries from the localStorage related to this cache\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const storageKey = localStorage.key(i);\n if (storageKey && storageKey.startsWith('GraphQLCache:')) {\n localStorage.removeItem(storageKey);\n }\n }\n },\n get: (key, variables) => {\n const value = localStorage.getItem(cacheKey(key, variables));\n return value === null ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n localStorage.setItem(cacheKey(key, variables), stringifyValue(value));\n },\n }\n : {\n // Node.js\n flush: () => {\n Object.keys(inMemoryCache).forEach(key => delete inMemoryCache[key]);\n },\n get: (key, variables) => {\n const value = inMemoryCache[cacheKey(key, variables)];\n return value === undefined ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);\n },\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nimport { createGraphQLCache, GraphQLCache } from './cache';\n\nexport interface RpcGraphQLContext {\n cache: GraphQLCache;\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n const cache = createGraphQLCache();\n return { cache, rpc };\n}\n"]}
@@ -2,9 +2,41 @@ import { GraphQLSchema, GraphQLObjectType, graphql } from 'graphql';
2
2
 
3
3
  // src/rpc.ts
4
4
 
5
+ // src/cache.ts
6
+ var inMemoryCache = {};
7
+ var stringifyValue = (value) => JSON.stringify(value, (_, value2) => {
8
+ if (typeof value2 === "bigint") {
9
+ return value2.toString() + "n";
10
+ }
11
+ return value2;
12
+ });
13
+ var parseValue = (value) => JSON.parse(value, (_, value2) => {
14
+ if (typeof value2 === "string" && /\d+n$/.test(value2)) {
15
+ return BigInt(value2.slice(0, -1));
16
+ }
17
+ return value2;
18
+ });
19
+ var cacheKey = (key, variables) => `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;
20
+ function createGraphQLCache() {
21
+ return {
22
+ // Node.js
23
+ flush: () => {
24
+ Object.keys(inMemoryCache).forEach((key) => delete inMemoryCache[key]);
25
+ },
26
+ get: (key, variables) => {
27
+ const value = inMemoryCache[cacheKey(key, variables)];
28
+ return value === void 0 ? null : parseValue(value);
29
+ },
30
+ insert: (key, variables, value) => {
31
+ inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);
32
+ }
33
+ };
34
+ }
35
+
5
36
  // src/context.ts
6
37
  function createSolanaGraphQLContext(rpc) {
7
- return { rpc };
38
+ const cache = createGraphQLCache();
39
+ return { cache, rpc };
8
40
  }
9
41
 
10
42
  // src/rpc.ts
@@ -22,12 +54,14 @@ function createRpcGraphQL(rpc) {
22
54
  return {
23
55
  context,
24
56
  async query(source, variableValues) {
25
- return graphql({
57
+ const result = await graphql({
26
58
  contextValue: this.context,
27
59
  schema: this.schema,
28
60
  source,
29
61
  variableValues
30
62
  });
63
+ this.context.cache.flush();
64
+ return result;
31
65
  },
32
66
  schema
33
67
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rpc.ts","../src/context.ts"],"names":[],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACK3D,SAAS,2BAA2B,KAA+C;AACtF,SAAO,EAAE,IAAI;AACjB;;;ADMO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,aAAO,QAAQ;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n return graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n },\n schema,\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nexport interface RpcGraphQLContext {\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n return { rpc };\n}\n"]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/cache.ts","../src/context.ts"],"names":["value"],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACKlE,IAAM,gBAA2C,CAAC;AAElD,IAAM,iBAAiB,CAAC,UACpB,KAAK,UAAU,OAAO,CAAC,GAAGA,WAAU;AAChC,MAAI,OAAOA,WAAU,UAAU;AAC3B,WAAOA,OAAM,SAAS,IAAI;AAAA,EAC9B;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,aAAa,CAAC,UAChB,KAAK,MAAM,OAAO,CAAC,GAAGA,WAAU;AAC5B,MAAI,OAAOA,WAAU,YAAY,QAAQ,KAAKA,MAAK,GAAG;AAClD,WAAO,OAAOA,OAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,WAAW,CAAC,KAAsB,cACpC,gBAAgB,eAAe,GAAG,CAAC,IAAI,eAAe,SAAS,CAAC;AAE7D,SAAS,qBAAmC;AAC/C,SAAO,QACD;AAAA;AAAA,IAEI,OAAO,MAAM;AAET,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,cAAM,aAAa,aAAa,IAAI,CAAC;AACrC,YAAI,cAAc,WAAW,WAAW,eAAe,GAAG;AACtD,uBAAa,WAAW,UAAU;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,aAAa,QAAQ,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAO,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,mBAAa,QAAQ,SAAS,KAAK,SAAS,GAAG,eAAe,KAAK,CAAC;AAAA,IACxE;AAAA,EACJ,IACA;AAAA;AAAA,IAEI,OAAO,MAAM;AACT,aAAO,KAAK,aAAa,EAAE,QAAQ,SAAO,OAAO,cAAc,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,cAAc,SAAS,KAAK,SAAS,CAAC;AACpD,aAAO,UAAU,SAAY,OAAO,WAAW,KAAK;AAAA,IACxD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,oBAAc,SAAS,KAAK,SAAS,CAAC,IAAI,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ;AACV;;;ACpDO,SAAS,2BAA2B,KAA+C;AACtF,QAAM,QAAQ,mBAAmB;AACjC,SAAO,EAAE,OAAO,IAAI;AACxB;;;AFEO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,YAAM,SAAS,MAAM,QAAQ;AAAA,QACzB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,MAAM,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n const result = await graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n this.context.cache.flush();\n return result;\n },\n schema,\n };\n}\n","export interface GraphQLCache {\n flush(): void;\n get(key: string | bigint, variables: unknown): unknown | null;\n insert(key: string | bigint, variables: unknown, value: unknown): void;\n}\n\n// Basic in-memory cache for Node.js\nconst inMemoryCache: { [key: string]: string } = {};\n\nconst stringifyValue = (value: unknown) =>\n JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n });\n\nconst parseValue = (value: string) =>\n JSON.parse(value, (_, value) => {\n if (typeof value === 'string' && /\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n });\n\nconst cacheKey = (key: string | bigint, variables: unknown): string =>\n `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;\n\nexport function createGraphQLCache(): GraphQLCache {\n return __BROWSER__\n ? {\n // Browser\n flush: () => {\n // Clear all entries from the localStorage related to this cache\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const storageKey = localStorage.key(i);\n if (storageKey && storageKey.startsWith('GraphQLCache:')) {\n localStorage.removeItem(storageKey);\n }\n }\n },\n get: (key, variables) => {\n const value = localStorage.getItem(cacheKey(key, variables));\n return value === null ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n localStorage.setItem(cacheKey(key, variables), stringifyValue(value));\n },\n }\n : {\n // Node.js\n flush: () => {\n Object.keys(inMemoryCache).forEach(key => delete inMemoryCache[key]);\n },\n get: (key, variables) => {\n const value = inMemoryCache[cacheKey(key, variables)];\n return value === undefined ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);\n },\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nimport { createGraphQLCache, GraphQLCache } from './cache';\n\nexport interface RpcGraphQLContext {\n cache: GraphQLCache;\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n const cache = createGraphQLCache();\n return { cache, rpc };\n}\n"]}
@@ -4,9 +4,41 @@ var graphql = require('graphql');
4
4
 
5
5
  // src/rpc.ts
6
6
 
7
+ // src/cache.ts
8
+ var inMemoryCache = {};
9
+ var stringifyValue = (value) => JSON.stringify(value, (_, value2) => {
10
+ if (typeof value2 === "bigint") {
11
+ return value2.toString() + "n";
12
+ }
13
+ return value2;
14
+ });
15
+ var parseValue = (value) => JSON.parse(value, (_, value2) => {
16
+ if (typeof value2 === "string" && /\d+n$/.test(value2)) {
17
+ return BigInt(value2.slice(0, -1));
18
+ }
19
+ return value2;
20
+ });
21
+ var cacheKey = (key, variables) => `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;
22
+ function createGraphQLCache() {
23
+ return {
24
+ // Node.js
25
+ flush: () => {
26
+ Object.keys(inMemoryCache).forEach((key) => delete inMemoryCache[key]);
27
+ },
28
+ get: (key, variables) => {
29
+ const value = inMemoryCache[cacheKey(key, variables)];
30
+ return value === void 0 ? null : parseValue(value);
31
+ },
32
+ insert: (key, variables, value) => {
33
+ inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);
34
+ }
35
+ };
36
+ }
37
+
7
38
  // src/context.ts
8
39
  function createSolanaGraphQLContext(rpc) {
9
- return { rpc };
40
+ const cache = createGraphQLCache();
41
+ return { cache, rpc };
10
42
  }
11
43
 
12
44
  // src/rpc.ts
@@ -24,12 +56,14 @@ function createRpcGraphQL(rpc) {
24
56
  return {
25
57
  context,
26
58
  async query(source, variableValues) {
27
- return graphql.graphql({
59
+ const result = await graphql.graphql({
28
60
  contextValue: this.context,
29
61
  schema: this.schema,
30
62
  source,
31
63
  variableValues
32
64
  });
65
+ this.context.cache.flush();
66
+ return result;
33
67
  },
34
68
  schema
35
69
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rpc.ts","../src/context.ts"],"names":[],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACK3D,SAAS,2BAA2B,KAA+C;AACtF,SAAO,EAAE,IAAI;AACjB;;;ADMO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,aAAO,QAAQ;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n return graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n },\n schema,\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nexport interface RpcGraphQLContext {\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n return { rpc };\n}\n"]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/cache.ts","../src/context.ts"],"names":["value"],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACKlE,IAAM,gBAA2C,CAAC;AAElD,IAAM,iBAAiB,CAAC,UACpB,KAAK,UAAU,OAAO,CAAC,GAAGA,WAAU;AAChC,MAAI,OAAOA,WAAU,UAAU;AAC3B,WAAOA,OAAM,SAAS,IAAI;AAAA,EAC9B;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,aAAa,CAAC,UAChB,KAAK,MAAM,OAAO,CAAC,GAAGA,WAAU;AAC5B,MAAI,OAAOA,WAAU,YAAY,QAAQ,KAAKA,MAAK,GAAG;AAClD,WAAO,OAAOA,OAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,WAAW,CAAC,KAAsB,cACpC,gBAAgB,eAAe,GAAG,CAAC,IAAI,eAAe,SAAS,CAAC;AAE7D,SAAS,qBAAmC;AAC/C,SAAO,QACD;AAAA;AAAA,IAEI,OAAO,MAAM;AAET,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,cAAM,aAAa,aAAa,IAAI,CAAC;AACrC,YAAI,cAAc,WAAW,WAAW,eAAe,GAAG;AACtD,uBAAa,WAAW,UAAU;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,aAAa,QAAQ,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAO,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,mBAAa,QAAQ,SAAS,KAAK,SAAS,GAAG,eAAe,KAAK,CAAC;AAAA,IACxE;AAAA,EACJ,IACA;AAAA;AAAA,IAEI,OAAO,MAAM;AACT,aAAO,KAAK,aAAa,EAAE,QAAQ,SAAO,OAAO,cAAc,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,cAAc,SAAS,KAAK,SAAS,CAAC;AACpD,aAAO,UAAU,SAAY,OAAO,WAAW,KAAK;AAAA,IACxD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,oBAAc,SAAS,KAAK,SAAS,CAAC,IAAI,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ;AACV;;;ACpDO,SAAS,2BAA2B,KAA+C;AACtF,QAAM,QAAQ,mBAAmB;AACjC,SAAO,EAAE,OAAO,IAAI;AACxB;;;AFEO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,YAAM,SAAS,MAAM,QAAQ;AAAA,QACzB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,MAAM,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n const result = await graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n this.context.cache.flush();\n return result;\n },\n schema,\n };\n}\n","export interface GraphQLCache {\n flush(): void;\n get(key: string | bigint, variables: unknown): unknown | null;\n insert(key: string | bigint, variables: unknown, value: unknown): void;\n}\n\n// Basic in-memory cache for Node.js\nconst inMemoryCache: { [key: string]: string } = {};\n\nconst stringifyValue = (value: unknown) =>\n JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n });\n\nconst parseValue = (value: string) =>\n JSON.parse(value, (_, value) => {\n if (typeof value === 'string' && /\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n });\n\nconst cacheKey = (key: string | bigint, variables: unknown): string =>\n `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;\n\nexport function createGraphQLCache(): GraphQLCache {\n return __BROWSER__\n ? {\n // Browser\n flush: () => {\n // Clear all entries from the localStorage related to this cache\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const storageKey = localStorage.key(i);\n if (storageKey && storageKey.startsWith('GraphQLCache:')) {\n localStorage.removeItem(storageKey);\n }\n }\n },\n get: (key, variables) => {\n const value = localStorage.getItem(cacheKey(key, variables));\n return value === null ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n localStorage.setItem(cacheKey(key, variables), stringifyValue(value));\n },\n }\n : {\n // Node.js\n flush: () => {\n Object.keys(inMemoryCache).forEach(key => delete inMemoryCache[key]);\n },\n get: (key, variables) => {\n const value = inMemoryCache[cacheKey(key, variables)];\n return value === undefined ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);\n },\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nimport { createGraphQLCache, GraphQLCache } from './cache';\n\nexport interface RpcGraphQLContext {\n cache: GraphQLCache;\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n const cache = createGraphQLCache();\n return { cache, rpc };\n}\n"]}
@@ -2,9 +2,41 @@ import { GraphQLSchema, GraphQLObjectType, graphql } from 'graphql';
2
2
 
3
3
  // src/rpc.ts
4
4
 
5
+ // src/cache.ts
6
+ var inMemoryCache = {};
7
+ var stringifyValue = (value) => JSON.stringify(value, (_, value2) => {
8
+ if (typeof value2 === "bigint") {
9
+ return value2.toString() + "n";
10
+ }
11
+ return value2;
12
+ });
13
+ var parseValue = (value) => JSON.parse(value, (_, value2) => {
14
+ if (typeof value2 === "string" && /\d+n$/.test(value2)) {
15
+ return BigInt(value2.slice(0, -1));
16
+ }
17
+ return value2;
18
+ });
19
+ var cacheKey = (key, variables) => `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;
20
+ function createGraphQLCache() {
21
+ return {
22
+ // Node.js
23
+ flush: () => {
24
+ Object.keys(inMemoryCache).forEach((key) => delete inMemoryCache[key]);
25
+ },
26
+ get: (key, variables) => {
27
+ const value = inMemoryCache[cacheKey(key, variables)];
28
+ return value === void 0 ? null : parseValue(value);
29
+ },
30
+ insert: (key, variables, value) => {
31
+ inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);
32
+ }
33
+ };
34
+ }
35
+
5
36
  // src/context.ts
6
37
  function createSolanaGraphQLContext(rpc) {
7
- return { rpc };
38
+ const cache = createGraphQLCache();
39
+ return { cache, rpc };
8
40
  }
9
41
 
10
42
  // src/rpc.ts
@@ -22,12 +54,14 @@ function createRpcGraphQL(rpc) {
22
54
  return {
23
55
  context,
24
56
  async query(source, variableValues) {
25
- return graphql({
57
+ const result = await graphql({
26
58
  contextValue: this.context,
27
59
  schema: this.schema,
28
60
  source,
29
61
  variableValues
30
62
  });
63
+ this.context.cache.flush();
64
+ return result;
31
65
  },
32
66
  schema
33
67
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/rpc.ts","../src/context.ts"],"names":[],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACK3D,SAAS,2BAA2B,KAA+C;AACtF,SAAO,EAAE,IAAI;AACjB;;;ADMO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,aAAO,QAAQ;AAAA,QACX,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n return graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n },\n schema,\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nexport interface RpcGraphQLContext {\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n return { rpc };\n}\n"]}
1
+ {"version":3,"sources":["../src/rpc.ts","../src/cache.ts","../src/context.ts"],"names":["value"],"mappings":";AAEA,SAAS,SAAS,mBAAmB,qBAA6B;;;ACKlE,IAAM,gBAA2C,CAAC;AAElD,IAAM,iBAAiB,CAAC,UACpB,KAAK,UAAU,OAAO,CAAC,GAAGA,WAAU;AAChC,MAAI,OAAOA,WAAU,UAAU;AAC3B,WAAOA,OAAM,SAAS,IAAI;AAAA,EAC9B;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,aAAa,CAAC,UAChB,KAAK,MAAM,OAAO,CAAC,GAAGA,WAAU;AAC5B,MAAI,OAAOA,WAAU,YAAY,QAAQ,KAAKA,MAAK,GAAG;AAClD,WAAO,OAAOA,OAAM,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC;AACA,SAAOA;AACX,CAAC;AAEL,IAAM,WAAW,CAAC,KAAsB,cACpC,gBAAgB,eAAe,GAAG,CAAC,IAAI,eAAe,SAAS,CAAC;AAE7D,SAAS,qBAAmC;AAC/C,SAAO,QACD;AAAA;AAAA,IAEI,OAAO,MAAM;AAET,eAAS,IAAI,aAAa,SAAS,GAAG,KAAK,GAAG,KAAK;AAC/C,cAAM,aAAa,aAAa,IAAI,CAAC;AACrC,YAAI,cAAc,WAAW,WAAW,eAAe,GAAG;AACtD,uBAAa,WAAW,UAAU;AAAA,QACtC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,aAAa,QAAQ,SAAS,KAAK,SAAS,CAAC;AAC3D,aAAO,UAAU,OAAO,OAAO,WAAW,KAAK;AAAA,IACnD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,mBAAa,QAAQ,SAAS,KAAK,SAAS,GAAG,eAAe,KAAK,CAAC;AAAA,IACxE;AAAA,EACJ,IACA;AAAA;AAAA,IAEI,OAAO,MAAM;AACT,aAAO,KAAK,aAAa,EAAE,QAAQ,SAAO,OAAO,cAAc,GAAG,CAAC;AAAA,IACvE;AAAA,IACA,KAAK,CAAC,KAAK,cAAc;AACrB,YAAM,QAAQ,cAAc,SAAS,KAAK,SAAS,CAAC;AACpD,aAAO,UAAU,SAAY,OAAO,WAAW,KAAK;AAAA,IACxD;AAAA,IACA,QAAQ,CAAC,KAAK,WAAW,UAAU;AAC/B,oBAAc,SAAS,KAAK,SAAS,CAAC,IAAI,eAAe,KAAK;AAAA,IAClE;AAAA,EACJ;AACV;;;ACpDO,SAAS,2BAA2B,KAA+C;AACtF,QAAM,QAAQ,mBAAmB;AACjC,SAAO,EAAE,OAAO,IAAI;AACxB;;;AFEO,SAAS,iBAAiB,KAAwC;AACrE,QAAM,UAAU,2BAA2B,GAAG;AAC9C,QAAM,SAAS,IAAI,cAAc;AAAA,IAC7B,OAAO,IAAI,kBAAkB;AAAA,MACzB,QAAQ;AAAA;AAAA,MAER;AAAA,MACA,MAAM;AAAA,IACV,CAAC;AAAA,IACD,OAAO,CAAC;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACH;AAAA,IACA,MAAM,MAAM,QAAyB,gBAA2D;AAC5F,YAAM,SAAS,MAAM,QAAQ;AAAA,QACzB,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA;AAAA,MACJ,CAAC;AACD,WAAK,QAAQ,MAAM,MAAM;AACzB,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AACJ","sourcesContent":["import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\nimport { graphql, GraphQLObjectType, GraphQLSchema, Source } from 'graphql';\n\nimport { createSolanaGraphQLContext, RpcGraphQLContext } from './context';\n\nexport interface RpcGraphQL {\n context: RpcGraphQLContext;\n query(\n source: string | Source,\n variableValues?: { readonly [variable: string]: unknown }\n ): ReturnType<typeof graphql>;\n schema: GraphQLSchema;\n}\n\nexport function createRpcGraphQL(rpc: Rpc<SolanaRpcMethods>): RpcGraphQL {\n const context = createSolanaGraphQLContext(rpc);\n const schema = new GraphQLSchema({\n query: new GraphQLObjectType({\n fields: {\n /** Root queries */\n },\n name: 'RootQuery',\n }),\n types: [],\n });\n return {\n context,\n async query(source: string | Source, variableValues?: { readonly [variable: string]: unknown }) {\n const result = await graphql({\n contextValue: this.context,\n schema: this.schema,\n source,\n variableValues,\n });\n this.context.cache.flush();\n return result;\n },\n schema,\n };\n}\n","export interface GraphQLCache {\n flush(): void;\n get(key: string | bigint, variables: unknown): unknown | null;\n insert(key: string | bigint, variables: unknown, value: unknown): void;\n}\n\n// Basic in-memory cache for Node.js\nconst inMemoryCache: { [key: string]: string } = {};\n\nconst stringifyValue = (value: unknown) =>\n JSON.stringify(value, (_, value) => {\n if (typeof value === 'bigint') {\n return value.toString() + 'n';\n }\n return value;\n });\n\nconst parseValue = (value: string) =>\n JSON.parse(value, (_, value) => {\n if (typeof value === 'string' && /\\d+n$/.test(value)) {\n return BigInt(value.slice(0, -1));\n }\n return value;\n });\n\nconst cacheKey = (key: string | bigint, variables: unknown): string =>\n `GraphQLCache:${stringifyValue(key)}:${stringifyValue(variables)}`;\n\nexport function createGraphQLCache(): GraphQLCache {\n return __BROWSER__\n ? {\n // Browser\n flush: () => {\n // Clear all entries from the localStorage related to this cache\n for (let i = localStorage.length - 1; i >= 0; i--) {\n const storageKey = localStorage.key(i);\n if (storageKey && storageKey.startsWith('GraphQLCache:')) {\n localStorage.removeItem(storageKey);\n }\n }\n },\n get: (key, variables) => {\n const value = localStorage.getItem(cacheKey(key, variables));\n return value === null ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n localStorage.setItem(cacheKey(key, variables), stringifyValue(value));\n },\n }\n : {\n // Node.js\n flush: () => {\n Object.keys(inMemoryCache).forEach(key => delete inMemoryCache[key]);\n },\n get: (key, variables) => {\n const value = inMemoryCache[cacheKey(key, variables)];\n return value === undefined ? null : parseValue(value);\n },\n insert: (key, variables, value) => {\n inMemoryCache[cacheKey(key, variables)] = stringifyValue(value);\n },\n };\n}\n","import { SolanaRpcMethods } from '@solana/rpc-core';\nimport { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';\n\nimport { createGraphQLCache, GraphQLCache } from './cache';\n\nexport interface RpcGraphQLContext {\n cache: GraphQLCache;\n rpc: Rpc<SolanaRpcMethods>;\n}\n\nexport function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext {\n const cache = createGraphQLCache();\n return { cache, rpc };\n}\n"]}
@@ -0,0 +1,7 @@
1
+ export interface GraphQLCache {
2
+ flush(): void;
3
+ get(key: string | bigint, variables: unknown): unknown | null;
4
+ insert(key: string | bigint, variables: unknown, value: unknown): void;
5
+ }
6
+ export declare function createGraphQLCache(): GraphQLCache;
7
+ //# sourceMappingURL=cache.d.ts.map
@@ -1,6 +1,8 @@
1
1
  import { SolanaRpcMethods } from '@solana/rpc-core';
2
2
  import { Rpc } from '@solana/rpc-transport/dist/types/json-rpc-types';
3
+ import { GraphQLCache } from './cache';
3
4
  export interface RpcGraphQLContext {
5
+ cache: GraphQLCache;
4
6
  rpc: Rpc<SolanaRpcMethods>;
5
7
  }
6
8
  export declare function createSolanaGraphQLContext(rpc: Rpc<SolanaRpcMethods>): RpcGraphQLContext;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solana/rpc-graphql",
3
- "version": "2.0.0-experimental.5586a1b",
3
+ "version": "2.0.0-experimental.eb5fd16",
4
4
  "description": "A library for resolving GraphQl query calls to the Solana JSON RPC API",
5
5
  "exports": {
6
6
  "browser": {
@@ -67,9 +67,9 @@
67
67
  "tsup": "7.2.0",
68
68
  "typescript": "^5.1.6",
69
69
  "version-from-git": "^1.1.1",
70
- "@solana/addresses": "2.0.0-experimental.5586a1b",
71
- "@solana/rpc-core": "2.0.0-experimental.5586a1b",
72
- "@solana/rpc-transport": "2.0.0-experimental.5586a1b",
70
+ "@solana/addresses": "2.0.0-experimental.eb5fd16",
71
+ "@solana/rpc-core": "2.0.0-experimental.eb5fd16",
72
+ "@solana/rpc-transport": "2.0.0-experimental.eb5fd16",
73
73
  "build-scripts": "0.0.0",
74
74
  "test-config": "0.0.0",
75
75
  "tsconfig": "0.0.0"
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,iDAAiD,CAAC;AAEtE,MAAM,WAAW,iBAAiB;IAC9B,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,iBAAiB,CAExF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,MAAM,iDAAiD,CAAC;AACtE,OAAO,EAAE,OAAO,EAAqB,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE5E,OAAO,EAA8B,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE1E,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,CACD,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,cAAc,CAAC,EAAE;QAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAC1D,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;IAC9B,MAAM,EAAE,aAAa,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAuBvE"}