yoto-nodejs-client 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lib/cli-helpers.d.ts +32 -0
- package/bin/lib/cli-helpers.d.ts.map +1 -1
- package/bin/lib/token-helpers.d.ts +32 -0
- package/bin/lib/token-helpers.d.ts.map +1 -1
- package/index.d.ts +368 -0
- package/index.d.ts.map +1 -1
- package/lib/api-endpoints/auth.d.ts +85 -0
- package/lib/api-endpoints/auth.d.ts.map +1 -1
- package/lib/api-endpoints/constants.d.ts +22 -0
- package/lib/api-endpoints/constants.d.ts.map +1 -1
- package/lib/api-endpoints/content.d.ts +760 -0
- package/lib/api-endpoints/content.d.ts.map +1 -1
- package/lib/api-endpoints/devices.d.ts +581 -0
- package/lib/api-endpoints/devices.d.ts.map +1 -1
- package/lib/api-endpoints/family-library-groups.d.ts +187 -0
- package/lib/api-endpoints/family-library-groups.d.ts.map +1 -1
- package/lib/api-endpoints/family.d.ts +88 -0
- package/lib/api-endpoints/family.d.ts.map +1 -1
- package/lib/api-endpoints/helpers.d.ts +37 -3
- package/lib/api-endpoints/helpers.d.ts.map +1 -1
- package/lib/api-endpoints/icons.d.ts +196 -0
- package/lib/api-endpoints/icons.d.ts.map +1 -1
- package/lib/api-endpoints/media.d.ts +83 -0
- package/lib/api-endpoints/media.d.ts.map +1 -1
- package/lib/api-endpoints/test-helpers.d.ts +21 -0
- package/lib/api-endpoints/test-helpers.d.ts.map +1 -1
- package/lib/mqtt/client.d.ts +277 -0
- package/lib/mqtt/client.d.ts.map +1 -1
- package/lib/mqtt/commands.d.ts +195 -0
- package/lib/mqtt/commands.d.ts.map +1 -1
- package/lib/mqtt/factory.d.ts +43 -0
- package/lib/mqtt/factory.d.ts.map +1 -1
- package/lib/mqtt/topics.d.ts +157 -0
- package/lib/mqtt/topics.d.ts.map +1 -1
- package/lib/token.d.ts +88 -0
- package/lib/token.d.ts.map +1 -1
- package/package.json +1 -1
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.js"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redirects the user to Yoto's login page to begin the OAuth2 Authorization Code flow.
|
|
3
|
+
* @see https://yoto.dev/api/get-authorize/
|
|
4
|
+
* @param {object} options
|
|
5
|
+
* @param {string} [options.audience='https://api.yotoplay.com'] Audience for the token
|
|
6
|
+
* @param {string} [options.scope='openid profile offline_access'] Requested scopes
|
|
7
|
+
* @param {'code' | 'token' | 'id_token' | 'code token' | 'code id_token' | 'token id_token' | 'code token id_token'} options.responseType Required response type
|
|
8
|
+
* @param {string} options.clientId Required client ID
|
|
9
|
+
* @param {string} options.redirectUri Required redirect URI
|
|
10
|
+
* @param {string} options.state Required opaque value for preventing CSRF attacks
|
|
11
|
+
* @param {string} [options.nonce] String value to prevent replay attacks
|
|
12
|
+
* @param {'none' | 'login' | 'consent' | 'select_account'} [options.prompt] Authorization server prompt behavior
|
|
13
|
+
* @param {number} [options.maxAge] Maximum authentication age in seconds
|
|
14
|
+
* @param {string} [options.codeChallenge] PKCE code challenge
|
|
15
|
+
* @param {'S256' | 'plain'} [options.codeChallengeMethod] PKCE code challenge method
|
|
16
|
+
* @return {string} The authorization URL to redirect the user to
|
|
17
|
+
*/
|
|
1
18
|
export function getAuthorizeUrl({ audience, scope, responseType, clientId, redirectUri, state, nonce, prompt, maxAge, codeChallenge, codeChallengeMethod }: {
|
|
2
19
|
audience?: string | undefined;
|
|
3
20
|
scope?: string | undefined;
|
|
@@ -11,6 +28,35 @@ export function getAuthorizeUrl({ audience, scope, responseType, clientId, redir
|
|
|
11
28
|
codeChallenge?: string | undefined;
|
|
12
29
|
codeChallengeMethod?: "S256" | "plain" | undefined;
|
|
13
30
|
}): string;
|
|
31
|
+
/**
|
|
32
|
+
* @see https://yoto.dev/api/post-oauth-token/
|
|
33
|
+
* @typedef {Object} YotoTokenResponse
|
|
34
|
+
* @property {string} access_token
|
|
35
|
+
* @property {string} token_type
|
|
36
|
+
* @property {number} expires_in
|
|
37
|
+
* @property {string} [refresh_token]
|
|
38
|
+
* @property {string} [scope]
|
|
39
|
+
* @property {string} [id_token]
|
|
40
|
+
* @property {number} [expires_at]
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Exchange authorization code or refresh token for access tokens.
|
|
44
|
+
* @see https://yoto.dev/api/post-oauth-token/
|
|
45
|
+
* @param {object} options
|
|
46
|
+
* @param {'authorization_code' | 'refresh_token' | 'client_credentials' | 'urn:ietf:params:oauth:grant-type:device_code'} options.grantType Required grant type
|
|
47
|
+
* @param {string} [options.code] Authorization code (required for authorization_code grant)
|
|
48
|
+
* @param {string} [options.redirectUri] Redirect URI (required for authorization_code grant if used in authorize request)
|
|
49
|
+
* @param {string} [options.refreshToken] Refresh token (required for refresh_token grant)
|
|
50
|
+
* @param {string} [options.clientId] Client ID
|
|
51
|
+
* @param {string} [options.clientSecret] Client secret
|
|
52
|
+
* @param {string} [options.scope] Requested scope
|
|
53
|
+
* @param {string} [options.codeVerifier] PKCE code verifier (if code_challenge was used)
|
|
54
|
+
* @param {string} [options.deviceCode] Device code (required for device_code grant)
|
|
55
|
+
* @param {string} [options.audience='https://api.yotoplay.com'] Audience for the token
|
|
56
|
+
* @param {string} [options.userAgent] Optional user agent string
|
|
57
|
+
* @param {RequestOptions} [options.requestOptions] Additional undici request options
|
|
58
|
+
* @return {Promise<YotoTokenResponse>} Token response
|
|
59
|
+
*/
|
|
14
60
|
export function exchangeToken({ grantType, code, redirectUri, refreshToken, clientId, clientSecret, scope, codeVerifier, deviceCode, audience, userAgent, requestOptions }: {
|
|
15
61
|
grantType: "authorization_code" | "refresh_token" | "client_credentials" | "urn:ietf:params:oauth:grant-type:device_code";
|
|
16
62
|
code?: string | undefined;
|
|
@@ -27,6 +73,27 @@ export function exchangeToken({ grantType, code, redirectUri, refreshToken, clie
|
|
|
27
73
|
dispatcher?: import("undici").Dispatcher;
|
|
28
74
|
} & Omit<import("undici").Dispatcher.RequestOptions<unknown>, "origin" | "path" | "method"> & Partial<Pick<import("undici").Dispatcher.RequestOptions<null>, "method">>) | undefined;
|
|
29
75
|
}): Promise<YotoTokenResponse>;
|
|
76
|
+
/**
|
|
77
|
+
* @see https://yoto.dev/api/post-oauth-device-code/
|
|
78
|
+
* @typedef {Object} YotoDeviceCodeResponse
|
|
79
|
+
* @property {string} device_code - The device verification code
|
|
80
|
+
* @property {string} user_code - The code displayed to the user
|
|
81
|
+
* @property {string} verification_uri - The URL where the user should enter the user_code
|
|
82
|
+
* @property {string} [verification_uri_complete] - The verification URL with the code included
|
|
83
|
+
* @property {number} expires_in - The lifetime of the device code in seconds
|
|
84
|
+
* @property {number} interval - Minimum polling interval in seconds
|
|
85
|
+
*/
|
|
86
|
+
/**
|
|
87
|
+
* Start the OAuth2 Device Authorization flow for CLI/server-side applications.
|
|
88
|
+
* @see https://yoto.dev/api/post-oauth-device-code/
|
|
89
|
+
* @param {object} options
|
|
90
|
+
* @param {string} options.clientId Required client ID
|
|
91
|
+
* @param {string} [options.scope='openid profile offline_access'] Requested scopes
|
|
92
|
+
* @param {string} [options.audience='https://api.yotoplay.com'] Audience for the token
|
|
93
|
+
* @param {string} [options.userAgent] Optional user agent string
|
|
94
|
+
* @param {RequestOptions} [options.requestOptions] Additional undici request options
|
|
95
|
+
* @return {Promise<YotoDeviceCodeResponse>} Device code response with user_code and verification_uri
|
|
96
|
+
*/
|
|
30
97
|
export function requestDeviceCode({ clientId, scope, audience, userAgent, requestOptions }: {
|
|
31
98
|
clientId: string;
|
|
32
99
|
scope?: string | undefined;
|
|
@@ -46,11 +113,29 @@ export type YotoTokenResponse = {
|
|
|
46
113
|
expires_at?: number;
|
|
47
114
|
};
|
|
48
115
|
export type YotoDeviceCodeResponse = {
|
|
116
|
+
/**
|
|
117
|
+
* - The device verification code
|
|
118
|
+
*/
|
|
49
119
|
device_code: string;
|
|
120
|
+
/**
|
|
121
|
+
* - The code displayed to the user
|
|
122
|
+
*/
|
|
50
123
|
user_code: string;
|
|
124
|
+
/**
|
|
125
|
+
* - The URL where the user should enter the user_code
|
|
126
|
+
*/
|
|
51
127
|
verification_uri: string;
|
|
128
|
+
/**
|
|
129
|
+
* - The verification URL with the code included
|
|
130
|
+
*/
|
|
52
131
|
verification_uri_complete?: string;
|
|
132
|
+
/**
|
|
133
|
+
* - The lifetime of the device code in seconds
|
|
134
|
+
*/
|
|
53
135
|
expires_in: number;
|
|
136
|
+
/**
|
|
137
|
+
* - Minimum polling interval in seconds
|
|
138
|
+
*/
|
|
54
139
|
interval: number;
|
|
55
140
|
};
|
|
56
141
|
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["auth.js"],"names":[],"mappings":"AAWA;;;;;;;;;;;;;;;;GAgBG;AACH,4JAbG;IAA0B,QAAQ;IACR,KAAK;IAC6F,YAAY,EAA/H,MAAM,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,GAAG,eAAe,GAAG,gBAAgB,GAAG,qBAAqB;IACzF,QAAQ,EAAxB,MAAM;IACU,WAAW,EAA3B,MAAM;IACU,KAAK,EAArB,MAAM;IACW,KAAK;IACoC,MAAM;IAC/C,MAAM;IACN,aAAa;IACH,mBAAmB;CACvD,GAAS,MAAM,CA+BjB;AAED;;;;;;;;;;GAUG;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,4KAdG;IAAiI,SAAS,EAAjI,oBAAoB,GAAG,eAAe,GAAG,oBAAoB,GAAG,8CAA8C;IAC7F,IAAI;IACJ,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,YAAY;IACZ,KAAK;IACL,YAAY;IACZ,UAAU;IACV,QAAQ;IACR,SAAS;IACD,cAAc;;;CAChD,GAAS,OAAO,CAAC,iBAAiB,CAAC,CAoErC;AAED;;;;;;;;;GASG;AAEH;;;;;;;;;;GAUG;AACH,4FAPG;IAAyB,QAAQ,EAAxB,MAAM;IACW,KAAK;IACL,QAAQ;IACR,SAAS;IACD,cAAc;;;CAChD,GAAS,OAAO,CAAC,sBAAsB,CAAC,CA+B1C;;kBAlJa,MAAM;gBACN,MAAM;gBACN,MAAM;oBACN,MAAM;YACN,MAAM;eACN,MAAM;iBACN,MAAM;;;;;;iBA4FN,MAAM;;;;eACN,MAAM;;;;sBACN,MAAM;;;;gCACN,MAAM;;;;gBACN,MAAM;;;;cACN,MAAM"}
|
|
@@ -1,6 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default OAuth client ID for testing and development
|
|
3
|
+
* This is a public client ID provided by Yoto for development purposes
|
|
4
|
+
* @constant {string}
|
|
5
|
+
*/
|
|
1
6
|
export const DEFAULT_CLIENT_ID: "ix91Qy0B4uA8187JhI0tQbQQ5I5nUKYh";
|
|
7
|
+
/**
|
|
8
|
+
* Default OAuth audience for Yoto API
|
|
9
|
+
* @constant {string}
|
|
10
|
+
*/
|
|
2
11
|
export const DEFAULT_AUDIENCE: "https://api.yotoplay.com";
|
|
12
|
+
/**
|
|
13
|
+
* Default OAuth scope for Yoto API
|
|
14
|
+
* Includes OpenID Connect, profile information, and offline access (refresh tokens)
|
|
15
|
+
* @constant {string}
|
|
16
|
+
*/
|
|
3
17
|
export const DEFAULT_SCOPE: "openid profile offline_access";
|
|
18
|
+
/**
|
|
19
|
+
* Yoto API base URL
|
|
20
|
+
* @constant {string}
|
|
21
|
+
*/
|
|
4
22
|
export const YOTO_API_URL: "https://api.yotoplay.com";
|
|
23
|
+
/**
|
|
24
|
+
* Yoto login/authentication base URL
|
|
25
|
+
* @constant {string}
|
|
26
|
+
*/
|
|
5
27
|
export const YOTO_LOGIN_URL: "https://login.yotoplay.com";
|
|
6
28
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["constants.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["constants.js"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,gCAAiC,kCAAkC,CAAA;AAEnE;;;GAGG;AACH,+BAAgC,0BAA0B,CAAA;AAE1D;;;;GAIG;AACH,4BAA6B,+BAA+B,CAAA;AAE5D;;;GAGG;AACH,2BAA4B,0BAA0B,CAAA;AAEtD;;;GAGG;AACH,6BAA8B,4BAA4B,CAAA"}
|