Security News
Input Validation Vulnerabilities Dominate MITRE's 2024 CWE Top 25 List
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
@jargon/sdk-core
Advanced tools
@jargon/sdk-core
Jargon's SDK core package contains functionality common to multiple voice platforms and frameworks.
Content resources define the text that may vary across user locales.
Resource files are JSON, with a single top-level object (similar to package.json). The keys within that object are the identifiers you'll use to refer to specific resources within your source code. Nested objects are supported to help you organize your resources.
{
"key1":"Text for key 1",
"key2":"Text for key 2",
"nestedObjects":{
"are":{
"supported":"Use the key 'nestedObjects.are.supported' to refer to this resource"
}
}
}
Resource values are in ICU MessageFormat. This format supports constructing text at runtime based on parameters passed in from your code, and selecting alternative forms to handle things like pluralization and gender.
{
"sayHello":"Hello {name}"
}
{
"itemCount":"{count, plural, =0 {You have zero items} =1 {You have one item} other {You have # items}}"
}
{
"pronounSelection":"{gender, select, female {She did it!} male {He did it!} other {It did it!}"
}
Resources can have multiple variations. Variations are defined using nested objects:
{
"resourceWithVariations":{
"v1":"First variation",
"v2":"Second variation",
"v3":"Third variation"
}
}
When rendering the key resourceWithVariations
the ResourceManager
will choose a variation at random (with other more complex
methods coming in future versions). If you render the same resource multiple times within a single request (e.g., for spoken
content and for card or screen content) the ResourceManager
will by default consistently choose the same variation.
Note that you can always select a specific variation using its fully-qualified key (e.g., resourceWithVariations.v1
)
You can determine which variation the was choses via the ResourceManager's selectedVariation(s) routines.
ResourceManager
allows clients to access content resources stored in locale-specifc
files, and to render those resources at runtime, substituting parameters.
A ResourceManager
instance is meant to live only for the lifetime of a single request, and is bound
to a specific locale. Instances are created via a ResourceManagerFactory
instance, normally DefaultResourceManagerFactory
.
Resource files live in "resources" subdirectory of the process's runtime directory; this will soon be customizeable via
ResourceManagerOptions
.
A RenderItem specifies a resource key, optional parameters, and options to control details of the rendering (which are themselves optional).
interface RenderItem {
/** The resource key to render */
key: string
/** Params to use during rendering (optional) */
params?: RenderParams
/** Render options (optional) */
options?: RenderOptions
}
RenderParams
are a map from parameter name to a string, number, or RenderItem
instance.
interface RenderParams {
[param: string]: string | number | RenderItem
}
The use of a RenderItem
instance as a parameter value makes it easy to compose multiple
resource together at runtime. This is useful when a parameter value varies across locales,
or when you want the SDK to select across multiple variations for a parameter value, and reduces
the need to chain together multiple calls into the ResourceManager
.
The ri
helper function simplifies constructing a RenderItem
:
function ri (key: string, params?: RenderParams, options?: RenderOptions): RenderItem
rm.render(ri('sayHello', { 'name': 'World' }))
RenderOptions
allows fine-grained control of rendering behavior for a specific call, overriding
the configuration set at the ResourceManager
level.
interface RenderOptions {
/** When true, forces the use of a new random value for selecting variations,
* overriding consistentRandom
*/
readonly forceNewRandom?: boolean
}
ResourceManager
is the core interface for rendering locale-specific content at runtime.
export interface ResourceManager {
/** Renders a string in the current locale
* @param {RenderItem} item The item to render
* @returns {Promise<string>} A promise to the rendered string
*/
render (item: RenderItem): Promise<string>
/** Renders multiple item
* @param {RenderItem[]} items The items to render
* @returns {Promise<string[]} A promise to the rendered strings
*/
renderBatch (items: RenderItem[]): Promise<string[]>
/** Renders an object in the current locale. This also supports returning
* strings, numbers, or booleans
* @param {RenderItem} item The item to render
* @returns {Promise<T>} A promise to the rendered object
*/
renderObject<T> (item: RenderItem): Promise<T>
/** Retrieves information about the selected variant for a rendered item. This
* will only return a result when rendering the item required a variation
* selection. If item has been used for multiple calls to a render routine
* the result of the first operation will be returned; use selectedVariations
* to see all results.
* @param {RenderItem} item The item to retrieve the selected variant for
* @return {Promise<SelectedVariation>} A promise to the selected variation
*/
selectedVariation (item: RenderItem): Promise<SelectedVariation>
/** Retrieves information about all selected variations for rendered item. This
* will only return a result for items that required a variation selection
* during rendering. Results are ordered by the ordering of the calls to render
* routines.
* @return {Promise<SelectedVariation[]>} A promise to the selected variations
*/
selectedVariations (): Promise<SelectedVariation[]>
/** The locale the resource manager uses */
readonly locale: string
}
Note that the render routines return Promise
s to the rendered content, not the content directly.
A ResourceManagerFactory
construct locale-specific ResourceManager
instance.
export interface ResourceManagerFactory {
/** Constructs a ResourceManager for the specified locale
* @param {string} locale
*/
forLocale (locale: string): ResourceManager
}
Locales name use the standard BCP-47 tags, such as 'en-US' or 'de-DE'.
Options for controlling resource manager functionality. Defaults are specified in DefaultResourceManagerOptions
.
export interface ResourceManagerOptions {
/** When true (default), the resource manager will use the same random value
* when randomly selecting among variations; this ensures that calls to different routines
* (speak, reprompt, etc.) with identical RenderItem inputs will render the same output.
* When false, each render call will use a different random value, leading to possible
* inconsistencies in the final response. Note that this option can be overridden via
* a RenderItem option.
*/
consistentRandom?: boolean
/** Resource files for the provided locales will be loaded during initialization instead
* of on first use; default is none.
*/
localesToPreload?: string[]
/** When true (default), the resource manager will keep track of which variation it selected,
* allowing clients to view those selections through a call to selectedVariation(s)
*/
trackSelectedVariations?: boolean
}
export const DefaultResourceManagerOptions: Required<ResourceManagerOptions> = {
consistentRandom: true,
localesToPreload: [],
trackSelectedVariations: true
}
Options for controlling rendering behavior, overriding the ResourceManager
s configuration.
Defaults are specified in DefaultRenderOptions
.
/**
* Options control additional rendering behavior, overridding the
* settings configured at the ResourceManager level.
*/
export interface RenderOptions {
/** When true, forces the use of a new random value for selecting variations,
* overriding consistentRandom
*/
readonly forceNewRandom?: boolean
}
export const DefaultRenderOptions: RenderOptions = {
forceNewRandom: false
}
const sdkCore = require('@jargon/sdk-core');
const options = {}
const resourceManagerFactory = new sdkCore.DefaultResourceManagerFactory(options)
const resourceManager = resourceManagerFactory.forLocale('en-US')
const contentPromise = resourceManager.render(sdkCore.ri('sayHello', { 'name': 'World' }))
FAQs
Core components of Jargon's NodeJS SDK
The npm package @jargon/sdk-core receives a total of 3 weekly downloads. As such, @jargon/sdk-core popularity was classified as not popular.
We found that @jargon/sdk-core demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.