src_metadata.js.html 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>JSDoc: Source: src/metadata.js</title>
  6. <script src="scripts/prettify/prettify.js"> </script>
  7. <script src="scripts/prettify/lang-css.js"> </script>
  8. <!--[if lt IE 9]>
  9. <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  10. <![endif]-->
  11. <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
  12. <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
  13. </head>
  14. <body>
  15. <div id="main">
  16. <h1 class="page-title">Source: src/metadata.js</h1>
  17. <section>
  18. <article>
  19. <pre class="prettyprint source linenums"><code>/*
  20. *
  21. * Copyright 2015, Google Inc.
  22. * All rights reserved.
  23. *
  24. * Redistribution and use in source and binary forms, with or without
  25. * modification, are permitted provided that the following conditions are
  26. * met:
  27. *
  28. * * Redistributions of source code must retain the above copyright
  29. * notice, this list of conditions and the following disclaimer.
  30. * * Redistributions in binary form must reproduce the above
  31. * copyright notice, this list of conditions and the following disclaimer
  32. * in the documentation and/or other materials provided with the
  33. * distribution.
  34. * * Neither the name of Google Inc. nor the names of its
  35. * contributors may be used to endorse or promote products derived from
  36. * this software without specific prior written permission.
  37. *
  38. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  39. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  40. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  41. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  42. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  43. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  44. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  45. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  46. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  47. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  48. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  49. *
  50. */
  51. /**
  52. * Metadata module
  53. * @module
  54. */
  55. 'use strict';
  56. var _ = require('lodash');
  57. /**
  58. * Class for storing metadata. Keys are normalized to lowercase ASCII.
  59. * @constructor
  60. */
  61. function Metadata() {
  62. this._internal_repr = {};
  63. }
  64. function normalizeKey(key) {
  65. if (!(/^[A-Za-z\d_-]+$/.test(key))) {
  66. throw new Error('Metadata keys must be nonempty strings containing only ' +
  67. 'alphanumeric characters and hyphens');
  68. }
  69. return key.toLowerCase();
  70. }
  71. function validate(key, value) {
  72. if (_.endsWith(key, '-bin')) {
  73. if (!(value instanceof Buffer)) {
  74. throw new Error('keys that end with \'-bin\' must have Buffer values');
  75. }
  76. } else {
  77. if (!_.isString(value)) {
  78. throw new Error(
  79. 'keys that don\'t end with \'-bin\' must have String values');
  80. }
  81. if (!(/^[\x20-\x7E]*$/.test(value))) {
  82. throw new Error('Metadata string values can only contain printable ' +
  83. 'ASCII characters and space');
  84. }
  85. }
  86. }
  87. /**
  88. * Sets the given value for the given key, replacing any other values associated
  89. * with that key. Normalizes the key.
  90. * @param {String} key The key to set
  91. * @param {String|Buffer} value The value to set. Must be a buffer if and only
  92. * if the normalized key ends with '-bin'
  93. */
  94. Metadata.prototype.set = function(key, value) {
  95. key = normalizeKey(key);
  96. validate(key, value);
  97. this._internal_repr[key] = [value];
  98. };
  99. /**
  100. * Adds the given value for the given key. Normalizes the key.
  101. * @param {String} key The key to add to.
  102. * @param {String|Buffer} value The value to add. Must be a buffer if and only
  103. * if the normalized key ends with '-bin'
  104. */
  105. Metadata.prototype.add = function(key, value) {
  106. key = normalizeKey(key);
  107. validate(key, value);
  108. if (!this._internal_repr[key]) {
  109. this._internal_repr[key] = [];
  110. }
  111. this._internal_repr[key].push(value);
  112. };
  113. /**
  114. * Remove the given key and any associated values. Normalizes the key.
  115. * @param {String} key The key to remove
  116. */
  117. Metadata.prototype.remove = function(key) {
  118. key = normalizeKey(key);
  119. if (Object.prototype.hasOwnProperty.call(this._internal_repr, key)) {
  120. delete this._internal_repr[key];
  121. }
  122. };
  123. /**
  124. * Gets a list of all values associated with the key. Normalizes the key.
  125. * @param {String} key The key to get
  126. * @return {Array.&lt;String|Buffer>} The values associated with that key
  127. */
  128. Metadata.prototype.get = function(key) {
  129. key = normalizeKey(key);
  130. if (Object.prototype.hasOwnProperty.call(this._internal_repr, key)) {
  131. return this._internal_repr[key];
  132. } else {
  133. return [];
  134. }
  135. };
  136. /**
  137. * Get a map of each key to a single associated value. This reflects the most
  138. * common way that people will want to see metadata.
  139. * @return {Object.&lt;String,String|Buffer>} A key/value mapping of the metadata
  140. */
  141. Metadata.prototype.getMap = function() {
  142. var result = {};
  143. _.forOwn(this._internal_repr, function(values, key) {
  144. if(values.length > 0) {
  145. result[key] = values[0];
  146. }
  147. });
  148. return result;
  149. };
  150. /**
  151. * Clone the metadata object.
  152. * @return {Metadata} The new cloned object
  153. */
  154. Metadata.prototype.clone = function() {
  155. var copy = new Metadata();
  156. _.forOwn(this._internal_repr, function(value, key) {
  157. copy._internal_repr[key] = _.clone(value);
  158. });
  159. return copy;
  160. };
  161. /**
  162. * Gets the metadata in the format used by interal code. Intended for internal
  163. * use only. API stability is not guaranteed.
  164. * @private
  165. * @return {Object.&lt;String, Array.&lt;String|Buffer>>} The metadata
  166. */
  167. Metadata.prototype._getCoreRepresentation = function() {
  168. return this._internal_repr;
  169. };
  170. /**
  171. * Creates a Metadata object from a metadata map in the internal format.
  172. * Intended for internal use only. API stability is not guaranteed.
  173. * @private
  174. * @param {Object.&lt;String, Array.&lt;String|Buffer>>} The metadata
  175. * @return {Metadata} The new Metadata object
  176. */
  177. Metadata._fromCoreRepresentation = function(metadata) {
  178. var newMetadata = new Metadata();
  179. if (metadata) {
  180. newMetadata._internal_repr = _.cloneDeep(metadata);
  181. }
  182. return newMetadata;
  183. };
  184. module.exports = Metadata;
  185. </code></pre>
  186. </article>
  187. </section>
  188. </div>
  189. <nav>
  190. <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-src_client.html">src/client</a></li><li><a href="module-src_common.html">src/common</a></li><li><a href="module-src_metadata.html">src/metadata</a></li><li><a href="module-src_server.html">src/server</a></li></ul><h3>Classes</h3><ul><li><a href="module-src_client.makeClientConstructor-Client.html">Client</a></li><li><a href="module-src_client-ClientDuplexStream.html">ClientDuplexStream</a></li><li><a href="module-src_client-ClientReadableStream.html">ClientReadableStream</a></li><li><a href="module-src_client-ClientWritableStream.html">ClientWritableStream</a></li><li><a href="module-src_metadata-Metadata.html">Metadata</a></li><li><a href="module-src_server-Server.html">Server</a></li><li><a href="module-src_server-ServerDuplexStream.html">ServerDuplexStream</a></li><li><a href="module-src_server-ServerReadableStream.html">ServerReadableStream</a></li><li><a href="module-src_server-ServerWritableStream.html">ServerWritableStream</a></li></ul><h3>Global</h3><ul><li><a href="global.html#callError">callError</a></li><li><a href="global.html#Credentials">Credentials</a></li><li><a href="global.html#getClientChannel">getClientChannel</a></li><li><a href="global.html#getGoogleAuthDelegate">getGoogleAuthDelegate</a></li><li><a href="global.html#load">load</a></li><li><a href="global.html#loadObject">loadObject</a></li><li><a href="global.html#makeGenericClientConstructor">makeGenericClientConstructor</a></li><li><a href="global.html#Metadata">Metadata</a></li><li><a href="global.html#propagate">propagate</a></li><li><a href="global.html#Server">Server</a></li><li><a href="global.html#ServerCredentials">ServerCredentials</a></li><li><a href="global.html#status">status</a></li><li><a href="global.html#waitForClientReady">waitForClientReady</a></li><li><a href="global.html#writeFlags">writeFlags</a></li></ul>
  191. </nav>
  192. <br class="clear">
  193. <footer>
  194. Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.3</a> on Thu Oct 29 2015 13:07:25 GMT-0700 (PDT)
  195. </footer>
  196. <script> prettyPrint(); </script>
  197. <script src="scripts/linenumber.js"> </script>
  198. </body>
  199. </html>