mirror of https://github.com/dapr/docs.git
				
				
				
			Merge branch 'v1.0' into add/php
This commit is contained in:
		
						commit
						a908b210b1
					
				|  | @ -0,0 +1 @@ | |||
| // Intentionally blank
 | ||||
|  | @ -1,14 +1,53 @@ | |||
| // Code formatting. | ||||
| 
 | ||||
| .copy-code-button { | ||||
|     color: #272822; | ||||
|     background-color: #FFF; | ||||
|     border-color: #0D2192; | ||||
|     border: 2px solid; | ||||
|     border-radius: 3px 3px 0px 0px; | ||||
| 
 | ||||
|     /* right-align */ | ||||
|     display: block; | ||||
|     margin-left: auto; | ||||
|     margin-right: 0; | ||||
| 
 | ||||
|     margin-bottom: -2px; | ||||
|     padding: 3px 8px; | ||||
|     font-size: 0.8em; | ||||
| } | ||||
| 
 | ||||
| .copy-code-button:hover { | ||||
|     cursor: pointer; | ||||
|     background-color: #F2F2F2; | ||||
| } | ||||
| 
 | ||||
| .copy-code-button:focus { | ||||
|     /* Avoid an ugly focus outline on click in Chrome, | ||||
|        but darken the button for accessibility. | ||||
|        See https://stackoverflow.com/a/25298082/1481479 */ | ||||
|     background-color: #E6E6E6; | ||||
|     outline: 0; | ||||
| } | ||||
| 
 | ||||
| .copy-code-button:active { | ||||
|     background-color: #D9D9D9; | ||||
| } | ||||
| 
 | ||||
| .highlight pre { | ||||
|     /* Avoid pushing up the copy buttons. */ | ||||
|     margin: 0; | ||||
| } | ||||
| 
 | ||||
| .td-content { | ||||
| 	// Highlighted code. | ||||
|     .highlight { | ||||
|         @extend .card; | ||||
| 	 | ||||
|         margin: 2rem 0; | ||||
|         padding: 0; | ||||
|         margin: 0rem 0; | ||||
|         padding: 0rem; | ||||
| 
 | ||||
|         max-width: 80%; | ||||
|         max-width: 100%; | ||||
| 	     | ||||
|         pre { | ||||
|             margin: 0; | ||||
|  | @ -37,7 +76,8 @@ | |||
|         word-wrap: normal; | ||||
|         background-color: $gray-100; | ||||
|         padding: $spacer; | ||||
|       | ||||
|      | ||||
|         max-width: 100%; | ||||
| 
 | ||||
|         > code { | ||||
| 	    background-color: inherit !important; | ||||
|  |  | |||
|  | @ -52,25 +52,25 @@ id = "UA-149338238-3" | |||
| 
 | ||||
| # Top Nav Bar | ||||
| [[menu.main]] | ||||
|     name = "Home" | ||||
|     name = "Homepage" | ||||
|     weight = 40 | ||||
|     url = "https://dapr.io" | ||||
| [[menu.main]] | ||||
|     name = "About" | ||||
|     name = "GitHub" | ||||
|     weight = 50 | ||||
|     url = "https://dapr.io/#about" | ||||
| [[menu.main]] | ||||
|     name = "Download" | ||||
|     weight = 60 | ||||
|     url = "https://dapr.io/#download" | ||||
|     url = "https://github.com/dapr" | ||||
| [[menu.main]] | ||||
|     name = "Blog" | ||||
|     weight = 70 | ||||
|     weight = 60 | ||||
|     url = "https://blog.dapr.io/posts" | ||||
| [[menu.main]] | ||||
|     name = "Discord" | ||||
|     weight = 70 | ||||
|     url = "https://aka.ms/dapr-discord" | ||||
| [[menu.main]] | ||||
|     name = "Community" | ||||
|     weight = 80 | ||||
|     url = "https://dapr.io/#community" | ||||
|     url = "https://github.com/dapr/community/blob/master/README.md" | ||||
| 
 | ||||
| [params] | ||||
| copyright = "Dapr" | ||||
|  |  | |||
|  | @ -87,6 +87,8 @@ Dapr can be used from  any developer framework. Here are some that have been int | |||
|   | ||||
| Dapr integrates easily with Python [Flask](https://pypi.org/project/Flask/) and node [Express](http://expressjs.com/). See examples in the [Dapr quickstarts](https://github.com/dapr/quickstarts). | ||||
| 
 | ||||
| In the Dapr [PHP-SDK](https://github.com/dapr/php-sdk) you can serve with Apache, Nginx, or Caddyserver. | ||||
| 
 | ||||
| #### Actors | ||||
| Dapr SDKs support for [virtual actors]({{< ref actors >}}) which are stateful objects that make concurrency simple, have method and state encapsulation, and are designed for scalable, distributed applications. | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,4 +6,4 @@ weight: 60 | |||
| description: See and measure the message calls across components and networked services | ||||
| --- | ||||
| 
 | ||||
| This section includes guides for developers in the context of observability. See other sections for a [general overview of the observability concept]({{< ref observability >}}) in Dapr and for [operations guidance on monitoring]({{< ref monitoring >}}). | ||||
| This section includes guides for developers in the context of observability. See other sections for a [general overview of the observability concept]({{< ref observability-concept >}}) in Dapr and for [operations guidance on monitoring]({{< ref monitoring >}}). | ||||
|  |  | |||
|  | @ -23,9 +23,44 @@ Let's get started! | |||
| 
 | ||||
| ## Add Dapr as an 'External Tool' | ||||
| 
 | ||||
| First, quit IntelliJ. | ||||
| First, quit IntelliJ before modifying the configurations file directly. | ||||
| 
 | ||||
| Create or edit the file in `$HOME/.IdeaIC2019.3/config/tools/External\ Tools.xml` (change IntelliJ version in path if needed) to add a new `<tool></tool>` entry: | ||||
| ### IntelliJ configuration file location | ||||
| For versions [2020.1](https://www.jetbrains.com/help/idea/2020.1/tuning-the-ide.html#config-directory) and above the configuration files for tools should be located in: | ||||
| 
 | ||||
| {{< tabs Windows Linux  MacOS >}} | ||||
| 
 | ||||
| {{% codetab %}} | ||||
| 
 | ||||
| ```powershell | ||||
| %USERPROFILE%\AppData\Roaming\JetBrains\IntelliJIdea2020.1\tools\ | ||||
| ```  | ||||
| {{% /codetab %}} | ||||
| 
 | ||||
| 
 | ||||
| {{% codetab %}} | ||||
|  ```shell | ||||
|  $HOME/.config/JetBrains/IntelliJIdea2020.1/tools/ | ||||
|  ``` | ||||
| {{% /codetab %}} | ||||
| 
 | ||||
| 
 | ||||
| {{% codetab %}} | ||||
| ```shell | ||||
| ~/Library/Application Support/JetBrains/IntelliJIdea2020.1/tools/ | ||||
| ```  | ||||
| {{% /codetab %}} | ||||
| 
 | ||||
| 
 | ||||
| {{< /tabs >}} | ||||
| 
 | ||||
| > The configuration file location is different for version 2019.3 or prior. See [here](https://www.jetbrains.com/help/idea/2019.3/tuning-the-ide.html#config-directory) for more details. | ||||
| 
 | ||||
| Change the version of IntelliJ in the path if needed. | ||||
| 
 | ||||
| Create or edit the file in `<CONFIG PATH>/tools/External\ Tools.xml` (change IntelliJ version in path if needed). The `<CONFIG PATH>` is OS dependennt as seen above. | ||||
| 
 | ||||
| Add a new `<tool></tool>` entry: | ||||
| 
 | ||||
| ```xml | ||||
| <toolSet name="External Tools"> | ||||
|  | @ -33,10 +68,10 @@ Create or edit the file in `$HOME/.IdeaIC2019.3/config/tools/External\ Tools.xml | |||
|   <!-- 1. Each tool has its own app-id, so create one per application to be debugged --> | ||||
|   <tool name="dapr for DemoService in examples" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true"> | ||||
|     <exec> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/local/bin/daprd --> | ||||
|       <option name="COMMAND" value="C:\dapr\daprd.exe" /> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/local/bin/dapr --> | ||||
|       <option name="COMMAND" value="C:\dapr\dapr.exe" /> | ||||
|       <!-- 3. Choose app, http and grpc ports that do not conflict with other daprd command entries (placement address should not change). --> | ||||
|       <option name="PARAMETERS" value="-app-id demoservice -app-port 3000 -dapr-http-port 3005 -dapr-grpc-port 52000 -placement-host-address localhost:50005" /> | ||||
|       <option name="PARAMETERS" value="run -app-id demoservice -app-port 3000 -dapr-http-port 3005 -dapr-grpc-port 52000 /> | ||||
|       <!-- 4. Use the folder where the `components` folder is located --> | ||||
|       <option name="WORKING_DIRECTORY" value="C:/Code/dapr/java-sdk/examples" /> | ||||
|     </exec> | ||||
|  | @ -53,7 +88,7 @@ Optionally, you may also create a new entry for a sidecar tool that can be reuse | |||
|   <!-- 1. Reusable entry for apps with app port. --> | ||||
|   <tool name="dapr with app-port" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true"> | ||||
|     <exec> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/bin/dapr --> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/local/bin/dapr --> | ||||
|       <option name="COMMAND" value="c:\dapr\dapr.exe" /> | ||||
|       <!-- 3. Prompts user 4 times (in order): app id, app port, Dapr's http port, Dapr's grpc port. --> | ||||
|       <option name="PARAMETERS" value="run --app-id $Prompt$ --app-port $Prompt$ --dapr-http-port $Prompt$ --dapr-grpc-port $Prompt$" /> | ||||
|  | @ -64,7 +99,7 @@ Optionally, you may also create a new entry for a sidecar tool that can be reuse | |||
|   <!-- 1. Reusable entry for apps without app port. --> | ||||
|   <tool name="dapr without app-port" description="Dapr sidecar" showInMainMenu="false" showInEditor="false" showInProject="false" showInSearchPopup="false" disabled="false" useConsole="true" showConsoleOnStdOut="true" showConsoleOnStdErr="true" synchronizeAfterRun="true"> | ||||
|     <exec> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/bin/dapr --> | ||||
|       <!-- 2. For Linux or MacOS use: /usr/local/bin/dapr --> | ||||
|       <option name="COMMAND" value="c:\dapr\dapr.exe" /> | ||||
|       <!-- 3. Prompts user 3 times (in order): app id, Dapr's http port, Dapr's grpc port. --> | ||||
|       <option name="PARAMETERS" value="run --app-id $Prompt$ --dapr-http-port $Prompt$ --dapr-grpc-port $Prompt$" /> | ||||
|  | @ -108,3 +143,7 @@ After debugging, make sure you stop both `dapr` and your app in IntelliJ. | |||
| >Note: Since you launched the service(s) using the **dapr** ***run*** CLI command, the **dapr** ***list*** command will show runs from IntelliJ in the list of apps that are currently running with Dapr. | ||||
| 
 | ||||
| Happy debugging! | ||||
| 
 | ||||
| ## Related links | ||||
| 
 | ||||
| - [Change](https://intellij-support.jetbrains.com/hc/en-us/articles/206544519-Directories-used-by-the-IDE-to-store-settings-caches-plugins-and-logs) in IntelliJ configuration directory location | ||||
|  |  | |||
|  | @ -28,6 +28,12 @@ no_list: true | |||
| | [Twitter]({{< ref twitter.md >}})       | ✅ | ✅ | Alpha | | ||||
| | [SendGrid]({{< ref sendgrid.md >}})       |    | ✅ | Alpha | | ||||
| 
 | ||||
| ### Alibaba Cloud | ||||
| 
 | ||||
| | Name | Input<br>Binding | Output<br>Binding | Status | | ||||
| |------|:----------------:|:-----------------:|--------| | ||||
| | [Alibaba Cloud OSS]({{< ref alicloudoss.md >}})           |    | ✅ | Alpha | | ||||
| 
 | ||||
| ### Amazon Web Services (AWS) | ||||
| 
 | ||||
| | Name | Input<br>Binding | Output<br>Binding | Status | | ||||
|  |  | |||
|  | @ -0,0 +1,106 @@ | |||
| --- | ||||
| type: docs | ||||
| title: "Alibaba Cloud Object Storage Service binding spec" | ||||
| linkTitle: "Alibaba Cloud Object Storage" | ||||
| description: "Detailed documentation on the Alibaba Cloud Object Storage binding component" | ||||
| --- | ||||
| 
 | ||||
| ## Component format | ||||
| 
 | ||||
| To setup an Alibaba Cloud Object Storage binding create a component of type `bindings.alicloud.oss`. See [this guide]({{< ref "howto-bindings.md#1-create-a-binding" >}}) on how to create and apply a secretstore configuration. See this guide on [referencing secrets]({{< ref component-secrets.md >}}) to retrieve and use the secret with Dapr components. | ||||
| 
 | ||||
| ```yaml | ||||
| apiVersion: dapr.io/v1alpha1 | ||||
| kind: Component | ||||
| metadata: | ||||
|   name: alicloudobjectstorage | ||||
|   namespace: default | ||||
| spec: | ||||
|   type: bindings.alicloud.oss | ||||
|   version: v1 | ||||
|   metadata: | ||||
|   - name: endpoint | ||||
|     value: "[endpoint]" | ||||
|   - name: accessKeyID | ||||
|     value: "[key-id]" | ||||
|   - name: accessKey | ||||
|     value: "[access-key]" | ||||
|   - name: bucket | ||||
|     value: "[bucket]" | ||||
| ``` | ||||
| 
 | ||||
| {{% alert title="Warning" color="warning" %}} | ||||
| The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). | ||||
| {{% /alert %}} | ||||
| 
 | ||||
| ## Spec metadata fields | ||||
| 
 | ||||
| | Field         | Required | Details | Example | | ||||
| |---------------|----------|---------|---------| | ||||
| | `endpoint`    | Y | Alicloud OSS endpoint. | https://oss-cn-hangzhou.aliyuncs.com | ||||
| | `accessKeyID` | Y | Access key ID credential. | | ||||
| | `accessKey`   | Y | Access key credential. | | ||||
| | `bucket`      | Y | Name of the storage bucket. | | ||||
| 
 | ||||
| ## Output operations | ||||
| 
 | ||||
| The following operations are supported as within the output binding: | ||||
| 
 | ||||
| ### Create object | ||||
| 
 | ||||
| To perform a create object operation, invoke the binding with a `POST` method and the following JSON body: | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|   "operation": "create", | ||||
|   "data": "YOUR_CONTENT" | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| {{% alert title="Note" color="primary" %}} | ||||
| By default, a random UUID is auto-generated as the object key. See below for Metadata support to set the key for the object. | ||||
| {{% /alert %}} | ||||
| 
 | ||||
| #### Example | ||||
| 
 | ||||
| **Saving to a random generated UUID file** | ||||
| 
 | ||||
| ```bash | ||||
| curl -d "{ \"operation\": \"create\", \"data\": \"Hello World\" }" http://localhost:<dapr-port>/v1.0/bindings/<binding-name> | ||||
| ``` | ||||
| 
 | ||||
| <br /> | ||||
| 
 | ||||
| **Saving to a specific file** | ||||
| 
 | ||||
| ```bash | ||||
| curl -d "{ \"operation\": \"create\", \"data\": \"Hello World\", \"metadata\": { \"key\": \"my-key\" } }" http://localhost:<dapr-port>/v1.0/bindings/<binding-name> | ||||
| ``` | ||||
| 
 | ||||
| {{% alert title="Note" color="primary" %}} | ||||
| Windows CMD requires escaping the `"` character. | ||||
| {{% /alert %}} | ||||
| 
 | ||||
| ## Metadata information | ||||
| 
 | ||||
| ### Object key | ||||
| 
 | ||||
| By default, the Alicloud OSS output binding will auto-generate a UUID as the object key. | ||||
| You can set the key with the following metadata: | ||||
| 
 | ||||
| ```json | ||||
| { | ||||
|     "data": "file content", | ||||
|     "metadata": { | ||||
|         "key": "my-key" | ||||
|     }, | ||||
|     "operation": "create" | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ## Related links | ||||
| 
 | ||||
| - [Bindings building block]({{< ref bindings >}}) | ||||
| - [How-To: Trigger application with input binding]({{< ref howto-triggers.md >}}) | ||||
| - [How-To: Use bindings to interface with external resources]({{< ref howto-bindings.md >}}) | ||||
| - [Bindings API reference]({{< ref bindings_api.md >}}) | ||||
|  | @ -30,12 +30,22 @@ spec: | |||
|     value: topic3 | ||||
|   - name: authRequired # Required. default: "true" | ||||
|     value: "false" | ||||
|    - name: saslUsername # Optional. | ||||
|   - name: saslUsername # Optional. | ||||
|     value: "user" | ||||
|    - name: saslPassword # Optional. | ||||
|   - name: saslPassword # Optional. | ||||
|     value: "password" | ||||
|   - name: maxMessageBytes # Optional. | ||||
|     value: 1024 | ||||
| ``` | ||||
| 
 | ||||
| - `topics` is a comma separated string of topics for an input binding. | ||||
| - `brokers` is a comma separated string of kafka brokers. | ||||
| - `consumerGroup` is a kafka consumer group to listen on. | ||||
| - `publishTopic` is the topic to publish for an output binding. | ||||
| - `authRequired` determines whether to use SASL authentication or not. | ||||
| - `saslUsername` is the SASL username for authentication. Only used if `authRequired` is set to - `"true"`. | ||||
| - `maxMessageBytes` is the maximum message size allowed for a single Kafka message. Default is 1024. | ||||
| 
 | ||||
| {{% alert title="Warning" color="warning" %}} | ||||
| The above example uses secrets as plain strings. It is recommended to use a secret store for the secrets as described [here]({{< ref component-secrets.md >}}). | ||||
| {{% /alert %}} | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ spec: | |||
|       value: "adminuser" | ||||
|     - name: saslPassword | ||||
|       value: "KeFg23!" | ||||
|     - name: maxMessageBytes | ||||
|       value: 1024 | ||||
| ``` | ||||
| 
 | ||||
| {{% alert title="Warning" color="warning" %}} | ||||
|  | @ -42,7 +44,27 @@ The above example uses secrets as plain strings. It is recommended to use a secr | |||
| | authRequired        | N  | Enable authentication on the Kafka broker. Defaults to `"false"`.   |`"true"`, `"false"` | ||||
| | saslUsername        | N  | Username used for authentication. Only required if authRequired is set to true.   | `"adminuser"` | ||||
| | saslPassword        | N  | Password used for authentication. Can be `secretKeyRef` to use a secret reference. Only required if authRequired is set to true. Can be `secretKeyRef` to use a [secret reference]({{< ref component-secrets.md >}})  |  `""`, `"KeFg23!"` | ||||
| | maxMessageBytes | N  | The maximum message size allowed for a single Kafka message. Default is 1024. | `2048` | ||||
| 
 | ||||
| ## Per-call metadata fields | ||||
| 
 | ||||
| ### Partition Key | ||||
| 
 | ||||
| When invoking the Kafka pub/sub, its possible to provide an optional partition key by using the `metadata` query param in the request url. | ||||
| 
 | ||||
| The param name is `partitionKey`. | ||||
| 
 | ||||
| Example: | ||||
| 
 | ||||
| ```shell | ||||
| curl -X POST http://localhost:3500/v1.0/publish/myKafka/myTopic?metadata.partitionKey=key1 \ | ||||
|   -H "Content-Type: application/json" \ | ||||
|   -d '{ | ||||
|         "data": { | ||||
|           "message": "Hi" | ||||
|         } | ||||
|       }' | ||||
| ``` | ||||
| 
 | ||||
| ## Create a Kafka instance | ||||
| {{< tabs "Self-Hosted" "Kubernetes">}} | ||||
|  |  | |||
|  | @ -0,0 +1,51 @@ | |||
| --- | ||||
| type: docs | ||||
| title: "How-To: Handle large http body requests" | ||||
| linkTitle: "Http request body size" | ||||
| weight: 6000 | ||||
| description: "Configure http requests that are bigger than 4 MB" | ||||
| --- | ||||
| 
 | ||||
| By default Dapr has a limit for the request body size which is set to 4 MB, however you can change this by defining `dapr.io/http-max-request-size` annotation or `--dapr-http-max-request-size` flag. | ||||
| 
 | ||||
| 
 | ||||
| ### Self hosted | ||||
| 
 | ||||
| When running in self hosted mode, use the `--dapr-http-max-request-size` flag to configure Dapr to use non-default request body size: | ||||
| 
 | ||||
| ```bash | ||||
| dapr run --dapr-http-max-request-size 16 node app.js | ||||
| ``` | ||||
| This tells Dapr to set maximum request body size to `16` MB. | ||||
| 
 | ||||
| 
 | ||||
| ### Kubernetes | ||||
| 
 | ||||
| On Kubernetes, set the following annotations in your deployment YAML: | ||||
| ```yaml | ||||
| apiVersion: apps/v1 | ||||
| kind: Deployment | ||||
| metadata: | ||||
|   name: myapp | ||||
|   namespace: default | ||||
|   labels: | ||||
|     app: myapp | ||||
| spec: | ||||
|   replicas: 1 | ||||
|   selector: | ||||
|     matchLabels: | ||||
|       app: myapp | ||||
|   template: | ||||
|     metadata: | ||||
|       labels: | ||||
|         app: myapp | ||||
|       annotations: | ||||
|         dapr.io/enabled: "true" | ||||
|         dapr.io/app-id: "myapp" | ||||
|         dapr.io/app-port: "8000" | ||||
|         dapr.io/http-max-request-size: "16" | ||||
| ... | ||||
| ``` | ||||
| 
 | ||||
| ## Related links | ||||
| - [Dapr Kubernetes pod annotations spec]({{< ref kubernetes-annotations.md >}}) | ||||
|  | @ -14,4 +14,6 @@ | |||
|     debug: false, | ||||
|   }); | ||||
| </script> | ||||
| {{ end }} | ||||
| {{ end }} | ||||
| 
 | ||||
| <script src="/js/copy-code-button.js"></script> | ||||
|  | @ -0,0 +1,49 @@ | |||
| function addCopyButtons(clipboard) { | ||||
|     document.querySelectorAll('pre > code').forEach(function(codeBlock) { | ||||
|         var button = document.createElement('button'); | ||||
|         button.className = 'copy-code-button'; | ||||
|         button.type = 'button'; | ||||
|         button.innerText = 'Copy'; | ||||
| 
 | ||||
|         button.addEventListener('click', function() { | ||||
|             clipboard.writeText(codeBlock.textContent).then( | ||||
|                 function() { | ||||
|                     button.blur(); | ||||
| 
 | ||||
|                     button.innerText = 'Copied!'; | ||||
|                     setTimeout(function() { | ||||
|                         button.innerText = 'Copy'; | ||||
|                     }, 2000); | ||||
|                 }, | ||||
|                 function(error) { | ||||
|                     button.innerText = 'Error'; | ||||
|                     console.error(error); | ||||
|                 } | ||||
|             ); | ||||
|         }); | ||||
| 
 | ||||
|         var pre = codeBlock.parentNode; | ||||
|         if (pre.parentNode.classList.contains('highlight')) { | ||||
|             var highlight = pre.parentNode; | ||||
|             highlight.parentNode.insertBefore(button, highlight); | ||||
|         } else { | ||||
|             pre.parentNode.insertBefore(button, pre); | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| 
 | ||||
| if (navigator && navigator.clipboard) { | ||||
|     addCopyButtons(navigator.clipboard); | ||||
| } else { | ||||
|     var script = document.createElement('script'); | ||||
|     script.src = | ||||
|         'https://cdnjs.cloudflare.com/ajax/libs/clipboard-polyfill/2.7.0/clipboard-polyfill.promise.js'; | ||||
|     script.integrity = 'sha256-waClS2re9NUbXRsryKoof+F9qc1gjjIhc2eT7ZbIv94='; | ||||
|     script.crossOrigin = 'anonymous'; | ||||
| 
 | ||||
|     script.onload = function() { | ||||
|         addCopyButtons(clipboard); | ||||
|     }; | ||||
| 
 | ||||
|     document.body.appendChild(script); | ||||
| } | ||||
		Loading…
	
		Reference in New Issue