This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Sep 11, 2022. It is now read-only.

Repository files navigation

SimpleGraphQL For Unity

SimpleGraphQL is just that -- a simple GraphQL client that is mostly code based and works with Unity. This is a fork of LastAbyss/SimpleGraphQL-For-Unity with the intention to support graphql-ws and the graphql-transport-ws protocol

About

This package attempts to provide a simple API that is able to interact with a GraphQL server. Nothing more, nothing less. No complicated setup.

Also, the world could use some more Unity-friendly GraphQL libraries.

That being said, this is intended to be a primarily code based package, so keep that in mind if you decide to use this.

What It Does and Doesn't

Does

  • Supports Queries, mutations, and subscriptions
  • Checking for error codes
  • Reads .graphql files within your project
  • Supports multiple queries per file (with operation selectors)
  • Supports custom headers
  • Async/Await & Coroutine w/ Callback

Doesn't

  • Introspection (you are responsible for writing valid .graphql files)
    • There is very basic error checking, but beyond that you need to ensure that you are writing something compatible with your server (GraphiQL works great)

Requirements

Requirements
.NET 4.6 or higher
I guess that's it

Supported Platforms

PlatformsQueries & MutationsSubscriptions
Mono
IL2CPP
WebGL

This should work with all platforms (Mono/IL2CPP) except for subscriptions on WebGL. It makes use of UnityWebRequest where possible, but C# WebSockets are the main issue, so subscriptions will not properly work. If you do not need subscriptions, WebGL will work just fine. Work may be added to support WebGL in the future, but for now, there is no support.

If you are having trouble with a platform, please open an issue.

Unity Version

We've tested this on Unity 2019.4 and higher (up to 2021.1). While it may work on older Unity versions, there is no strong guarantee because there have been many breaking API changes over the past couple of years, but also that some of the features being used here may have not been backported. Your mileage may vary.

Installation

You can add this library to your project using the Package Manager.

Go to the package manager and click on "Add package from git URL".
From there, add this URL:
https://github.com/LastAbyss/SimpleGraphQL-For-Unity.git

show_tutorial_image

That's it.

Quick Start

Simplest usage:

varclient=newGraphQLClient("https://countries.trevorblades.com/");varrequest=newRequest{Query="query ContinentNameByCode($code: ID!) { continent(code: $code) { name } }",Variables=new{code="EU"}};varresponseType=new{continent=new{name=""}};varresponse=awaitclient.Send(()=>responseType,request);Debug.Log(response.Result.Data.continent.name);

SimpleGraphQL also lets you store queries in .graphql files that you must write yourself. It is up to you to make sure they are valid. Many IDEs support this function natively or through plugins.

Configuration

Import: Put your .graphql files somewhere in your Assets folder.

Create a Config

  1. Right Click -> Create -> SimpleGraphQL -> GraphQL Config
  2. Fill in values img

This inspector looks this way because of Odin Inspector. Go check it out, it is a massive time saver.

Reference GraphQL Config

publicGraphQLConfigConfig;

Queries & Mutations

publicasyncvoidQueryOrMutation(){vargraphQL=newGraphQLClient(Config);// You can search by file name, operation name, or operation type// or... mix and match between all threeQueryquery=graphQL.FindQuery("FileName","OperationName",OperationType.Query);stringresults=awaitgraphQL.Send(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(results);}

NOTE: The code above is just an example, not all parameters are needed. Be sure to look at the optional parameters.

Subscriptions

publicasyncvoidSubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeFile");graphQL.RegisterListener(OnSubscriptionUpdated);boolsuccess=awaitgraphQL.Subscribe(query.ToRequest(newDictionary<string,object>{{"variable","value"}}),null,"authToken","Bearer");Debug.Log(success?"Subscribed!":"Subscribe failed!");}publicasyncvoidUnsubscribe(){vargraphQL=newGraphQLClient(Config);Queryquery=graphQL.FindQuery("SubscribeScoresForLevel");awaitgraphQL.Unsubscribe(query.ToRequest());graphQL.UnregisterListener(OnSubscriptionUpdated);Debug.Log("Unsubscribed!");}publicvoidOnSubscriptionUpdated(stringpayload){Debug.Log("Subscription updated: "+payload);}

Coroutines

SimpleGraphQL includes a custom yield instruction for when you want to use coroutines.

/// <summary>/// Create a new WaitForSend Yield Instruction./// </summary>/// <param name="sendFunc">The graphQL send function.</param>/// <param name="onComplete">The callback that will be invoked after the task is complete.</param>publicWaitForSend(Func<Task<string>> sendFunc,Action<string> onComplete)
privatevoidStart(){StartCoroutine(_CallQueryCoroutine());}publicIEnumerator_CallQueryCoroutine(){yieldreturnnewWaitForSend(graphQL.Send(request),OnComplete);}publicvoidOnComplete(stringresult){Debug.Log("GraphQL Result: "+result);}

Authentication and Headers

Depending on your authentication method, it is up to you to ensure that your authentication data and headers are set correctly.

Custom headers and auth tokens are natively supported in SimpleGraphQL. They can be passed in as parameters when calling Subscribe or Send.

Example Valid .graphql Files

GetScoreById.graphql

# fully defined queryqueryGetScoreById($user_id: String!, $level: String!) {
leaderboards_by_pk(level: $level, user_id: $user_id) {
user_idlevelscoremetadata
}
}

GetScoresForLevel.graphql

# anonymous queryquery ($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

MoreScoreStuff.graphql

# you can have multiple queries in one file, and long as they are uniquely namedmutationUpsertScore(
$user_id: String!$level: String!$score: bigint!$metadata: jsonb!
) {
insert_leaderboards_one(
object: {
user_id: $user_idlevel: $levelscore: $scoremetadata: $metadata
}
on_conflict: {
constraint: leaderboards_pkeyupdate_columns: scorewhere: { score: { _lt: $score } }
}
) {
user_idscore
}
}
subscriptionGetScoresForLevel($level: String!) {
leaderboards(where: { level: { _eq: $level } }) {
user_idlevelscoremetadata
}
}

Things to Note

  • During testing, we found that Unity's version of .NET occasionally has issues with HttpClient and WebSocket. If you find that you are having the same issues, please let us know. WebSocket is unavoidable for subscriptions, and Unity has no alternative like they do with UnityWebRequest.
  • WebSockets sometimes take extraordinarily long amounts of time to start up on the first call. This is has probably been fixed in a recent .NET version (but we don't have those fixes yet.)

About

A simple graphQL client that allows one to use .graphql files (or code) for queries, mutations, and subscriptions with Unity.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages