Update API.md
This commit is contained in:
		
							parent
							
								
									ae1f47df38
								
							
						
					
					
						commit
						f697878040
					
				
							
								
								
									
										90
									
								
								API.md
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								API.md
									
									
									
									
									
								
							@ -1,5 +1,6 @@
 | 
				
			|||||||
* Bootstrap Initialization
 | 
					* Bootstrap Initialization
 | 
				
			||||||
* Package Format
 | 
					* Package Discovery
 | 
				
			||||||
 | 
					* Package Layout
 | 
				
			||||||
* Package APIs
 | 
					* Package APIs
 | 
				
			||||||
* RESTful API constraints
 | 
					* RESTful API constraints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -18,9 +19,94 @@ curl -X POST http://api.localhost.daplie.me:3000/api/walnut@daplie.com/init \
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
From this point forward you can now interact with Walnut at that domain.
 | 
					From this point forward you can now interact with Walnut at that domain.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Package Format
 | 
					OAuth3 Package Discovery
 | 
				
			||||||
 | 
					-----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unlike most package systems such as npm (node.js), gem (ruby), pip (python), etc,
 | 
				
			||||||
 | 
					which rely on a single, [centralized closed-source repository](https://github.com/npm/registry/issues/41),
 | 
				
			||||||
 | 
					walnut packages use the OAuth3 Package Specification which allows for open and closed,
 | 
				
			||||||
 | 
					public and private, free and paid packages, according to the desire of the publisher.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					In this model the name of a package is all that is necessary to install it from its publisher.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Let's `hello@example.com` as an example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`hello@example.com` specifies that `hello` is a submodule of the `example.com` package.
 | 
				
			||||||
 | 
					As you might guess, the publisher `example.com` is responsible for this package.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`https://example.com/.well-known/packages@oauth3.org/` is the known location where package types can be discovered.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Since we're using `walnut.js` which is published by daplie.com, we can find walnut packages at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`https://example.com/.well-known/packages@oauth3.org/walnut.js@daplie.com.json`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This file tells us where example.com publishes packages that adhere to the `walnut.js@daplie.com` package spec.
 | 
				
			||||||
 | 
					(you can imagine that if walnut were to be implemented in ruby the ruby packages could be found at `walnut.rb@daplie.com`
 | 
				
			||||||
 | 
					or if walnut were not protected by trademark and another company were to create a similar, but incompatible package
 | 
				
			||||||
 | 
					system for it, it would be `walnut.go@acme.co` or some such)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For publishers with a long list of packages you might find a URL using the template variable `:package_name` to describe
 | 
				
			||||||
 | 
					where more information about a package can be found:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{ "package_url": "https://packages.example.com/indexes/:package_name.json"
 | 
				
			||||||
 | 
					, "package_index": "https://packages.example.com/index.json"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					For publishers with a short list of packages you might find that all of the packages are listed directly,
 | 
				
			||||||
 | 
					using the template variables `:package_name`, `:package_version`, `:payment_token`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{ "package_url": null
 | 
				
			||||||
 | 
					, "package_index": null
 | 
				
			||||||
 | 
					, "packages": [
 | 
				
			||||||
 | 
					  { "name": "hello@example.com"
 | 
				
			||||||
 | 
					  , "license": "Physical-Source-v2@licenses.org"
 | 
				
			||||||
 | 
					  , "requires_payment": true
 | 
				
			||||||
 | 
					  , "payment_url": "https://author.tld/api/payments@oauth3.org/schemas/packages/walnut.js@daplie.com/:package_name"
 | 
				
			||||||
 | 
					  , "zip_url": "https://cdn.tld/api/orders@cdn.tld/:package_name-:package_version.zip?authorization=:payment_token"
 | 
				
			||||||
 | 
					  , "git_https_url":"https://git.cdn.tld/author.tld/:package_name.git#:package_version?authorization=:payment_token"
 | 
				
			||||||
 | 
					  , "git_ssh_url":":payment_token@git.cdn.tld:author.tld/:package_name.git#:package_version"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					, { "name": "gizmo@example.com"
 | 
				
			||||||
 | 
					  , "license": "MIT@licenses.org"
 | 
				
			||||||
 | 
					  , "requires_payment": false
 | 
				
			||||||
 | 
					  , "zip_url": "https://example.com/packages/:package_name-:package_version.zip"
 | 
				
			||||||
 | 
					  , "git_https_url":"https://git.cdn.tld/author.tld/:package_name.git#:package_version"
 | 
				
			||||||
 | 
					  , "git_ssh_url":"git@git.cdn.tld:author.tld/:package_name.git#:package_version"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					] }
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Package Layout
 | 
				
			||||||
--------------
 | 
					--------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Packages have data model, api, and RESTful components.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					/srv/walnut/packages/rest/hello@example.com/
 | 
				
			||||||
 | 
					  package.json
 | 
				
			||||||
 | 
					  api.js
 | 
				
			||||||
 | 
					  models.js
 | 
				
			||||||
 | 
					  rest.js
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Each package must be enabled on a per-domain basis.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					/srv/walnut/packages/client-api-grants/provider.example.com
 | 
				
			||||||
 | 
					  '''
 | 
				
			||||||
 | 
					  hello@example.com
 | 
				
			||||||
 | 
					  '''
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When a package is enabled for `example.com` it becomes immediately available via https
 | 
				
			||||||
 | 
					as `https://api.example.com/api/package@publisher.tld/`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Note: although hot-loading of packages is supported, reloading still requires
 | 
				
			||||||
 | 
					restarting the walnut server - for now at least
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Package APIs
 | 
					Package APIs
 | 
				
			||||||
------------
 | 
					------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user